559
AWS Lambda 開発者ガイド

AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

  • Upload
    dangbao

  • View
    569

  • Download
    37

Embed Size (px)

Citation preview

Page 1: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda開発者ガイド

Page 2: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

AWS Lambda: 開発者ガイドCopyright © 2018 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's, in any mannerthat is likely to cause confusion among customers, or in any manner that disparages or discredits Amazon. All other trademarks notowned by Amazon are the property of their respective owners, who may or may not be affiliated with, connected to, or sponsored byAmazon.

Page 3: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

Table of ContentsAWS Lambda とは ............................................................................................................................. 1

Lambda が適している用途 ........................................................................................................... 1AWS Lambda を初めてお使いになる方向けの情報 ........................................................................... 2

はじめに ............................................................................................................................................ 3Lambda ベースのアプリケーションの構成要素 ............................................................................... 3Lambda ベースのアプリケーションを作成およびテストするためのツール ........................................... 3開始する前に ............................................................................................................................. 3

次のステップ ..................................................................................................................... 4AWS アカウントのセットアップ ................................................................................................... 4

AWS アカウントのセットアップと管理者ユーザーの作成 ......................................................... 4AWS CLI のセットアップ ............................................................................................................ 6

次のステップ ..................................................................................................................... 7SAM Local のインストール .......................................................................................................... 7

Docker のインストール ....................................................................................................... 7SAM Local のインストール .................................................................................................. 8

シンプルな Lambda 関数を作成してコンソールを探る ..................................................................... 8使用開始の準備 .................................................................................................................. 8シンプルな Lambda 関数を作成する ...................................................................................... 9

Lambda 関数 .................................................................................................................................... 16Lambda 関数のビルド ............................................................................................................... 16

Lambda 関数のコードを作成する ........................................................................................ 16コードをデプロイして Lambda 関数を作成する ..................................................................... 17モニタリングとトラブルシューティング ............................................................................... 18AWS Lambda ベースアプリケーションの例 .......................................................................... 19関連トピック .................................................................................................................... 19プログラミングモデル ....................................................................................................... 19デプロイパッケージの作成 ................................................................................................. 85SAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする ..................... 106AWS Lambda コンソールエディタを使用した関数の作成 ...................................................... 113

Lambda 関数の設定 ................................................................................................................. 139Lambda 関数からのリソースへのアクセス .................................................................................. 140

AWS サービスへのアクセス .............................................................................................. 140AWS 以外のサービスへのアクセス .................................................................................... 140プライベートサービスまたはリソースへのアクセス .............................................................. 141VPC サポート ................................................................................................................. 141

AWS Lambda 実行モデル ......................................................................................................... 152Lambda 関数の呼び出し ................................................................................................................... 154

例 1 ...................................................................................................................................... 155例 2 ...................................................................................................................................... 155呼び出しタイプ ....................................................................................................................... 156

イベントソースマッピング ................................................................................................ 157再試行動作について ................................................................................................................. 160スケーリング動作について ........................................................................................................ 161

同時実行リクエスト率 ...................................................................................................... 162スケーリング .................................................................................................................. 162

サポートされているイベントソース ........................................................................................... 163Amazon S3 .................................................................................................................... 164Amazon DynamoDB ........................................................................................................ 164Amazon Kinesis Data Streams .......................................................................................... 165Amazon Simple Notification Service ................................................................................... 165Amazon Simple Email Service .......................................................................................... 166Amazon Cognito ............................................................................................................. 166AWS CloudFormation ...................................................................................................... 166Amazon CloudWatch Logs ............................................................................................... 167

iii

Page 4: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

Amazon CloudWatch Events ............................................................................................. 167AWS CodeCommit .......................................................................................................... 167スケジュールされたイベント (Amazon CloudWatch Events を使用) ........................................ 168AWS Config ................................................................................................................... 168Amazon Alexa ................................................................................................................ 168Amazon Lex ................................................................................................................... 169Amazon API Gateway ...................................................................................................... 169AWS IoT ボタン ............................................................................................................. 169Amazon CloudFront ......................................................................................................... 170Amazon Kinesis Data Firehose ......................................................................................... 170その他のイベントソース: オンデマンドで Lambda 関数を呼び出す ......................................... 170サンプルイベントデータ ................................................................................................... 170

ユースケース .................................................................................................................................. 182Amazon S3 ............................................................................................................................ 182

チュートリアル ............................................................................................................... 184Kinesis ................................................................................................................................... 200

チュートリアル ............................................................................................................... 201Amazon DynamoDB ................................................................................................................ 211

チュートリアル ............................................................................................................... 212AWS CloudTrail ...................................................................................................................... 224

チュートリアル ............................................................................................................... 225Amazon SNS .......................................................................................................................... 239

チュートリアル ............................................................................................................... 239Amazon API Gateway .............................................................................................................. 245

Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) .......................... 246Lambda と API Gateway を使用してシンプルなマイクロサービスを作成する ........................... 259

モバイルバックエンド (Android) ................................................................................................ 262チュートリアル ............................................................................................................... 263

予定されているイベント ........................................................................................................... 275チュートリアル ............................................................................................................... 275

カスタムユーザーアプリケーション ........................................................................................... 281チュートリアル ............................................................................................................... 281

AWS Lambda@Edge ............................................................................................................... 288Lambda@Edge 用の Lambda 関数を作成および使用する方法 ................................................ 290Lambda 関数のレプリカを削除する方法 ............................................................................. 290Lambda@Edge 用の IAM アクセス権限とロールの設定 ........................................................ 290Lambda@Edge 関数の作成 ............................................................................................... 290Lambda@Edge 関数のトリガーの追加 (AWS Lambda コンソール) ......................................... 290Lambda@Edge 用の関数を記述する .................................................................................. 290Lambda@Edge 用の Lambda 関数の編集 ........................................................................... 290テストおよびデバッグ ...................................................................................................... 290Lambda@Edge の制限 ..................................................................................................... 290

Lambda ベースのアプリケーションをデプロイする .............................................................................. 291バージョニングとエイリアス ..................................................................................................... 292

バージョニング ............................................................................................................... 293別名 .............................................................................................................................. 297バージョニング、エイリアス、リソースポリシー ................................................................. 305バージョニング管理 ......................................................................................................... 307エイリアスを使用したトラフィックの移行 .......................................................................... 309

AWS サーバーレスアプリケーションモデル (AWS SAM) の使用 .................................................... 311AWS SAM を使用するサーバーレスリソース ....................................................................... 311次のステップ .................................................................................................................. 316独自のサーバーレスアプリケーションを作成する ................................................................. 316

Lambda ベースのアプリケーションのデプロイメントを自動化する ................................................. 318次のステップ .................................................................................................................. 319サーバーレスアプリケーションのパイプラインを構築する ..................................................... 319コードの段階的なデプロイ ................................................................................................ 324

iv

Page 5: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

Lambda ベースのアプリケーションのモニタリングとトラブルシューティング ......................................... 327Amazon CloudWatch の使用 ..................................................................................................... 327

トラブルシューティングシナリオ ...................................................................................... 328CloudWatch メトリクスへのアクセス ................................................................................. 329CloudWatch ログへのアクセス .......................................................................................... 331メトリクス ..................................................................................................................... 332

AWS X-Ray を使用する ........................................................................................................... 335AWS X-Ray を使用した Lambda ベースのアプリケーションのトレース ................................... 335AWS X-Ray の Lambda でのセットアップ .......................................................................... 337Lambda 関数からのトレースセグメントの発行 .................................................................... 338Lambda 環境の AWS X-Ray デーモン ................................................................................ 345環境変数を使用した AWS X-Ray との通信 .......................................................................... 345AWS X-Ray コンソールでの Lambda トレース: 例 ............................................................... 345

Lambda ベースのアプリケーションの管理 .......................................................................................... 347Lambda 関数へのタグ付け ........................................................................................................ 347

請求用の Lambda 関数へのタグ付け .................................................................................. 347Lambda 関数へのタグの適用 ............................................................................................. 348タグ付けされた Lambda 関数のフィルタリング ................................................................... 349タグの制限 ..................................................................................................................... 350

AWS CloudTrail による API ログ作成 ......................................................................................... 351CloudTrail での AWS Lambda 情報 .................................................................................... 351AWS Lambda ログファイルエントリの概要 ........................................................................ 352CloudTrail を使用した関数の呼び出しの追跡 ....................................................................... 353

認証とアクセスコントロール ..................................................................................................... 353認証 .............................................................................................................................. 353アクセスコントロール ...................................................................................................... 354アクセス管理の概要 ......................................................................................................... 355アイデンティティベースのポリシー (IAM ポリシー) を使用する ............................................. 359リソースベースのポリシーを使用する (Lambda 関数ポリシー) ............................................... 371アクセス権限モデル ......................................................................................................... 374Lambda API の権限リファレンス ....................................................................................... 377ポリシーテンプレート ...................................................................................................... 380

同時実行数の管理 .................................................................................................................... 387アカウントレベルの同時実行数の制限 ................................................................................ 387関数レベルの同時実行数の制限 ......................................................................................... 387スロットリング動作 ......................................................................................................... 389同時実行数の使用状況のモニタリング ................................................................................ 390

高度なトピック ............................................................................................................................... 391Environment Variables ............................................................................................................. 391

セットアップ .................................................................................................................. 391環境変数の名前をつけるためのルール ................................................................................ 393環境変数および関数のバージョニング ................................................................................ 394環境変数の暗号化 ............................................................................................................ 394環境変数を使用して Lambda 関数を作成する ...................................................................... 395機密情報を保存するために、環境変数を使用して Lambda 関数を作成する .............................. 397

デッドレターキュー ................................................................................................................. 398ベストプラクティス ................................................................................................................. 399

関数コード ..................................................................................................................... 400Function Configuration ..................................................................................................... 400アラームとメトリクス ...................................................................................................... 401ストリームイベントの呼び出し ......................................................................................... 401非同期呼び出し ............................................................................................................... 402Lambda VPC .................................................................................................................. 402

ランタイムサポートポリシー ..................................................................................................... 403実行環境 ........................................................................................................................................ 404

Lambda 関数で使用できる環境変数 ........................................................................................... 404制限 .............................................................................................................................................. 407

v

Page 6: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

AWS Lambda の制限 ............................................................................................................... 407AWS Lambda 制限のエラー ...................................................................................................... 408

API リファレンス ............................................................................................................................ 409SDK を使用する場合の証明書のエラー ....................................................................................... 409Actions .................................................................................................................................. 410

AddPermission ................................................................................................................ 411CreateAlias ..................................................................................................................... 416CreateEventSourceMapping .............................................................................................. 420CreateFunction ............................................................................................................... 425DeleteAlias ..................................................................................................................... 433DeleteEventSourceMapping .............................................................................................. 435DeleteFunction ................................................................................................................ 438DeleteFunctionConcurrency .............................................................................................. 441GetAccountSettings ......................................................................................................... 443GetAlias ......................................................................................................................... 445GetEventSourceMapping .................................................................................................. 448GetFunction .................................................................................................................... 451GetFunctionConfiguration ................................................................................................. 455GetPolicy ....................................................................................................................... 460Invoke ........................................................................................................................... 463InvokeAsync ................................................................................................................... 468ListAliases ...................................................................................................................... 471ListEventSourceMappings ................................................................................................. 474ListFunctions .................................................................................................................. 477ListTags ......................................................................................................................... 480ListVersionsByFunction .................................................................................................... 482PublishVersion ................................................................................................................ 485PutFunctionConcurrency ................................................................................................... 491RemovePermission .......................................................................................................... 493TagResource .................................................................................................................. 496UntagResource ............................................................................................................... 498UpdateAlias .................................................................................................................... 500UpdateEventSourceMapping ............................................................................................. 504UpdateFunctionCode ....................................................................................................... 508UpdateFunctionConfiguration ............................................................................................. 515

Data Types ............................................................................................................................ 522AccountLimit ................................................................................................................... 523AccountUsage ................................................................................................................ 525AliasConfiguration ............................................................................................................ 526AliasRoutingConfiguration ................................................................................................. 528Concurrency ................................................................................................................... 529DeadLetterConfig ............................................................................................................ 530Environment ................................................................................................................... 531EnvironmentError ............................................................................................................ 532EnvironmentResponse ..................................................................................................... 533EventSourceMappingConfiguration ..................................................................................... 534FunctionCode ................................................................................................................. 536FunctionCodeLocation ...................................................................................................... 537FunctionConfiguration ...................................................................................................... 538TracingConfig ................................................................................................................. 542TracingConfigResponse ................................................................................................... 543VpcConfig ...................................................................................................................... 544VpcConfigResponse ........................................................................................................ 545

ドキュメント履歴 ............................................................................................................................ 546AWS の用語集 ................................................................................................................................ 553

vi

Page 7: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda が適している用途

AWS Lambda とはAWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。AWS Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから1 秒あたり数千のリクエストまで自動的にスケーリングします。使用したコンピューティング時間に対してのみお支払いいただきます- コードが実行中でなければ料金はかかりません。AWS Lambda によって、実質どのようなタイプのアプリケーションやバックエンドサービスでも、管理なしでコードを実行できます。AWS Lambda は可用性の高いコンピューティングインフラストラクチャでコードを実行し、コンピューティングリソースの管理をすべて担当します。これにはサーバーおよびオペレーティングシステムの管理、キャパシティーのプロビジョニングおよび自動スケーリング、コードのモニタリングおよびログ記録などが含まれます。必要な操作は、AWS Lambda がサポートするいずれかの言語 (現在はNode.js、Java、C#、Go および Python) でコードを指定するだけです。

AWS Lambda を使用して、Amazon S3 バケットまたは Amazon DynamoDB テーブル内のデータの変更などのイベントに応答してコードを実行できます。Amazon API Gateway を使用して HTTP リクエストに応答してコードを実行します。または AWS SDK を使用して作成された API コールを使用してコードを呼び出します。これらの機能により、Lambda を使って Amazon S3 や Amazon DynamoDB などの AWSサービス用のデータ処理トリガーを簡単に構築し、Kinesis に保存されたストリーミングデータを処理し、AWS のスケール、パフォーマンス、およびセキュリティで運用される独自のバックエンドを作成できます。

イベントによってトリガーされる関数で構成され、AWS CodePipeline と AWS CodeBuild を使用して自動的にそれらをデプロイするサーバーレスアプリケーションを構築することもできます。詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

AWS Lambda の実行環境の詳細については、「Lambda 実行環境と利用できるライブラリ (p. 404)」を参照してください。AWS Lambda がコードを実行するために必要なコンピューティングリソースを決定する方法の詳細については、「Lambda 関数の設定 (p. 139)」を参照してください。

AWS Lambda が適している用途AWS Lambda は、AWS Lambda でサポートされる言語 (Node.js、Java、Go と C#、および Python) でアプリケーションコードを記述できる場合、多くのアプリケーションシナリオにとって最適なコンピューティングプラットフォームとなり、Lambda によって提供される AWS Lambda スタンダードランタイム環境とリソース内で実行されます。

AWS Lambda を使用する場合、お客様が責任を負うのはコードのみです。AWS Lambda は、バランスの良いメモリ、CPU、ネットワーク、およびその他のリソースを備えたコンピューティングシステムを管理します。これは柔軟性の引き換えとなるものです。つまり、コンピューティングインスタンスにログインしたり、オペレーティングシステムまたは言語ランタイムをカスタマイズしたりすることはできません。これらの制約により、AWS Lambda はユーザーに代わって操作や管理のアクティビティを実行します。これには容量のプロビジョニング、システム全体の状態のモニタリング、セキュリティパッチの適用、コードのデプロイ、Lambda 関数のモニタリングとログ記録が含まれます。

独自のコンピューティングリソースを管理する必要がある場合は、Amazon Web Services は目的に適した他のコンピューティングサービスも提供します。

• Amazon Elastic Compute Cloud (Amazon EC2) サービスには柔軟性が備わっており、さまざまな EC2インスタンスタイプから選択できます。これにより、オペレーティングシステム、ネットワークやセキュリティ設定、およびソフトウェアスタック全体をカスタマイズするオプションが得られますが、容量のプロビジョニング、システム全体の状態とパフォーマンスのモニタリング、および耐障害性のためのアベイラビリティーゾーンの使用はお客様が行う必要があります。

1

Page 8: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda を初めてお使いになる方向けの情報

• Elastic Beanstalk はアプリのデプロイおよび Amazon EC2 へのスケーリング用の使いやすいサービスで、お客様が基盤となる EC2 インスタンスを所有して全面的に管理します。

AWS Lambda を初めてお使いになる方向けの情報AWS Lambda を初めて使用する方には、次のセクションを順に読むことをお勧めします。

1. サンプルのユースケースを理解するため、製品概要を読み、入門動画をご覧ください。 これらの資料はAWS Lambda ウェブページにあります。

2. 本ガイドの「Lambda 関数」を確認してください。 Lambda 関数のプログラミングモデルとデプロイオプションについて、理解しておく必要がある主要概念があります。このセクションでは、それらの概念について説明し、Lambda 関数のコードの記述に使用できるさまざまな言語での動作の詳細について説明します。詳細については、「Lambda 関数 (p. 16)」を参照してください。

3. コンソールベースの「ご利用開始にあたって」の実習を実行します。 この実習では、コンソールを使用して、初めて Lambda 関数を作成し、テストする手順について説明しています。Lambda 関数を迅速に作成するためにコンソールで提供される設計図についても学習します。詳細については、「ご利用開始にあたって (p. 3)」を参照してください。

4. このガイドの「AWS Lambda によるアプリケーションのデプロイ」セクションを参照してください。このセクションでは、エンドツーエンドエクスペリエンスを作成するために使用する AWS Lambda のさまざまなコンポーネントを説明しています。詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

「ご利用開始にあたって」の実習の後に、さまざまなユースケースを参照でき、それぞれのシナリオの例を説明したチュートリアルが提供されています。アプリケーションのニーズ (たとえば、イベント駆動型Lambda 関数の呼び出しまたはオンデマンドでの関数呼び出しのいずれか) に応じて、お客様固有のニーズを満たす特定のチュートリアルを参照できます。詳細については、「ユースケース (p. 182)」を参照してください。

ここで示している各トピックで、AWS Lambda についてさらに詳しく学習できます。

• AWS Lambda 関数のバージョニングとエイリアス (p. 292)• Amazon CloudWatch の使用 (p. 327)• AWS Lambda 関数を使用する際のベストプラクティス (p. 399)• AWS Lambda の制限 (p. 407)

2

Page 9: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda ベースのアプリケーションの構成要素

ご利用開始にあたってこのセクションでは、一般的な Lambda ベースのアプリケーションの基本的な概念と、アプリケーションの作成とテストに使用できるオプションについて説明しています。さらに、このガイドに含まれるチュートリアルを完了するために必要なツールをインストールする手順と、最初の Lambda 関数を作成する手順を示しています。

Lambda ベースのアプリケーションの構成要素• Lambda 関数: カスタムコードと任意の依存ライブラリで構成される、アプリケーションの基礎。詳細に

ついては、「Lambda 関数 (p. 16)」を参照してください。• イベントソース: 関数をトリガーし、そのロジックを実行する AWS サービス (Amazon SNS など) また

はカスタムサービス。詳細については、「イベントソースマッピング (p. 157)」を参照してください。• ダウンストリームリソース: Lambda 関数がトリガー時に呼び出す AWS サービス (DynamoDB テーブ

ル、Amazon S3 バケットなど)。• ログストリーム: Lambda によって関数の呼び出しが自動的にモニタリングされ、CloudWatch にメトリ

クスがレポートされますが、カスタムログ記録ステートメントを使用して関数コードに注釈を付けることができます。これにより、Lambda 関数の実行フローとパフォーマンスを分析して、関数が正常に実行されていることを確認できます。

• AWS SAM: サーバーレスアプリケーション を定義するモデル。AWS SAM は、AWS CloudFormation でネイティブにサポートされており、サーバーレスリソースを表すための簡易構文を定義しています。詳細については、「AWS サーバーレスアプリケーションモデル (AWS SAM) の使用 (p. 311)」を参照してください。

Lambda ベースのアプリケーションを作成およびテストするためのツール

以下に説明しているように、AWS Lambda サービスを操作するために使用する 3 つの重要なツールがあります。AWS Lambda ベースのアプリケーションを構築するためのツールについては、その後のセクションで説明しています。

• Lambda コンソール: Lambda ベースのアプリケーションをグラフィカルに設計したり、Lambda 関数コードを作成または更新したり、イベント、ダウンストリームリソース、関数に必要な IAM アクセス権限を設定したりできます。また、「高度なトピック (p. 391)」で概説している高度な設定オプションも含まれます。

• AWS CLI: 関数の作成やイベントソースのマッピングなど、Lambda の API オペレーションを活用するために使用できるコマンドラインインターフェイス。Lambda の API オペレーションの完全なリストについては、「Actions (p. 410)」を参照してください。

• SAM Local: サーバーレスアプリケーションを Lambda ランタイムにアップロードする前にローカルで開発、テスト、分析するために使用できるコマンドラインインターフェイス。詳細については、「SAMローカルを使用してサーバーレスアプリケーションをローカルでテストする (p. 106)」を参照してください。

開始する前にこのセクションの最後にあるチュートリアルを使用するには、以下の手順を完了したことを確認してください。

3

Page 10: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド次のステップ

• AWS アカウントのセットアップ (p. 4)• AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)• 「SAM Local のインストール (p. 7)」で概説している Docker を含む SAM Local を使用するための

手順

次のステップAWS アカウントのセットアップ (p. 4)

AWS アカウントのセットアップAWS アカウントにサインアップしてアカウントに管理者ユーザーを作成する必要があります (まだ作成していない場合)。また、AWS Command Line Interface (AWS CLI) を設定する必要があります。チュートリアルの多くは AWS CLI を使用しています。

セットアップを完了するには、以下のトピックの指示に従ってください。

AWS アカウントのセットアップと管理者ユーザーの作成AWS にサインアップAmazon Web Services (AWS) にサインアップすると、AWS Lambda など AWS のすべてのサービスに対して AWS アカウントが自動的にサインアップされます。料金が発生するのは、実際に使用したサービスの分のみです。

AWS Lambda は、使用したリソース分のみお支払いいただくだけで利用可能です。AWS Lambda の使用料の詳細については、AWS Lambda 製品ページを参照してください。AWS の新規のお客様である場合は、AWS Lambda の使用を無料で開始できます。詳細については、「AWS 無料利用枠」を参照してください。

すでに AWS アカウントをお持ちの場合は次のタスクに進んでください。AWS アカウントをお持ちでない場合は、次に説明する手順にしたがってアカウントを作成してください。

AWS アカウントを作成するには

1. https://aws.amazon.com/ を開き、[Create an AWS Account] を選択します。

Note

過去に AWS マネジメントコンソール にサインインした場合は、お使いのブラウザで使用できないことがあります。その場合は、[Sign in to a different account] を選択し、次に [Createa new AWS account] を選択します。

2. オンラインの手順に従います。

サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを用いて PIN を入力することが求められます。

AWS アカウント ID は次のタスクでも必要となるので、メモしておいてください。

4

Page 11: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS アカウントのセットアップと管理者ユーザーの作成

IAM ユーザーを作成するAWS のサービス (AWS Lambda など) にアクセスするときは、認証情報を指定するように求められます。それにより、サービスによって所有されるリソースにアクセスするための権限があるかどうかが判定されます。コンソールを使用するにはパスワードが必要です。AWS アカウントによる AWS CLI または API へのアクセス用にアクセスキーを作成できます。ただし、AWS アカウントの認証情報を使用して AWS にアクセスすることはお勧めしません。代わりに AWS Identity and Access Management (IAM) を使用することをお勧めします。IAM ユーザーを作成し、管理者アクセス権限を持つ IAM グループにユーザーを追加したら、作成した IAM ユーザーに管理者アクセス権限を付与します。その後、特別な URL とその IAM ユーザーの認証情報を使用して AWS にアクセスできます。

AWS にサインアップしても、IAM ユーザーをまだ作成していない場合は、IAM コンソールを使用して作成できます。

このガイドの「開始方法」の演習とチュートリアルでは、管理者権限を持つユーザー (adminuser) が存在するとします。それらの手順に従うときは、adminuser という名前のユーザーを作成します。

自分用の IAM ユーザーを作成し、そのユーザーを管理者グループに追加するには

1. AWS アカウント E メールアドレスとパスワードを使用して https://console.aws.amazon.com/iam/ でAWS アカウントのルートユーザー として IAM コンソールにサインインします。

Note

以下の管管管 IAM ユーザーの使用に関するベストプラクティスに従い、ルートユーザー認証情報を安全な場所に保管しておくことを強くお勧めします。ルートユーザーとしてサインインして、少数のアカウントおよびサービス管理タスクのみを実行します。

2. コンソールのナビゲーションペインで、[Users] を選択後、[Add user] を選択します。3. [User name] に、Administrator と入力します。4. [AWS マネジメントコンソール access] の横のチェックボックスをオンにし、[Custom password] を選

択して、新しいユーザーのパスワードをテキストボックスに入力します。オプションとして [Requirepassword reset] (パスワードのリセットの強制) を選択し、ユーザーが次回サインインしたときに新しいパスワードを作成することを強制できます。

5. [Next: Permissions] を選択します。6. [Set permissions for user] ページで、[Add user to group] を選択します。7. [Create group] を選択します。8. [Create group] ダイアログボックスに、Administrators と入力します。9. [Filter] で、[Job function] を選択します。10. ポリシーリストで、[AdministratorAccess] のチェックボックスをオンにします。次に、[Create group]

を選択します。11. グループのリストに戻り、新しいグループのチェックボックスをオンにします。必要に応じて

[Refresh] を選択し、リスト内のグループを表示します。12. [Next: Review] を選択して、新しいユーザーに追加するグループメンバーシップのリストを表示しま

す。続行する準備ができたら、[Create user] を選択します。

この同じプロセスを繰り返して新しいグループとユーザーを作成し、AWS アカウントのリソースへのアクセス権をユーザーに付与できます。ポリシーを使用して特定の AWS リソースに対するユーザーのアクセス権限を制限する方法については、「アクセス管理」と「ポリシーの例」を参照してください。

新しい IAM ユーザーとしてサインインするには

1. AWS マネジメントコンソールからログアウトします。2. 次の URL 形式を使用してコンソールにログインします。

5

Page 12: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS CLI のセットアップ

https://aws_account_number.signin.aws.amazon.com/console/

aws_account_number は、ハイフンのない AWS アカウント ID です。たとえば、AWS アカウントID が 1234-5678-9012 の場合、AWS アカウント番号は 123456789012 です。アカウント番号を検索する方法については、『IAM ユーザーガイド』の「AWS アカウント ID とその別名」を参照してください。

3. 作成した IAM ユーザー名とパスワードを入力します。サインインすると、ナビゲーションバーに「your_user_name @ your_aws_account_id」が表示されます。

サインページの URL に AWS アカウント ID を含めない場合は、アカウントのエイリアスを作成します。

アカウントエイリアスを作成または削除するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. ナビゲーションペインで、[Dashboard] を選択します。3. IAM ユーザーのサインインリンクを探します。4. エイリアスを作成するには、[Customize] をクリックし、エイリアスとして使用する名前を入力して、

[Yes, Create] を選択します。5. エイリアスを削除するには、[Customize] を選択してから、[Yes, Delete] を選択します。サインイン

URL で、再びお客様の AWS アカウント ID が使用されるようになります。

アカウントエイリアスを作成した後、サインインするには、次の URL を使用します。

https://your_account_alias.signin.aws.amazon.com/console/

アカウントの IAM ユーザーのサインインリンクを確認するには、IAM コンソールを開き、ダッシュボードの [IAM users sign-in link:] の下を確認します。

IAM の詳細については、以下を参照してください。

• AWS Identity and Access Management (IAM)• はじめに• IAM ユーザーガイド

次のステップAWS Command Line Interface のセットアップ (AWS CLI) (p. 6)

AWS Command Line Interface のセットアップ(AWS CLI)

このガイドのすべての演習では、操作を実行するために、アカウントの管理者ユーザーの認証情報(adminuser) を使用しているとします。AWS アカウントでの管理者ユーザーの作成手順については、「AWS アカウントのセットアップと管理者ユーザーの作成 (p. 4)」を参照してください。そこで示されている手順に従って、AWS Command Line Interface (AWS CLI) をダウンロードして設定します。

6

Page 13: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド次のステップ

AWS CLI をセットアップするには

1. AWS CLI をダウンロードして設定します。手順については、AWS Command Line Interface ユーザーガイドの次のトピックを参照してください。

• AWS Command Line Interface のセットアップ• AWS Command Line Interface の設定

2. AWS CLI 設定ファイルで管理者ユーザー用の名前付きプロファイルを追加します。AWS CLI コマンドを実行するときに、このプロファイルを使用します。

[profile adminuser]aws_access_key_id = adminuser access key IDaws_secret_access_key = adminuser secret access keyregion = aws-region

使用可能な AWS リージョンのリストについては、『アマゾン ウェブ サービス全般のリファレンス』の「リージョンとエンドポイント」を参照してください。

3. コマンドプロンプトで以下のコマンドを入力して、セットアップを確認します。

• help コマンドを実行して、AWS CLI がコンピュータにインストールされたことを確認します。

aws help

• Lambda コマンドを実行して、ユーザーが AWS Lambda にアクセスできることを確認します。このコマンドは、アカウントに Lambda 関数がある場合はそれらの関数を一覧表示します。AWS CLIは、adminuser 認証情報を使用してリクエストを認証します。

aws lambda list-functions --profile adminuser

次のステップSAM Local のインストール (p. 7)

SAM Local のインストールSAM Local は、「SAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする (p. 106)」で説明しているように、Lambda 関数コードの短期間での反復開発を可能にするツールでもあります。SAM Local を使用するには、まず Docker をインストールする必要があります。

Docker のインストールDocker は、Linux、Mac、Windows を問わず、アプリケーションを構築、管理、テストできるオープンソースソフトウェアコンテナプラットフォームです。詳細およびダウンロード手順については、「Docker」を参照してください。

Docker をインストールすると、SAM Local は docker-lambda というカスタマイズされた Docker イメージを自動的に提供します。このイメージは、AWS パートナーによるライブ AWS Lambda 実行環境のシミュレーション専用に設計されています。この環境には、インストール済みのソフトウェア、ライブラリ、セキュリティのアクセス許可、環境変数、および Lambda 実行環境と利用できるライブラリ (p. 404) で説明されているその他の機能が含まれます。

docker-lambda を使用して、Lambda 関数をローカルで呼び出すことができます。この環境では、AWSLambda ランタイムを再デプロイしなくても、このランタイムと同じようにサーバーレスアプリケーショ

7

Page 14: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM Local のインストール

ンが実行および動作します。この環境での実行と動作には、タイムアウトやメモリ使用量などの検討事項が反映されます。

Important

これはシミュレートされた環境であるため、ローカルのテスト結果が実際の AWS ランタイムの結果と正確に一致する保証はありません。

詳細については、GitHub の Docker Lambda を参照してください。(Github アカウントをお持ちでない場合は無料で作成できます。その後 Docker Lambda にアクセスしてください。)

SAM Local のインストールSAM Local は、Linux、Mac、および Windows 環境で実行できます。SAM Local を最も簡単にインストールするには NPM を使用します。

npm install -g aws-sam-local

次に、インストールが正常に完了したことを確認します。

sam --version

NPM が適切に機能しない場合は、最新のバイナリをダウンロードして SAM Local の使用をすぐに開始できます。バイナリは、SAM CLI GitHub Repository の「Releases」セクションにあります。

次のステップシンプルな Lambda 関数を作成してコンソールを探る (p. 8)

シンプルな Lambda 関数を作成してコンソールを探る

この開始方法の演習では、まず AWS Lambda コンソールを使用して Lambda 関数を作成します。次に、サンプルイベントデータを使用して手動で Lambda 関数を呼び出します。AWS Lambda は Lambda 関数を実行し、結果を返します。その後、Lambda 関数によって作成されたログや、さまざまな CloudWatchメトリクスなど、実行結果を確認します。

ここで示す手順に従うと、AWS Lambda コンソールでの以下の操作も分かるようになります。

• 設計図を探る。各設計図には、数回クリックするだけで Lambda 関数を作成できるサンプルコードとサンプル設定が用意されています。

• Lambda 関数の設定情報を表示および更新する。• Lambda 関数を手動で呼び出し、[Execution results] セクションで結果を探る。• コンソールで CloudWatch メトリクスをモニタリングする。

使用開始の準備まず、AWS アカウントにサインアップして、アカウントに管理者ユーザーを作成する必要があります。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

8

Page 15: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

次のステップ

シンプルな Lambda 関数を作成する (p. 9)

シンプルな Lambda 関数を作成するこのセクションの手順に従って、シンプルな Lambda 関数を作成します。

Lambda 関数を作成するには

1. AWS マネジメントコンソール にサインインして、AWS Lambda コンソールを開きます。2. AWS Lambda には、[How it works] ラベルにシンプルな Hello World 関数が用意され、[Run] オプ

ションも含まれているため、関数を入門例として呼び出して使用できます。このチュートリアルでは、Lambda 関数を作成、テスト、更新するための追加のオプションや、Lambda コンソールに用意されたその他の機能を紹介し、それらの各オプションや機能に関する詳細へのリンクを示しています。

続行するには、[Get Started] セクションで [Create a function] を選択します。

9

Page 16: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

Note

コンソールに [Get Started ] ページが表示されるのは、Lambda 関数を 1 つも作成していない場合のみです。既に関数を作成している場合は、[Lambda] > [Functions] ページが表示されます。リストのページで [Create a function] を選択すると、[Create function] ページに移動します。

10

Page 17: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

3. [Create function] ページで、以下の 3 つのオプションが表示されます。

• 一から作成• 設計図• Serverless Application Repository

Serverless Application Repository の使用に関する詳細は「AWS Serverless Application Repository とは? (What Is the AWS Serverless Application Repository?)」をご覧ください。

a. 設計図を確認する場合は、[Blueprints] ボタンをクリックすると、使用可能な設計図が表示されます。[Filter] を使用して、特定の設計図を検索することもできます。以下に例を示します。

• [Filter] に「S3」と入力して、Amazon S3 イベントの処理に使用できる設計図のリストのみを取得します。

• [Filter] に「dynamodb」と入力して、Amazon DynamoDB イベントの処理に使用できる設計図のリストのみを取得します。

b. この [Getting Started] の練習では、[Author from scratch] ボタンを選択します。4. [Author from scratch] で、以下の操作を行います。

• [Name*] で、Lambda 関数名を指定します。• [ランタイム*] で、[Python 3.6] を選択します。• [Role*] では、[Create new role from templates(s)] を選択します。• [Role name*] に、ロールの名前を入力します。• [Policy templates] フィールドは空白のままにします。この概要では Lambda 関数が必要とする実行

権限が許可されています。

Note

AWS Lambda のセキュリティポリシーに関する詳細は「AWS Lambda に対する認証とアクセスコントロール (p. 353)」を参照してください。

• [Create Function] を選択します。5. 新しい [function-name] ページで、以下の点に注目します。

[Add triggers] パネルでは、示されているサービスオプションのいずれかを選択して、Lambda 関数を自動的にトリガーするサービスを選択することもできます。

11

Page 18: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

a. 選択したサービスによっては、そのサービスのための関連情報を提供するように求められます。たとえば、DynamoDB を選択した場合、以下を指定する必要があります。

• DynamoDB テーブルの名前• バッチサイズ• 開始位置

b. この例では、トリガーを設定しないでください。

• [Function code] で、Node.js で作成されたコードが表示されています。このコードは、シンプルな"Hello from Lambda" というあいさつを返します。

• [Handler] には、lambda_function.lambda_handler value 値が表示されます。それはfilename.handler-function という形式です。コンソールでは、lambda_function.py ファイルにサンプルコードが保存されます。そのコードでは、lambda_handler が Lambda 関数が呼び出されたときにパラメーターとしてイベントを受け取る関数の名前です。詳細については、「Lambda 関数ハンドラー (Python) (p. 58)」を参照してください。

• 組み込み IDE (統合開発環境) に注目します。詳細については、「AWS Lambda コンソールエディタを使用した関数の作成 (p. 113)」を参照してください。

6. このページには、そのほかに以下の設定オプションがあります。

• Environment variables – Lambda 関数の環境変数により、コードへの変更を行なわないで関数コードとライブラリに設定を動的に引き渡すことができます。詳細については、「EnvironmentVariables (p. 391)」を参照してください。

• Tags – AWS リソースにアタッチするキーと値のペアであり、リソースをうまく整理できます。詳細については、「Lambda 関数へのタグ付け (p. 347)」を参照してください。

• Execution role – 定義済みのロールとポリシーを使用するか、新しいものを作成して、関数のセキュリティを管理できます。詳細については、「AWS Lambda に対する認証とアクセスコントロール (p. 353)」を参照してください。

• Basic settings – Lambda 関数のメモリ割り当ておよびタイムアウト制限を指示できます。詳細については、「AWS Lambda の制限 (p. 407)」を参照してください。

• Network – 関数がアクセスする VPC を選択できます。詳細については、「Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する (p. 141)」を参照してください。

• Debugging and error handling – デッドレターキュー (p. 398) リソースを選択して、失敗した関数呼び出しの再試行を分析できます。また、アクティブな追跡を有効にできます。詳細については、「AWS X-Ray を使用する (p. 335)」を参照してください。

• Concurrency - この関数に特定の同時実行数の制限を割り当てることができます。詳細については、「関数レベルの同時実行数の制限 (p. 387)」を参照してください。

• Auditing and compliance - 運用監査、リスク監査、ガバナンス、コンプライアンスに関する関数の呼び出しをログに記録します。詳細については、「AWS CloudTrail で AWS Lambda を使用する (p. 224)」を参照してください。

Lambda 関数を手動で呼び出し、結果、ログ、メトリクスを確認するここで示す手順に従って、コンソールに用意されているサンプルイベントデータを使用して Lambda 関数を呼び出します。

1. [yourfunction] ページで、[Test] を選択します。2. [Configure test event] ページで [Create new test event] を選択し、[Event template] でデフォルトの

[Hello World] オプションのままにします。[Event name] に入力し、以下のサンプルイベントテンプレートに注目します。

12

Page 19: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

{ "key3": "value3", "key2": "value2", "key1": "value1"}

サンプル JSON のキーと値は変更できますが、イベント構造は変更しないでください。キーと値を変更した場合は、それに応じてサンプルコードを更新する必要があります。[Save and test] を選択します。

3. AWS Lambda はユーザーに代わって関数を実行します。Lambda 関数の handler がサンプルイベントを受け取り、処理します。

4. 正常に実行されると、コンソールに結果が表示されます。

次の点に注意してください。

• [Execution result] セクションに、実行状態として [succeeded] が表示され、また、return ステートメントで返された関数の実行結果も表示されます。

Note

Lambda 関数を呼び出して AWS Lambda がすぐに応答を返すようにするとき、コンソールでは常に RequestResponse 呼び出しタイプ (同期呼び出し) が使用されます。詳細については、「呼び出しタイプ (p. 156)」を参照してください。

• [Summary] セクションには、[Log output] セクション (実行ログの REPORT 行) にレポートされた重要な情報が表示されます。

• [Log output] セクションには、AWS Lambda で各実行に対して生成されるログが表示されます。これらは、Lambda 関数によって CloudWatch に書き込まれたログです。AWS Lambda コンソールには、ユーザーに便利なようにこれらのログが表示されます。

[Click here] リンクでは、CloudWatch コンソールのログが表示されることに注意してください。次に、この関数は、Amazon CloudWatch の、Lambda 関数に対応するロググループにログを追加します。

5. 次の手順で表示できるいくつかのメトリクスを収集するために、Lambda 関数を数回実行します。

13

Page 20: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

6. [Monitoring] タブを選択して、Lambda 関数の CloudWatch メトリクスを表示します。このページには、CloudWatch メトリクスが表示されます。

次の点に注意してください。

• X 軸は、現在の時刻から過去 24 時間を示します。• 呼び出し回数は、この間隔での呼び出しの数を示します。• 呼び出し時間は、Lambda 関数の実行にかかった時間を示します。実行にかかった最短時間、最長

時間、平均時間が示されます。• 呼び出しエラーは、Lambda 関数が失敗した回数を示します。関数が実行された回数と失敗した回

数 (もしあれば) を比較できます。• 調整された呼び出しメトリクスは、AWS Lambda が Lambda 関数呼び出しを調整したかどうかを示

します。詳細については、「AWS Lambda の制限 (p. 407)」を参照してください。

14

Page 21: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドシンプルな Lambda 関数を作成する

• 同時実行メトリクスは、Lambda 関数の同時呼び出しの数を示します。詳細については、「同時実行数の管理 (p. 387)」を参照してください。

• AWS Lambda コンソールには、ユーザーに便利なように、これらの CloudWatch メトリクスが表示されます。それらのメトリクスのいずれかをクリックすることで、Amazon CloudWatch コンソールに表示できます。

これらのメトリクスとその意味の詳細については、「AWS Lambda CloudWatch のメトリクス (p. 333)」を参照してください。

15

Page 22: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数のビルド

Lambda 関数AWS Lambda を初めて使用する場合、次のことを知りたいと思うかもしれません。AWS Lambda はコードをどのように実行するのか? 自分の Lambda コードを実行するために必要なメモリと CPU の要件を、AWS Lambda はどのように判断しているのか?以下のセクションでは、Lambda 関数の動作の概要を説明します。

以降のセクションでは、作成した関数がどのように呼び出されるか、それらの関数をどのようにデプロイしてモニタリングするかについて説明します。また、「AWS Lambda 関数を使用する際のベストプラクティス (p. 399)」で関数コードと関数設定のセクションを読むことをお勧めします。

開始するには、Lambda 関数の構築の基礎を説明する「Lambda 関数のビルド (p. 16)」トピックを参照してください。

Lambda 関数のビルド1 つ以上 Lambda 関数形式でアプリケーションコードを AWS Lambda (コンピューティングサービス) にアップロードします。こうすることで、AWS Lambda がお客様の代わりにコードを実行します。AWSLambda によって、コードの呼び出し時にサーバーのプロビジョニングと管理が処理されます。

通常、AWS Lambda ベースアプリケーションのライフサイクルには、コードの作成、コードの AWSLambda へのデプロイ、およびモニタリングとトラブルシューティングが含まれます。以下は、これらライフサイクルの各フェーズに関する一般的な質問です。

• Lambda 関数のコード作成 – サポートされている言語は何ですか?従う必要があるプログラミングモデルはありますか?AWS Lambda にアップロードするにあたって、コードと依存関係をどのようにパッケージ化すればよいですか?使用できるツールは何ですか?

 • コードのアップロードと Lambda 関数の作成 – コードパッケージを AWS Lambda にどのようにアップ

ロードすればよいですか?AWS Lambda にコードの実行開始場所をどのように指定すればよいですか?メモリやタイムアウトのようなコンピューティング要件をどのように指定すればよいですか?

 • モニタリングとトラブルシューティング – 本稼働の Lambda 関数の場合、どのようなメトリクスを使用

できますか?エラーが出た場合に、ログの取得や問題のトラブルシューティングはどのようにすればよいですか?

以下のセクションでは、基本的な情報と説明します。また、後半の例のセクションでは使用例を挙げて解説します。

Lambda 関数のコードを作成するLambda 関数コードは、AWS Lambda でサポートされている言語で作成できます。サポートされている言語のリストについては、「Lambda 実行環境と利用できるライブラリ (p. 404)」を参照してください。コードの作成には、AWS Lambda コンソール、Eclipse IDE、Visual Studio IDE などのツールがあります。ただし、使用できるツールおよびオプションは以下の要因によって決まります。

• Lambda 関数のコードの作成に選択した言語。

16

Page 23: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドコードをデプロイして Lambda 関数を作成する

• コードで使用するライブラリ。AWS Lambda ランタイムはライブラリの一部を提供します。他にライブラリを使用する場合はそれもアップロードする必要があります。

次の表は、言語、および使用できるツールとオプションを示します。

言語 コードを作成するためのツールとオプション

Node.js • AWS Lambda コンソール• IDE プラグインを使用する Visual Studio (Visual Studio の AWS

Lambda サポートを参照)• 独自の作成環境• 詳細については、「コードをデプロイして Lambda 関数を作成す

る (p. 17)」を参照してください。

Java • AWS Toolkit for Eclipse を使用する Eclipse (AWS Toolkit forEclipse で AWS Lambda を使用するを参照)

• 独自の作成環境• 詳細については、「コードをデプロイして Lambda 関数を作成す

る (p. 17)」を参照してください。

C# • IDE プラグインを使用する Visual Studio (Visual Studio の AWSLambda サポートを参照)

• .NET Core (.NET Core インストールガイド を参照してください )• 独自の作成環境• 詳細については、「コードをデプロイして Lambda 関数を作成す

る (p. 17)」を参照してください。

Python • AWS Lambda コンソール• 独自の作成環境• 詳細については、「コードをデプロイして Lambda 関数を作成す

る (p. 17)」を参照してください。

Go • 独自の作成環境• 詳細については、「コードをデプロイして Lambda 関数を作成す

る (p. 17)」を参照してください。

また、使用する言語にかかわらず、Lambda 関数コードを記述するにはパターンがあります。たとえば、Lambda 関数のハンドラーメソッド (AWS Lambda がコードの実行を開始するときに最初に呼び出すメソッド) の記述方法、ハンドラーにイベントを渡す方法、CloudWatch Logs でログを生成するためにコード内に使用できるステートメント、AWS Lambda ランタイムを操作してタイムアウト前終了などの情報を取得する方法、および例外の処理方法などです。「プログラミングモデル (p. 19)」セクションで、サポートされる言語ごとに情報を説明しています。

Note

AWS Lambda の基本を学習した後は、「ユースケース (p. 182)」を参照してください。エンドツーエンドエクスペリエンスを活用する上で役立つ詳しい手順を説明しています。

コードをデプロイして Lambda 関数を作成するLambda 関数を作成するには、まずコードと依存関係をデプロイパッケージにパッケージ化します。次に、デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。

トピック

17

Page 24: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドモニタリングとトラブルシューティング

• デプロイパッケージを作成する – コードと依存関係を組織化する (p. 18)• デプロイパッケージをアップロードする – Lambda 関数を作成する (p. 18)• Lambda 関数のテスト (p. 18)

デプロイパッケージを作成する – コードと依存関係を組織化する最初に、コードと依存関係を特定の方法で組織化してデプロイパッケージを作成する必要があります。デプロイパッケージを作成する手順は、コードの作成に選択した言語によって異なります。たとえば、Jenkins (Node.js および Python の場合) や Maven (Java の場合) などのビルドプラグインを使用してデプロイパッケージを作成できます。詳細については、「デプロイパッケージの作成 (p. 85)」を参照してください。

コンソールを使用して Lambda 関数を作成する場合は、コンソールによってデプロイパッケージが作成され、Lambda 関数を作成するためにアップロードされます。

デプロイパッケージをアップロードする – Lambda 関数を作成するAWS Lambda には、「CreateFunction (p. 425)」オペレーションがあり、これを使用して Lambda 関数を作成できます。AWS Lambda コンソール、AWS CLI、AWS SDK を使用して Lambda 関数を作成できます。内部的には、これらのインターフェイスはすべて、CreateFunction オペレーションを呼び出します。

デプロイパッケージの指定に加えて、Lambda 関数のコンピューティング要件、Lambda 関数内のハンドラーメソッド名、ランタイム (コードの作成に選択した言語によって異なります) などの設定情報をLambda 関数の作成時に指定できます。詳細については、「Lambda 関数 (p. 16)」を参照してください。

Lambda 関数のテストLambda 関数が特定のタイプのイベントを処理するように設計されている場合、サンプルイベントデータを使用して、以下の方法で Lambda 関数をテストできます。

• コンソールで Lambda 関数をテストします。• AWS CLI を使用して Lambda 関数をテストします。Invokeメソッドを使用して Lambda 関数を呼び出

し、サンプルイベントデータを渡すことができます。• SAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする (p. 106) を使用して

Lambda 関数をローカルでテストします。

コンソールは、サンプルイベントデータを提供します。同じデータが、「イベントソースによって公開されたサンプルイベント (p. 170)」トピックでも提供されています。これを AWS CLI で使用して Lambda関数を呼び出すことができます。

モニタリングとトラブルシューティングLambda 関数の本稼働後は、AWS Lambda がユーザーに代わって自動的に関数をモニタリングし、Amazon CloudWatch を通じてメトリクスをレポートします。詳細については、「AWS Lambda のAmazon CloudWatch メトリクスへのアクセス (p. 329)」を参照してください。

関数の失敗をトラブルシューティングするため、Lambda は関数で処理されたすべてのリクエストをログに記録し、コードで Amazon CloudWatch Logs に生成されたログを自動的に保存します。詳細については、「AWS Lambda の Amazon CloudWatch ログへのアクセス (p. 331)」を参照してください。

18

Page 25: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda ベースアプリケーションの例

AWS Lambda ベースアプリケーションの例このガイドでは、詳細な手順の説明を含むさまざまな例を提供しています。AWS Lambda を初めて使用する場合は、以下の実習をお勧めします。

• ご利用開始にあたって (p. 3) – 「開始方法」の実習では、コンソールベースの操作が提供されます。また、サンプルコードが優先ランタイム用に提供されます。さらに、コードエディタを使用してコードをコンソールで記述し、AWS Lambda にアップロードして、コンソールに用意されているサンプルイベントデータでテストすることもできます。

 • 「ユースケース (p. 182)」 – コンソールを使用してコードを作成できない場合は、独自にデプロイパッ

ケージを作成し、AWS CLI (または SDK) を使用して Lambda 関数を作成する必要があります。詳細については、「Lambda 関数のコードを作成する (p. 16)」を参照してください。ユースケースセクションの例のほとんどは、AWS CLI を使用します。AWS Lambda を初めて使用する場合は、以下の実習のいずれかをお勧めします。

関連トピックここで示している各トピックで、さらに詳しく学習できます。

プログラミングモデル (p. 19)

デプロイパッケージの作成 (p. 85)

AWS Lambda 関数のバージョニングとエイリアス (p. 292)

Amazon CloudWatch の使用 (p. 327)

プログラミングモデルAWS Lambda でサポートされているいずれかの言語で Lambda 関数のコードを記述します。使用する言語にかかわらず、以下の主要概念が含まれる Lambda関数のコードを記述するには一般的なパターンがあります。

• ハンドラー – ハンドラーは、ユーザーの Lambda 関数の実行を開始するために AWS Lambda が呼び出す関数です。Lambda 関数を作成する際にハンドラーを識別します。Lambda 関数が呼び出されると、AWS Lambda はハンドラー関数を呼び出してコードの実行を開始します。AWS Lambda はこのハンドラーに、最初のパラメーターとしてイベントデータを渡します。ハンドラーは、その受信イベントデータを処理する必要があり、コード内の他の関数/メソッドを起動できます。

 • context オブジェクトおよび実行時の Lambda での動作 — AWS Lambda はまた context オブジェクトを

2 番目のパラメーターとしてハンドラー関数に渡します。この context オブジェクトにより、コードはAWS Lambdaとやり取りできます。たとえば、AWS Lambda が Lambda を終了させるまでの残りの実行時間をコードで確認できます。

 

さらに、Node.js などの言語では、コールバックを使用する非同期プラットフォームがあります。AWSLambda では、この context オブジェクトに関する追加のメソッドが提供されています。Lambda 関数を終了させて、オプションとして呼び出し元に値を返すように AWS Lambda に指示するには、これらのcontext オブジェクトメソッドを使用します。

 

19

Page 26: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• ログ記録 – Lambda 関数にログ記録ステートメントを含めることができます。AWS Lambda はこれらのログを CloudWatch Logs に書き込みます。Lambda 関数のコードの記述に使用する言語に応じて、特定の言語ステートメントによってログエントリが生成されます。

 • 例外 – Lambda 関数は、その関数の実行結果を AWS Lambda に伝える必要があります。Lambda 関数の

コードを記述する言語に応じて、リクエストを正常に終了する方法や、実行中に発生したエラーを AWSLambda に通知する方法が異なります。関数を同期的に呼び出した場合、AWS Lambda はその結果をクライアントに転送します。

Note

Lambda 関数コードは、ステートレススタイルで記述する必要があり、基になるコンピューティングインフラストラクチャとのアフィニティはありません。コードでは、ローカルファイルシステムへのアクセス、子プロセス、その他類似のアーティファクトはリクエストの有効期限に限定されます。永続的な状態は Amazon S3、Amazon DynamoDB、または別のクラウドストレージサービスに保存する必要があります。関数がステートレスであることを要求すると、AWSLambda は関数のコピーを必要なだけ呼び出し、受信イベントとリクエストのレートに合わせてスケールできます。これらの関数はリクエストのたびに同じコンピューティングインスタンスで実行されるとは限りません。Lambda 関数の特定のインスタンスが、AWS Lambda で複数回使用される可能性があります。詳細については、「AWS Lambda 関数を使用する際のベストプラクティス (p. 399)」を参照してください。

詳細については、次の言語固有のトピックで説明しています。

• プログラミングモデル (Node.js) (p. 20)• Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)• C# で Lambda 関数を作成するためのプログラミングモデル (p. 75)• Python で Lambda 関数を作成するためのプログラミングモデル (p. 58)• Go で Lambda 関数を作成するためのプログラミングモデル (p. 66)

プログラミングモデル (Node.js)AWS Lambda は、現在以下の Node.js ランタイムをサポートしています。

• Node.js ランタイム v8.10 (ランタイム = nodejs8.10)• Node.js ランタイム v6.10 (ランタイム = nodejs6.10)• Node.js ランタイム v4.3 (ランタイム = nodejs4.3)• Node.js ランタイム v0.10.42 (ランタイム = nodejs)*

Important

*Node v0.10.42 は現在廃止の対象となっています。詳細については、「ランタイムサポートポリシー (p. 403)」を参照してください。できるだけ早く、既存の関数を AWS Lambda で使用できる新しい Node.js ランタイムバージョン (nodejs.8.10、nodejs6.10 または nodejs4.3) に移行する必要があります。Node v0.10.42 ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。v0.10.42 ランタイムのプログラミングモデルの差異については、「以前の Node.js ランタイム v0.10.42 を使用する (p. 31)」を参照してください。

Lambda 関数を作成する際、使用するランタイムを指定します。詳細については、「CreateFunction (p. 425)」の runtime パラメーターを参照してください。

以下のセクションでは、Lambda 関数のコードを Node.js で記述する際に、一般的なプログラミングパターンと主要概念 がどのように適用されるかについて説明します。以下のセクションで説明されているプ

20

Page 27: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

ログラミングモデルは、特に明記されていない限り、サポートされているすべてのランタイムバージョンに適用されます。

トピック• Lambda 関数ハンドラー (Node.js) (p. 21)• Context オブジェクト (Node.js) (p. 23)• ログ作成 (Node.js) (p. 26)• 関数エラー (Node.js) (p. 28)• 以前の Node.js ランタイム v0.10.42 を使用する (p. 31)

Lambda 関数ハンドラー (Node.js)

AWS Lambda は handler オブジェクトを介して Lambda 関数を呼び出します。A handler は Lambda関数を表します (また、AWS Lambda が関数コードの実行に使用するエントリポイントとしての機能します)。以下に例を示します。

exports.myHandler = function(event, context) { ...}

• myHandler – これは AWS Lambda が呼び出す関数の名前です。このコードを helloworld.js という名前で保存したとします。この場合、myHandler は Lambda 関数コードが含まれている関数であり、helloworld はデプロイパッケージを表すファイルの名前です。詳細については、「デプロイパッケージの作成 (Node.js) (p. 86)」を参照してください。

AWS Lambda は、2 つの呼び出しタイプをサポートします。• RequestResponse、または synchronous execution: AWS Lambda は、Lambda 関数を呼び出す

クライアントに対する関数呼び出しの結果を返します。Lambda 関数のハンドラコードで戻り値が指定されていない場合、AWS Lambda は自動的にその値に null を返します。

• Event、または 非同期実行: AWS Lambda は関数呼び出しの結果を破棄します。

Note

Lambda 関数が非同期呼び出しを使用したイベントを処理していない場合、「デッドレターキュー (p. 398)」を使用して障害を調査できます。

イベントソースは、サポートされている AWS サービスまたは Lambda 関数を呼び出すカスタムアプリケーションを対象にすることができます。例については、「イベントソースによって公開されたサンプルイベント (p. 170)」を参照してください。

• context - AWS Lambda はこのパラメータを使用して、Lambda 関数の実行の詳細を指定します。詳細については、「Context オブジェクト (Node.js) (p. 23)」を参照してください。

コールバックパラメーターを使用する

Node.js ランタイム v4.3、v6.10 および v8.10 はオプションで callback パラメータをサポートします。これを使用して、明示的に呼び出し元に情報を返すことができます。一般的な構文:

callback(Error error, Object result);

各パラメーターの意味は次のとおりです。

• error – オプションのパラメーターであり、Lambda 関数の失敗した実行結果を提供するために使用できます。Lambda 関数が成功すると、最初のパラメーターとして NULL を渡すことができます。

21

Page 28: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• result – オプションのパラメーターであり、関数の正常な実行結果を提供するために使用できます。提供される result は、JSON.stringify と互換性がある必要があります。エラーになる場合、このパラメーターは無視されます。

コードで callback を使用しない場合は、AWS Lambda はそれを暗黙的に呼び出し、戻り値は null です。

コールバックが (明示的または暗黙的に) 呼び出されると、AWS Lambda は のイベントループが空になるまで、Lambda 関数の呼び出しを続けます。

次にコールバックの例を示します。

callback(); // Indicates success but no information returned to the caller.callback(null); // Indicates success but no information returned to the caller.callback(null, "success"); // Indicates success with information returned to the caller.callback(error); // Indicates error with error information returned to the caller.

AWS Lambda は処理された例外として、error パラメータの Null 以外の値を処理します。

次の点に注意してください。

• Lambda 関数の呼び出し時に指定される呼び出しタイプにかかわらず (「Invoke (p. 463)」を参照)、コールバックメソッドは error の NULL 以外の値を表す文字列形式を Lambda 関数に関連付けられたAmazon CloudWatch Logs ストリームに記録します。

• Lambda 関数が同期的に (RequestResponse呼び出しタイプを使用して) 呼び出された場合、コールバックは次のようにレスポンス本文を返します。• error が Null の場合は、レスポンス本文は result の文字列表現に設定されます。• error が NULL 以外の場合は、error 値にはレスポンス本文が入力されます。

Note

callback(error, null) (および callback(error)) が呼び出された場合、Lambda はエラーオブジェクトの最初の 256 KB を記録します。大きなエラーオブジェクトの場合、AWSLambda はログを切り捨て、エラーオブジェクトの横に、テキスト「Truncated by Lambda」が表示されます。

ランタイムバージョン 8.10 を使用している場合は、async キーワードを含めることができます。

exports.myHandler = async function(event, context) { ... // return information to the caller. }

次の Node.js のコード例を考えます。

exports.myHandler = function(event, context, callback) { console.log("value1 = " + event.key1); console.log("value2 = " + event.key2); callback(null, "some success message"); // or // callback("some error type"); }

この例では、myHandler という 1 つの関数があります。

22

Page 29: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

この関数では、console.log() ステートメントが受信イベントデータの一部を CloudWatch Logs にログ記録します。callback パラメータが呼び出されると、Lambda 関数は渡されたイベントループが空になった場合にのみ終了します。

v8.10 ランタイムによって提供される async 機能を使用する場合は、次のコードサンプルを検討してください。

exports.myHandler = async function(event, context) { console.log("value1 = " + event.key1); console.log("value2 = " + event.key2); return "some success message”; // or // throw new Error(“some error type”); }

Note

廃止されたランタイム v0.10.42 を使用している場合は、コンテキストメソッド(done、succeed、および fail) を使用して Lambda 関数を正しく終了する必要があります。詳細については、「以前の Node.js ランタイム v0.10.42 を使用する (p. 31)」を参照してください。

このコードを Lambda 関数としてアップロードしてテストするには (コンソール)

1. コンソールで、以下の情報を使用して Lambda 関数を作成します。

• hello-world 設計図を使用します。• この例では nodejs6.10 をランタイムとして使用しますが、nodejs8.10 または nodejs4.3 を選択する

こともできます。提供されているコードサンプルはどのバージョンでも動作します。

コンソールを使用して Lambda 関数を作成する手順については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

2. テンプレートコードをこのセクションで提供されているコードに置換し、関数を作成します。3. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関

数をテストします。

Context オブジェクト (Node.js)

Lambda 関数の実行中に、AWS Lambda とやり取りをして次のような有益なランタイム情報を入手できます。

• AWS Lambda が Lambda 関数を終了するまでの残り時間 (タイムアウトは Lambda 関数の設定プロパティの 1 つです)。

• 実行中の Lambda 関数に関連付けられた CloudWatch ロググループとログのストリーム。• Lambda 関数を呼び出したクライアントに返された AWS リクエスト ID。AWS サポートで、フォロー

アップの問い合わせにリクエスト ID を使用できます。• Lambda 関数が AWS Mobile SDK を通して呼び出された場合は、Lambda 関数を呼び出すモバイルアプ

リケーションの詳細を知ることができます。

AWS Lambda はこの情報を、サービスが Lambda 関数ハンドラーに 2 番目のパラメータとして渡す context オブジェクトを介して提供します。詳細については、「Lambda 関数ハンドラー(Node.js) (p. 21)」を参照してください。

以下のセクションでは、context オブジェクトを使用する Lambda 関数の例を説明し、その後使用可能なすべてのメソッドおよび属性をリストします。

23

Page 30: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

次の Node.js の例を考えます。ハンドラーは context パラメータを介してランタイム情報を受け取ります。

console.log('Loading function');

exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2)); console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); console.log('remaining time =', context.getRemainingTimeInMillis()); console.log('functionName =', context.functionName); console.log('AWSrequestID =', context.awsRequestId); console.log('logGroupName =', context.log_group_name); console.log('logStreamName =', context.log_stream_name); console.log('clientContext =', context.clientContext); if (typeof context.identity !== 'undefined') { console.log('Cognito identity ID =', context.identity.cognitoIdentityId); } callback(null, event.key1); // Echo back the first key value // or // callback("some error type"); };

この例では、ハンドラーコードは Lambda 関数のランタイム情報の一部を CloudWatch にログ記録します。Lambda コンソールを使用して関数を呼び出した場合は、コンソールの [Log output] セクションにログが表示されます。このコードを使用して Lambda 関数を作成し、コンソールを使用してその関数をテストできます。

AWS Lambda コンソールでこのコードをテストするには

1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。[runtime] で、[nodejs6.10]を選択します。これを行う手順については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

2. 関数をテストし、コードを更新してより詳細な context 情報を入手できます。

Context オブジェクトメソッド (Node.js)

context オブジェクトでは次のメソッドを提供します。

context.getRemainingTimeInMillis()

現在実行中の Lambda 関数の残りの概算実行時間 (タイムアウトが発生するまで) を返します。タイムアウトは Lambda 関数の設定の 1 つです。タイムアウトに達すると、AWS Lambda は Lambda 関数を終了します。

このメソッドを使用して、関数の実行中に残りの時間を確認し、実行時間内に適切な修正措置を取ることができます。

一般的な構文:

context.getRemainingTimeInMillis();

Context オブジェクトのプロパティ (Node.js)

context オブジェクトは、更新が可能な次のプロパティを提供します。

24

Page 31: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

callbackWaitsForEmptyEventLoop

デフォルト値は True です。このプロパティはコールバックメソッドのデフォルト動作を変更する場合にのみ使用できます。デフォルトでは、コールバックはイベントループが空になるまで待機してから処理を停止し、呼び出し元に結果を返します。このプロパティを false に設定して、イベントループにイベントがある場合でも、callback が呼び出されたすぐ後に処理を停止するように AWSLambda にリクエストできます。AWS Lambda は、 イベントループ内の処理、任意の状態のデータおよびイベントを停止します (イベントループに残っているイベントは、Lambda 関数が次に呼び出され、AWS Lambda が停止された処理を使用することを選択したときに処理されます)。コールバックの詳細については、「コールバックパラメーターを使用する (p. 21)」を参照してください。

また、context オブジェクトはランタイム情報を取得するために使用できる次のプロパティを提供します。

functionName

実行中の Lambda 関数の名前。functionVersion

実行中の Lambda 関数のバージョン。エイリアスを使用して関数を呼び出した場合、function_version はエイリアスが指すバージョンになります。

invokedFunctionArn

この関数の呼び出しに使用された ARN。関数 ARN またはエイリアス ARN を指定できます。非修飾ARN は $LATEST バージョンを実行し、エイリアスはそれが指定する関数のバージョンを実行します。

memoryLimitInMB

Lambda 関数に対して設定したメモリ制限 (MB 単位)。Lambda 関数の作成時にメモリ制限を設定します。後で変更できます。

awsRequestId

リクエストに関連付けられた AWS リクエスト ID。invoke メソッドを呼び出したクライアントに返される ID です。

Note

AWS Lambda が呼び出しを再試行する場合 (たとえば、Kinesis レコードを処理する Lambda関数が例外をスローする状況)、リクエスト ID は同じままです。

logGroupName

Lambda 関数によって書き込まれたログがある CloudWatch ロググループの名前。logStreamName

Lambda 関数によって書き込まれたログがある CloudWatch ロググループの名前。ログストリームは、Lambda 関数の呼び出しごとに変わる場合と、そうでない場合があります。

Lambda 関数がログストリームを作成できない場合、この値は Null になります。これは、Lambda 関数に必要なアクセス権限を付与する実行ロールに、CloudWatch アクションのアクセス権限が含まれていない場合に発生することがあります。

identity

AWS Mobile SDK を通じて呼び出された場合の、Amazon Cognito ID プロバイダーについての情報。null とすることができます。• identity.cognitoIdentityId

25

Page 32: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• identity.cognitoIdentityPoolId

特定のモバイルプラットフォーム向けの正確な値については、AWS Mobile SDK for iOS DeveloperGuideのIdentity Context、およびAWS Mobile SDK for Android Developer GuideのIdentity Contextを参照してください。

clientContext

AWS Mobile SDK を通じて呼び出されたクライアントアプリケーションとデバイスに関する情報。null とすることができます。clientContext を使用して、次の情報を入手できます。• clientContext.client.installation_id• clientContext.client.app_title• clientContext.client.app_version_name• clientContext.client.app_version_code• clientContext.client.app_package_name• clientContext.Custom

モバイルクライアントアプリケーションで設定されたカスタム値。• clientContext.env.platform_version• clientContext.env.platform• clientContext.env.make• clientContext.env.model• clientContext.env.locale

特定のモバイルプラットフォーム向けの正確な値については、AWS Mobile SDK for iOS DeveloperGuideのClient Context、およびAWS Mobile SDK for Android Developer GuideのClient Contextを参照してください。

ログ作成 (Node.js)

Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログをCloudWatch に書き込みます。Lambda コンソールを使用して Lambda 関数を呼び出すと、コンソールに同じログが表示されます。

次の Node.js ステートメントがログエントリを生成します。

• console.log()

• console.error()

• console.warn()

• console.info()

たとえば、次の Node.js コードの例を考えます。

• 最初のサンプルはランタイムバージョン 6.10 または 4.3 のいずれかを使用して作成できます。

console.log('Loading function');

exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2)); console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); callback(null, event.key1); // Echo back the first key value

26

Page 33: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

};

• 2 番目の例では、Node.js のランタイムバージョン 8.10 以降でのみ使用できる async 機能を使用します。

console.log('Loading function');

exports.handler = async function(event) { //console.log('Received event:', JSON.stringify(event, null, 2)); console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); return event.key1 // Echo back the first key value };

いずれの場合も、次のスクリーンショットは、Lambda コンソールの [ログ出力] セクションの例を示します。CloudWatch Logs でも同じ情報を調べることができます。詳細については、「AWS Lambda のAmazon CloudWatch ログへのアクセス (p. 331)」を参照してください。

コンソールでは関数の呼び出し時に RequestResponse 呼び出しタイプ (同期呼び出し) が使用されるため、戻り値 (value1) が AWS Lambda から取得され、コンソールに表示されます。

前述の Node.js コードを AWS Lambda コンソールでテストするには

1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。必ず、[runtime] に Node.jsを選択してください。これを行う手順については、 「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

27

Page 34: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

2. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関数をテストします。また、コードを更新して、このセクションで説明した他のログ記録メソッドやプロパティをテストできます。

手順については、「ご利用開始にあたって (p. 3)」を参照してください。

ログの検索

Lambda 関数が書き込んだログは、次のように確認できます。

• AWS Lambda コンソール – AWS Lambda コンソールの [Log output] セクションにログが表示されます。

• レスポンスヘッダー、Lambda 関数をプログラムで呼び出した場合 – Lambda 関数をプログラムで呼び出した場合は、LogType パラメーターを追加して、CloudWatch ログに書き込まれるログデータの最後の 4 KB を取得できます。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返します。詳細については、呼び出しを参照してください。

AWS CLI を使用して関数を呼び出した場合は、 --log-type parameter を値 Tail とともに指定して同じ情報を取得できます。

• CloudWatch ログ – CloudWatch でログを確認するには、ロググループ名とログストリーム名を把握しておく必要があります。コードに context.logGroupName メソッドと context.logStreamNameメソッドを追加することで、この情報を取得できます。Lambda 関数を実行すると、コンソールまたはCLI の結果ログが、ロググループ名およびログストリーム名を表示します。

関数エラー (Node.js)Lambda 関数が正常に実行できなかったことを AWS Lambda に通知すると、Lambda はエラーオブジェクトを文字列に変換しようとします。次の例を考えます。

console.log('Loading function');

exports.handler = function(event, context, callback) { // This example code only throws error. var error = new Error("something is wrong"); callback(error); };

この Lambda 関数を呼び出すと、関数の実行がエラーで終了したことが AWS Lambda に通知され、エラー情報が AWS Lambda に渡されます。AWS Lambda はクライアントにエラー情報を返します。

{ "errorMessage": "something is wrong", "errorType": "Error", "stackTrace": [ "exports.handler (/var/task/index.js:10:17)" ]}

Node.js ランタイムバージョン 8.10 の非同期機能を使用して関数を作成する場合も同じ結果が得られます。例:

exports.handler = async function(event, context) { function AccountAlreadyExistsError(message) { this.name = "AccountAlreadyExistsError"; this.message = message; } AccountAlreadyExistsError.prototype = new Error();

28

Page 35: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

const error = new AccountAlreadyExistsError("Account is in use!"); throw error};

この Lambda 関数が呼び出されると、やはり関数の実行がエラーで終了したことが AWS Lambda に通知され、エラー情報が AWS Lambda に渡されます。AWS Lambda はクライアントにエラー情報を返します。

{ "errorMessage": "Acccount is in use!", "errorType": "Error", "stackTrace": [ "exports.handler (/var/task/index.js:10:17)" ]}

スタックの stackTrace JSON 配列が要素をトレースするときに、エラー情報が返されることに注意してください。

返されるエラー情報の取得方法は、関数呼び出し時にクライアントが指定する呼び出しタイプによって決まります。

• クライアントが RequestResponse 呼び出しタイプ (同期実行です) を指定した場合、呼び出しを行ったクライアントに結果が返ります。

たとえば、コンソールは常に RequestResponse 呼び出しタイプを使用するため、[Execution result] セクションに次のようなエラーが表示されます。

同じ情報は、CloudWatch にも送信され、[Log output] セクションに同じログが表示されます。

29

Page 36: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• クライアントが Event 呼び出しタイプ (非同期実行です) を指定した場合は、AWS Lambda は何も返しません。代わりに、CloudWatch Logs にエラー情報がログ記録されます。CloudWatch メトリクスでエラーメトリクスを確認することもできます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。たとえば、Kinesis がイベントソースである場合、AWS Lambda は Lambda 関数が成功するかストリームのレコードの有効期限が切れるまで、エラーになった呼び出しを再試行します。再試行の詳細については、「再試行動作について (p. 160)」を参照してください。

前述の Node.js コード (コンソール) をテストするには

1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。[runtime] で [Node.js] を選択し、[Role] で [Basic execution role] を選択します。これを行う手順については、「シンプルなLambda 関数を作成する (p. 9)」を参照してください。

2. テンプレートコードをこのセクションで提供されたコードに置き換えます。3. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関

数をテストします。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions StateMachine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

• タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。• 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ス

テートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。Node.js のカスタムエラーでは、エラープロトタイプを拡張する必要があることに注意してください。

exports.handler = function(event, context, callback) { function AccountAlreadyExistsError(message) { this.name = "AccountAlreadyExistsError"; this.message = message; } AccountAlreadyExistsError.prototype = new Error(); const error = new AccountAlreadyExistsError("Account is in use!"); callback(error);};

Catch ルールを使用してエラーをキャッチするように Step Functions を設定できます。

{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [

30

Page 37: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

{ "ErrorEquals": ["AccountAlreadyExistsError"], "Next": "SuggestAccountName" } ] }, … }}

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおりSuggestAccountName 状態に移行します。

Note

Error オブジェクトの名前プロパティは、ErrorEquals 値と一致する必要があります。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル (p. 19) でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

以前の Node.js ランタイム v0.10.42 を使用する

2017 年 5 月時点で、AWS Lambda は Node.js 6.10 および Node.js 4.3 をサポートしています。Lambda関数の作成時にこのランタイムを指定する方法については、「CreateFunction (p. 425)」の --runtimeパラメーターを参照してください。

Node v0.10.42 は現在廃止の対象となっています。詳細については、「ランタイムサポートポリシー (p. 403)」を参照してください。できるだけ早く、既存の関数を AWS Lambda で使用できる新しい Node.js ランタイムバージョン (nodejs.8.10、nodejs6.10 または nodejs4.3) に移行する必要があります。Node v0.10.42 ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。次のセクションでは、AWS Lambda のランタイムサポートポリシーについて説明します。併せて、ランタイム v0.10.42 に固有の動作、および既存の関数を新しいバージョン (nodejs4.3 または nodejs6.10) にできる限り早く移行する方法についても説明します。移行するか、延長を取得しない場合、Node v0.10.42ランタイムで作成された関数を呼び出すと、無効なパラメーター値のエラーが発生します。Node v0.10.42ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。以下のセクションでは、ランタイム v0.10.42 固有の動作、および既存の関数を新しいバージョンに移行する方法について説明します。

トピック• Lambda 関数コードの新しいランタイムへの移行 (p. 31)• Node.js ランタイム v0.10.42 のコンテキストメソッド (p. 33)

Lambda 関数コードの新しいランタイムへの移行

Node v0.10.42 は現在廃止の対象となっています。詳細については、「ランタイムサポートポリシー (p. 403)」を参照してください。できるだけ早く、既存の関数を AWS Lambda で使用できる新しいNode.js ランタイムバージョン (nodejs.8.10、nodejs6.10 または nodejs4.3) に移行する必要があります。移行するか、延長を取得しない場合、Node v0.10.42 ランタイムで作成された関数を呼び出すと、無効なパラメーターのエラーが発生します。Node v0.10.42 ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。

以下のセクションでは、既存の Lambda 関数のコードを新しいランタイムに移行する方法について説明します。

31

Page 38: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

1. すべての既存の Lambda 関数を確認して移行計画立てます。関数のリストとそのバージョンおよびエイリアスは次の方法で取得できます。

設計図を使用して Lambda 関数を一覧表示する方法については、「ランタイム更新設計図を使用したLambda 関数の一覧表示と新しいランタイムへの更新 (p. 33)」を参照してください。

コンソールを使用して Lambda 関数をリストするには:a. AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。b. [Runtime] 列を選択します。これにより、そのリージョンのすべての Lambda 関数がランタイム値で

ソートされます。c. 各 Lambda 関数を Node.js のランタイム値を使用して開き、[Configuration] タブを選択します。d. [Qualifiers] ドロップダウンリストを選択します。e. 各バージョンを選択し、ランタイムを表示します。f. 各エイリアスを選択し、それが示すバージョンを表示します。g. 必要に応じて、各リージョンで上記のステップを繰り返します。

2. 各関数で以下を行います。a. 最初に手動で、または UPDATE モードで nodejs-upgrade-functions 設計図を実行してランタイムを

更新します (詳細については、「ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新 (p. 33)」を参照してください)。コンテキストメソッドをすべて更新しコールバックアプローチに置き換えることを強く推奨します。詳細については、「Node.js ランタイムv0.10.42 のコンテキストメソッド (p. 33)」を参照してください。

b. テストを実行して、Lambda 関数の動作が内部検証に合格することを検証します。失敗する場合は、新しいランタイムで動作するように Lambda コードを更新する必要がある場合があります。• Node.js v6.10 での変更リストは、GitHub の Breaking changes between v5 and v6 を参照してくだ

さい。• Node.js v4.3 での変更リストは、GitHub のAPI changes between v0.10 and v4を参照してくださ

い。c. 関数が正常に呼び出されると、移行は完了です。

3. 既存の関数のバージョンおよびエイリアスを確認します。各関数のバージョンのリストを取得するには、「Lambda コンソールを使用した Lambda 関数の一覧表示と新しいランタイムへの更新 (p. 33)」または「ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新 (p. 33)」を使用します。このようなバージョンごとに以下を行います。a. $LATEST にコードをコピーします。b. 上記のステップ 2 からプロセスを繰り返します。c. 新しいバージョンとして完了したら、コードを再発行します。d. 現在古いバージョンを指すエイリアスがあれば、新しく発行されたバージョンに更新します。e. 古いバージョンを削除します。

CLI を使用した Lambda 関数の一覧表示とランタイムの更新

ListFunctions (p. 477) コマンドを使用して、すべての Lambda 関数のリストを取得し、そこから v0.10ランタイムで作成されたものをリストできます。次のコード例はそれを行う方法を示しています。

#!/bin/bash

for REGION in $(aws ec2 describe-regions --output text --query 'Regions[].[RegionName]' | egrep -v 'ca-central-1|sa-east-1' | sort); do echo "...checking $REGION" echo " nodejs0.10 functions: " for i in $(aws lambda list-functions --output json --query 'Functions[*].[FunctionName, Runtime]' --region $REGION | grep -v nodejs4.3 | grep -v nodejs6.10 | grep -B1 nodejs | grep , | sort); do echo " -> $i"

32

Page 39: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

donedone

echo "This script only accounts for the \$LATEST versions of functions. You may need to take a closer look if you are using versioning."

返された各 Lambda 関数 (v0.10 ランタイムを使用して作成されたもの)で、UpdateFunctionConfiguration (p. 515) コマンドを使用し、--runtime 値を nodejs4.3 またはnodejs6.10 に設定します。

Lambda コンソールを使用した Lambda 関数の一覧表示と新しいランタイムへの更新

• AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。• [Runtime] タブを選択します。これにより、そのリージョンのすべての Lambda 関数がランタイム値で

ソートされます。• 各 Lambda 関数を node.js のランタイム値を使用して開き、[Configuration] タブを選択します。• [ランタイム] の値を [Node.js 4.3]、[Node.js 6.10] または [Node.js 8.10] に設定します。• 必要に応じて、各リージョンでこのプロセスを繰り返します。

ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新

• AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。• [Create a Lambda Function] を選択します。• nodejs-upgrade-functions 設計図を選択し、これを使用して関数を作成します。• 関数では、次の環境変数を使用できます。

• [MODE] = [List] または [Backup] または [Upgrade]• [TARGET_RUNTIME] = [nodejs4.3]、[nodejs6.10] または [nodejs8.10]。• [EXCLUDED] = 処理から除外する関数名のカンマ区切りのリスト (リストにスペースを含めないでく

ださい)• 関数とバージョンのリストを取得するには、変数値を変更せずにコンソールから関数を呼び出します。• アップグレードする前に関数をバックアップするには、[MODE] の値を [Backup] に変更し、コンソール

から関数を呼び出します。関数をアップグレードする前に、これを実行することを強くお勧めします。• 関数のランタイム値を更新するには、[MODE] の値を [Upgrade] に変更し、コンソールから関数を呼び

出します。• 必要に応じて、各リージョンでこのプロセスを繰り返します。• 以下の点に注意してください。

• 設計図で、既存の Node.js v1.0 関数がバージョンとして保存され、選択したバージョンに応じて、$LATEST が nodejs4.3、nodejs6.10 または nodejs8.10 に更新されます。関数のその他のバージョンをアップグレードできます。このバージョン情報を使用して、既存のアプリケーションバージョンでそのバージョンを指すことができます。

• 設計図によりエイリアスは変更されません。その関数を指すエイリアスは新しいバージョンに再マッピングする必要があります。詳細については、「AWS Lambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

Node.js ランタイム v0.10.42 のコンテキストメソッド

Node.js ランタイム v0.10.42 では、これより新しいランタイムではサポートされている Lambda 関数のコールバックパラメータがサポートされていません。ランタイム v0.10.42 を使用する場合、以下のコンテキストオブジェクトメソッドを使用して Lambda 関数を正しく終了させます。コンテキストオブジェクトでは、Lambda 関数を終了させるために使用できるメソッドとして done()、succeed()、およびfail() をサポートしています。これらのメソッドは下位互換性のためにランタイム v4.3、v6.10、v8.10

33

Page 40: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

の新しいランタイムにもあります。コードを移行して更新後のランタイムを使用する方法については、「Lambda 関数コードの新しいランタイムへの移行 (p. 31)」を参照してください。

context.succeed()

Lambda 関数の実行と、すべてのコールバックが正常に完了したことを示します。この一般的な構文を次に示します。

context.succeed(Object result);

各パラメーターの意味は次のとおりです。

result – オプションのパラメーターであり、関数の実行結果を提供するために使用できます。

提供される result は、JSON.stringify と互換性がある必要があります。AWS Lambda が文字列化に失敗するか、別のエラーが発生した場合、X-Amz-Function-Error レスポンスヘッダーが Unhandledに設定されて、処理されない例外がスローされます。

パラメータなしでこのメソッドを呼び出す (succeed()) か、null 値を渡す (succeed(null)) ことができます。

このメソッドの動作は、Lambda 関数の呼び出しで指定された呼び出しタイプによって異なります。呼び出しタイプの詳細については、「Invoke (p. 463)」を参照してください。

• Lambda 関数が Event 呼び出しタイプ (非同期呼び出し) を使用して呼び出された場合、メソッドはHTTP status 202, request accepted という応答を返します。

• RequestResponse 呼び出しタイプを使用して Lambda 関数が呼び出された場合、このメソッドはHTTP ステータス 200 (OK) を返し、レスポンス本文を result を表す文字列に設定します。

context.fail()

Lambda 関数の実行とすべてのコールバックが成功せずに完了し、処理された例外となったことを示します。一般的な構文を以下に示します。

context.fail(Error error);

各パラメーターの意味は次のとおりです。

error – オプションのパラメーターであり、Lambda 関数の実行結果を提供するために使用できます。

error 値が Null 以外の場合、メソッドはレスポンス本文を error の文字列表現に設定し、対応するログを CloudWatch に書き込みます。AWS Lambda が文字列化に失敗するか、別のエラーが発生した場合、X-Amz-Function-Error ヘッダーが Unhandled に設定されて、処理されないエラーが発生します。

Note

context.fail(error) および context.done(error, null) からのエラーの場合、Lambda はエラーオブジェクトの最初の 256 KB を記録します。大きなエラーオブジェクトの場合、AWS Lambda はエラーを切り捨て、エラーオブジェクトの横に、テキスト「Truncated by Lambda」が表示されます。

パラメータなしでこのメソッドを呼び出す (fail()) か、null 値を渡す (fail(null)) ことができます。

context.done()

Lambda 関数の実行を終了させます。

34

Page 41: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

Note

このメソッドは、"エラーファースト" コールバック設計パターンの使用を許可して、succeed()および fail() メソッドを補完します。追加の機能は提供しません。

一般的な構文:

context.done(Error error, Object result);

各パラメーターの意味は次のとおりです。

• error – オプションのパラメーターであり、Lambda 関数の失敗した実行結果を提供するために使用できます。

• result – オプションのパラメーターであり、関数の正常な実行結果を提供するために使用できます。提供される result は、JSON.stringify と互換性がある必要があります。エラーになる場合、このパラメーターは無視されます。

パラメータなしでこのメソッドを呼び出す (done()) か、null 値を渡す (done(null)) ことができます。

AWS Lambda は処理された例外として、error パラメータの Null 以外の値を処理します。

関数の動作は、Lambda 呼び出し時に指定された呼び出しタイプによって異なります。呼び出しタイプの詳細については、「Invoke (p. 463)」を参照してください。

• 呼び出しタイプにかかわらず、このメソッドは error の Null 以外の値を表す文字列を Lambda 関数に関連付けられた Amazon CloudWatch Logs ストリームに記録します。

• Lambda 関数が RequestResponse (同期型) を使用して呼び出された場合、このメソッドは次のようにレスポンス本文を返します。• error が Null の場合は、レスポンス本文を result の JSON 表現に設定します。これはcontext.succeed() に似ています。

• error が Null ではない場合、または error 型の単一の引数を使用して関数が呼び出された場合は、error 値がレスポンス本文に入力されます。

Note

done(error, null) および fail(error) の両方からエラーの場合、Lambda はエラーオブジェクトの最初の 256 KB を記録します。大きなエラーオブジェクトの場合、AWS Lambda はログを切り捨て、エラーオブジェクトの横にテキスト「Truncated by Lambda」が表示されます。

コンテキストメソッドとコールバックメソッドの比較

以前に Node.js ランタイム v0.10.42 を使用して Lambda 関数を作成した場合は、context オブジェクトメソッド (done()、succeed()、およびfail()) のいずれかを使用して Lambda 関数を終了する必要があります。Node.js ランタイム v4.3、v6.10 および v8 では、これらのメソッドは主に下位互換性のためにサポートされています。callback (「コールバックパラメーターを使用する (p. 21)」を参照) を使用することをお勧めします。以下は context オブジェクトメソッドと同等の callback の例です。

• 次の例では、context.done() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

// Old way (Node.js runtime v0.10.42).context.done(null, 'Success message');

// New way (Node.js runtime v4.3, v6.10 or v8.10)context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');

35

Page 42: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

Important

パフォーマンス上の理由により、AWS Lambda が複数の Lambda 関数の実行で同じ Node.js 処理を再利用することがあります。その場合は、実行と実行の合間は AWS Lambda は実行を継続するために必要な状態情報を維持しながら Node 処理を停止させます。context メソッドが呼び出されると、AWS Lambda はプロセスに関連するイベントループが空になるまで待機せずに、Node プロセスをただちに停止します。プロセスの状態とイベントループのイベントは停止されます。関数が再度呼び出され、AWS Lambda が停止したプロセスを再利用する場合、同じ共通状態で関数の実行が継続されます (たとえば、イベントループに残ったイベントの処理が開始されます)。ただし、コールバックを使用する場合、AWSLambda はイベントループが空になるまで Lambda 関数の実行を継続します。イベントループのすべてのイベントが処理されたら、AWS Lambda は Lambda 関数内のすべての状態変数を含めた Node 処理を停止します。したがって、コンテキストメソッドで同じ動作を行うには、context オブジェクトプロパティである callbackWaitsForEmptyEventLoop を falseに設定する必要があります。

• 次の例では、context.succeed() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

// Old way (Node.js runtime v0.10.42).context.succeed('Success message');

// New way (Node.js runtime v4.3, v6.10 or v8.10).context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');

• 次の例では、context.fail() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

// Old way (Node.js runtime v0.10.42).context.fail('Fail object');

// New way (Node.js runtime v4.3 or v6.10).context.callbackWaitsForEmptyEventLoop = false; callback('Fail object', 'Failed result');

Java で Lambda 関数を作成するためのプログラミングモデル以下のセクションでは、Lambda 関数のコードを Java で記述する際に、一般的なプログラミングパターンと主要概念がどのように適用されるかについて説明します。

トピック• Lambda 関数ハンドラー (Java) (p. 37)• Context オブジェクト (Java) (p. 47)• ロギング (Java) (p. 49)• 関数エラー (Java) (p. 53)• 以前のカスタム appender を Log4j™1.2 に使用する (推奨されません) (p. 55)• (オプション) Java で Lambda 関数を作成する (p. 57)

さらに、AWS Lambda では以下のライブラリが提供されています。

• aws-lambda-java-core – このライブラリでは、Context オブジェクトである RequestStreamHandlerと RequestHandler インターフェイスが提供されています。Context オブジェクト (Context オブジェクト (Java) (p. 47)) は、Lambda 関数に関するランタイム情報を提供します。事前定義されているインターフェイスは、Lambda 関数ハンドラーを定義する 1 つの方法を提供します。詳細について

36

Page 43: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

は、「ハンドラー作成用に事前定義されているインターフェイスの利用 (Java) (p. 43)」を参照してください。

• aws-lambda-java-events – このライブラリでは、Amazon S3、Kinesis、Amazon SNS、および AmazonCognito によって発行されるイベントを処理する Lambda 関数を記述する際に使用できる、事前定義されたタイプが提供されています。これらのクラスは、独自のカスタムシリアル化ロジックを書くことなく、イベントを処理するのに役立ちます。

• Log4j2.8 のカスタム Appender – Lambda 関数からのログ記録用に AWS Lambda で提供されているカスタム Log4j (「Apache Log4j 2」を参照) を使用できます。log.debug() や log.error() などのLog4j メソッドを呼び出すたびに、CloudWatch Logs イベントが発生します。カスタム Appender はLambdaAppender と呼ばれ、log4j2.xml ファイルで使用する必要があります。展開パッケージ (.jar ファイル) に aws-lambda-java-log4j2 アーティファクト (artifactId:aws-lambda-java-log4j2) を含める必要があります。詳細については、「ロギング (Java) (p. 49)」を参照してください。

• Log4j1.2 のカスタム Appender – Lambda 関数からのログ記録用に AWS Lambda で提供されているカスタム Log4j (「Apache Log4j 1.2」を参照) を使用できます。詳細については、「ロギング(Java) (p. 49)」を参照してください。

Note

Log4j v1.2 カスタム appender のサポートには、End-of-Life がマークされています。開発中の更新は受け取らず、使用することはお勧めしません。

これらのライブラリは Maven セントラルリポジトリを介して利用でき、GitHub にもあります。

Lambda 関数ハンドラー (Java)Lambda 関数を作成するときに、サービスでユーザーに代わって Lambda 関数を実行するときに、AWSLambda が呼び出すことができるハンドラーを指定します。

Lambda は、ハンドラーを作成するための 2 つの方法をサポートします。

• インターフェイスを実装しないで直接ハンドラーメソッドをロードします。このセクションでは、このアプローチについて説明します。

• aws-lambda-java-core ライブラリ (インターフェイスアプローチ) の一部として提供される標準インターフェースを実装します。詳細については、「ハンドラー作成用に事前定義されているインターフェイスの利用 (Java) (p. 43)」を参照してください。

ハンドラーの一般的な構文は、次のとおりです。

outputType handler-name(inputType input, Context context) { ...}

AWS Lambda が正常にハンドラーを呼び出すためには、input パラメータのデータ型にシリアル化できる入力データで呼び出される必要があります。

構文では、以下の点に注意してください。

• inputType – ハンドラーの最初のパラメーターはハンドラーへの入力です。このパラメーターには、イベントデータ (イベントソースによって発行される) またはユーザーが提供するカスタム入力 (文字列やカスタムデータオブジェクトなど) を指定できます。AWS Lambda がこのハンドラーを正常に呼び出せるようにするには、関数は、input パラメータのデータ型にシリアル化できる入力データとともに呼び出す必要があります。

• outputType – Lambda 関数を同期的に呼び出す (RequestResponse 呼び出しタイプを使用) 場合は、サポートされているいずれかのデータ型を使用して関数の出力を返すことができます。たとえば、Lambda 関数をモバイルアプリケーションのバックエンドとして使用する場合、これを同期的に呼び出しています。出力データ型は JSON にシリアル化されます。

37

Page 44: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

Lambda 関数を非同期的に呼び出す (Event 呼び出しタイプを使用) 計画の場合、outputType は voidである必要があります。たとえば、Amazon S3 や Amazon SNS などのイベントソースとともに AWSLambda を使用する場合、これらのイベントソースは Event 呼び出しタイプを使用して Lambda 関数を呼び出します。

• inputType と outputType は、以下のいずれかとすることができます。• Java プリミティブ型 (文字列、整数など)。• aws-lambda-java-events ライブラリで定義された、事前定義の AWS イベントタイプ。

たとえば、S3Event は、受信する Amazon S3 イベントから簡単に情報を読み取ることができるメソッドを提供するライブラリの、事前定義された POJO の 1 つです。

• 独自の POJO クラスを記述できます。AWS Lambda は、POJO タイプに基づき入出力 JSON を自動的にシリアル化し、逆シリアル化します。

詳細については、「ハンドラーの入出力タイプ (Java) (p. 39)」を参照してください。• 必要でない場合、Context オブジェクトをハンドラーメソッドの署名から省略できます。詳細について

は、「Context オブジェクト (Java) (p. 47)」を参照してください。

たとえば、次の Java コードの例を考えてみます。

package example;

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler;

public class Hello implements RequestHandler<Integer, String>{ public String myHandler(int myCount, Context context) { return String.valueOf(myCount); }}

この例では、入力は整数型で、出力は文字列型です。このコードと依存関係をパッケージ化して Lambda関数を作成する場合は、example.Hello::myHandler (package.class::method-reference) をハンドラー値として指定します。

この例の Java コードでは、ハンドラの最初のパラメーターはハンドラ (myHandler) への入力であり、イベントデータ (Amazon S3 などのイベントソースによって発行される)、整数オブジェクト (この例の場合)などとして指定するカスタム入力、または任意のカスタムデータオブジェクトを指定できます。

この Java コードを使用して Lambda 関数を作成する手順については、「(オプション) Java で Lambda 関数を作成する (p. 57)」を参照してください。

ハンドラーオーバーロードの解決

Java コードに、handler の名前と同じ名前の複数のメソッドが含まれている場合、AWS Lambda は次のルールを使用して、呼び出すメソッドを選択します。

1. 最もパラメータ数が多いメソッドを選択します。2. 複数のメソッドに同じ数のパラメータがある場合、AWS Lambda によって、Context を最後のパラ

メータとして持つメソッドが選択されます。

Context パラメータを持つメソッドがないか、すべてのメソッドがこのパラメータを持つ場合、動作は定義されません。

追加情報

以下のトピックでは、ハンドラーについての詳細情報を示します。

38

Page 45: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• ハンドラーの入出力タイプの詳細については、「ハンドラーの入出力タイプ (Java) (p. 39)」を参照してください。

• 事前定義されているインターフェイスを使用したハンドラーの作成の詳細については、「ハンドラー作成用に事前定義されているインターフェイスの利用 (Java) (p. 43)」を参照してください。

これらのインターフェイスを実装すると、コンパイル時にハンドラーメソッドの署名を検証できます。• Lambda 関数で例外がスローされた場合、AWS Lambda はエラーが発生したことを表す CloudWatch の

メトリクスを記録します。詳細については、「関数エラー (Java) (p. 53)」を参照してください。

ハンドラーの入出力タイプ (Java)

AWS Lambda は、Lambda 関数を実行するときにハンドラーを呼び出します。最初のパラメータはハンドラーへの入力です。これは、イベントデータ (イベントソースによって公開される) または文字列やカスタムデータオブジェクトなど、ユーザーが提供するカスタム入力とすることができます。

AWS Lambda は、ハンドラーの次の入出力タイプをサポートします。

• Java のシンプルな型 (AWS Lambda は、文字列型、整数型、ブール型、マップ型、およびリスト型をサポートします)

• POJO (Plain Old Java Object) 型• ストリーム型 (POJO を使用しない場合、または Lambda のシリアル化のアプローチがニーズに合わな

い場合は、バイトストリーム実装を使用できます)。詳細については、「例: ハンドラーの入出力にストリームを使用する (Java) (p. 42)」を参照してください。

ハンドラーの入出力: 文字列型

次の Java クラスは、入出力に文字列型を使用する myHandler と呼ばれるハンドラーを示します。

package example;

import com.amazonaws.services.lambda.runtime.Context;

public class Hello { public String myHandler(String name, Context context) { return String.format("Hello %s.", name); }}

他のシンプルな Java の型には、類似したハンドラー関数を使用できます。Note

Lambda 関数を非同期で呼び出した場合、Lambda 関数の戻り値はすべて無視されます。したがって、そのことをコード内で明確にするために、戻り型を void に設定することもできます。詳細については、「Invoke (p. 463)」を参照してください。

エンドツーエンドの例をテストするには、 「(オプション) Java で Lambda 関数を作成する (p. 57)」を参照してください。

ハンドラーの入出力: POJO の型

次の Java クラスは、入出力に POJO を使用する myHandler と呼ばれるハンドラーを示します。

package example;

import com.amazonaws.services.lambda.runtime.Context;

public class HelloPojo {

39

Page 46: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

// Define two classes/POJOs for use with Lambda function. public static class RequestClass { ... }

public static class ResponseClass { ... }

public static ResponseClass myHandler(RequestClass request, Context context) { String greetingString = String.format("Hello %s, %s.", request.getFirstName(), request.getLastName()); return new ResponseClass(greetingString); }}

AWS Lambda は、標準のビーン命名規則に基づいてシリアル化します (「Java EE 6 チュートリアル」を参照)。パブリックゲッターおよびセッターとともに可変 POJO を使用する必要があります。

Note

注釈などのシリアル化フレームワークの他の機能に依存しないでください。シリアル化動作をカスタマイズする必要がある場合は、実際のバイトストリームを使って、独自のシリアル化を使用できます。

入出力に POJO を使用する場合は、RequestClass タイプおよび ResponseClass タイプの実装を提供する必要があります。例については、「例: ハンドラーの入出力に POJO を使用する (Java) (p. 40)」を参照してください。

例: ハンドラーの入出力に POJO を使用する (Java)

アプリケーションイベントが、次に示すように名と姓を含むデータを生成するとします。

{ "firstName": "John", "lastName": "Doe" }

この例では、ハンドラーはこの JSON を受け取り、文字列 "Hello John Doe" を返します。

public static ResponseClass handleRequest(RequestClass request, Context context){ String greetingString = String.format("Hello %s, %s.", request.firstName, request.lastName); return new ResponseClass(greetingString);}

このハンドラーで Lambda 関数を作成するには、以下に示す Java の例のように、入出力タイプの実装を提供する必要があります。HelloPojo クラスは handler メソッドを定義します。

package example;

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler;

public class HelloPojo implements RequestHandler<RequestClass, ResponseClass>{

public ResponseClass handleRequest(RequestClass request, Context context){ String greetingString = String.format("Hello %s, %s.", request.firstName, request.lastName); return new ResponseClass(greetingString); }}

40

Page 47: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

入力タイプを実装するには、以下のコードを別のファイルに追加して、RequestClass.java という名前を付けます。これを、ディレクトリ構造の HelloPojo.java クラスの隣に配置します。

package example; public class RequestClass { String firstName; String lastName;

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public RequestClass(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }

public RequestClass() { } }

出力タイプを実装するには、以下のコードを別のファイルに追加して、ResponseClass.java という名前を付けます。これを、ディレクトリ構造の HelloPojo.java クラスの隣に配置します。

package example; public class ResponseClass { String greetings;

public String getGreetings() { return greetings; }

public void setGreetings(String greetings) { this.greetings = greetings; }

public ResponseClass(String greetings) { this.greetings = greetings; }

public ResponseClass() { }

}

Note

get および set メソッドは、POJO が AWS Lambda の組み込み JSON シリアライザーを操作するために必要です。通常、引数を受け取らないコンストラクタは必要ありません。ただし、この

41

Page 48: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

例では他のコンストラクタを提供したため、明示的に 0 個の引数コンストラクタを提供する必要があります。

このコードは Lambda 関数としてアップロードし、次のようにテストできます。

• 前述のコードファイルを使用して、デプロイパッケージを作成します。• デプロイパッケージを AWS Lambda にアップロードし、Lambda 関数を作成します。これを行うには、

コンソールまたは AWS CLI を使用します。• コンソールまたは CLI を使用して手動で Lambda 関数を呼び出します。手動で Lambda 関数を呼び出す

ときは、提供されたサンプル JSON データを使用できます。以下に例を示します。

{ "firstName":"John", "lastName":"Doe" }

詳細については、次を参照してください。 (オプション) Java で Lambda 関数を作成する (p. 57). 以下の違いに注意してください。

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数の作成時に、example.HelloPojo::handleRequest (package.class::method) をハンドラー値として指定します。

例: ハンドラーの入出力にストリームを使用する (Java)

POJO を使用しない場合、または Lambda のシリアル化のアプローチがニーズに合わない場合は、バイトストリーム実装を使用できます。この場合、ハンドラー用の入出力タイプとして InputStream およびOutputStream を使用できます。例のハンドラー関数を示します。

public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException{ ...}

この場合、ハンドラー関数はリクエストストリームと応答ストリームの両方にパラメータを使用します。

次に示すのは、input および output パラメータに InputStream および OutputStream 型を使用するハンドラーを実装する Lambda 関数の例です。

Note

入力ペイロードは有効な JSON である必要がありますが、出力ストリームにはこのような制限はありません。あらゆるバイトがサポートされます。

package example;

import java.io.InputStream;import java.io.OutputStream;import com.amazonaws.services.lambda.runtime.RequestStreamHandler;import com.amazonaws.services.lambda.runtime.Context;

public class Hello implements RequestStreamHandler{ public static void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { int letter; while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter));

42

Page 49: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

} }}

コードをテストするために、以下の操作を行うことができます。

• 前述のコードを使用して、デプロイパッケージを作成します。• デプロイパッケージを AWS Lambda にアップロードし、Lambda 関数を作成します。これを行うには、

コンソールまたは AWS CLI を使用します。• サンプルの入力を指定して、手動でコードを呼び出すことができます。以下に例を示します。

test

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 (オプション) Java で Lambda 関数を作成する (p. 57). 以下の違いに注意してください。

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数の作成時に、example.Hello::handler (package.class::method) をハンドラー値として指定します。

ハンドラー作成用に事前定義されているインターフェイスの利用 (Java)

任意の名前とパラメータを使用して独自のハンドラーメソッドを記述する代わりに、AWS Lambda Javaコアライブラリ (aws-lambda-java-core) に用意されている定義済みインターフェイスのいずれかを使用して、Lambda 関数ハンドラーを作成することもできます。ハンドラーの詳細については、「Lambda関数ハンドラー (Java) (p. 37)」を参照してください。

いずれかの定義済みインターフェイス (RequestStreamHandler または RequestHandler) を実装し、インターフェイスに用意された handleRequest メソッドを実装できます。標準の Java の型を使用するか、ハンドラーの入出力 (AWS Lambda が自動的に入出力をシリアル化して、データ型に一致させる)用のカスタム POJO 型を使用するかに応じて、これらのインターフェイスの 1 つを実装します。またはStream 型を使用してシリアル化をカスタマイズします。

Note

これらのインターフェイスは、aws-lambda-java-core ライブラリで利用できます。

標準インターフェイスを実装すると、コンパイル時にメソッドの署名を検証するのに役立ちます。

インターフェイスの 1 つを実装する場合は、package.class を、Lambda 関数を作成するときに Javaコードで指定します。たとえば、「使用開始」から変更された create-function CLI コマンドを次に示します。--handler パラメータが値 "example.Hello" を指定することに注意してください。

aws lambda create-function \--region region \--function-name getting-started-lambda-function-in-java \--zip-file fileb://deployment-package (zip or jar) path \--role arn:aws:iam::account-id:role/lambda_basic_execution \--handler example.Hello \--runtime java8 \--timeout 15 \--memory-size 512

以下のセクションでは、これらのインターフェイスを実行する例を示します。

43

Page 50: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

例 1: カスタム POJO 入出力を使用したハンドラーの作成 (RequestHandler インターフェイスを利用)

このセクションの例の Hello クラスは、RequestHandler インターフェイスを実装します。このインターフェイスは、Request 型の入力パラメータとしてイベントデータを受け取る handleRequest() メソッドを定義し、Response 型の POJO オブジェクトを返します。

public Response handleRequest(Request request, Context context) { ...}

handleRequest() メソッドのサンプル実装を持つ Hello クラスを示します。この例では、イベントデータが名と姓で構成されることを想定しています。

package example;

import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.Context;

public class Hello implements RequestHandler<Request, Response> { public Response handleRequest(Request request, Context context) { String greetingString = String.format("Hello %s %s.", request.firstName, request.lastName); return new Response(greetingString); }}

たとえば、イベントデータが Request オブジェクトにある場合は、次のようになります。

{ "firstName":"value1", "lastName" : "value2"}

このメソッドは、次のように Response オブジェクトを返します。

{ "greetings": "Hello value1 value2."}

次に、Request および Response クラスを実装する必要があります。テスト用に次の実装を使用できます。

Request クラス:

package example;

public class Request { String firstName; String lastName;

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName;

44

Page 51: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

}

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public Request(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }

public Request() { }}

Response クラス:

package example;

public class Response { String greetings;

public String getGreetings() { return greetings; }

public void setGreetings(String greetings) { this.greetings = greetings; }

public Response(String greetings) { this.greetings = greetings; }

public Response() { }}

このコードから Lambda 関数を作成し、エンドツーエンドのエクスペリエンスを次のようにテストできます。

• 前述のコードを使用して、デプロイパッケージを作成します。詳細については、「デプロイパッケージの作成 (Java) (p. 97)」を参照してください。

• デプロイパッケージを AWS Lambda にアップロードし、Lambda 関数を作成します。• コンソールまたは CLI を使用して Lambda 関数をテストします。Request クラスのゲッターとセッ

ターに準拠するサンプル JSON データを指定できます。次に例を示します。

{ "firstName":"John", "lastName" : "Doe"}

Lambda 関数は、レスポンスで次の JSON を返します。

{ "greetings": "Hello John, Doe."

45

Page 52: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

}

「開始方法」セクションの手順に従ってください ( (オプション) Java で Lambda 関数を作成する (p. 57))をクリックします。以下の違いに注意してください。

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数を作成するときに、example.Hello (package.class) をハンドラー値として指定します。

例 2: ストリームの入出力と使用したハンドラーの作成 (RequestStreamHandler インターフェイスを利用)

この例の Hello クラスは、RequestStreamHandler インターフェイスを実装します。インターフェイスは、次のように handleRequest メソッドを定義します。

public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { ...}

handleRequest() ハンドラーのサンプル実装を持つ Hello クラスを示します。ハンドラーは、単に大文字に変換して返すことで、受信イベントデータを処理します (たとえば、文字列 "hello")。

package example;

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;

import com.amazonaws.services.lambda.runtime.RequestStreamHandler;import com.amazonaws.services.lambda.runtime.Context;

public class Hello implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { int letter; while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter)); } }}

このコードから Lambda 関数を作成し、エンドツーエンドのエクスペリエンスを次のようにテストできます。

• 前述のコードを使用してデプロイパッケージを作成します。• デプロイパッケージを AWS Lambda にアップロードし、Lambda 関数を作成します。• コンソールまたは CLI を使用して Lambda 関数をテストします。サンプルの文字列データを指定できま

す。次に例を示します。

"test"

Lambda 関数は応答として TEST を返します。

46

Page 53: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

「開始方法」セクションの手順に従ってください ( (オプション) Java で Lambda 関数を作成する (p. 57))をクリックします。以下の違いに注意してください。

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数を作成するときに、example.Hello (package.class) をハンドラー値として指定します。

Context オブジェクト (Java)AWS Lambda 実行環境とは、context パラメータを通じてやりとりします。context オブジェクトを使用すると、Lambda 実行環境内で使用できる有益な情報にアクセスすることができます。たとえば、context パラメータを使用して、関数に関連付けられた CloudWatch ログストリームを確認したり、context オブジェクトの clientContext プロパティを使用して、Lambda 関数を呼び出すアプリケーションの詳細について参照したりできます (AWS Mobile SDK を通じて呼び出された場合)。4

context オブジェクトのプロパティは次のとおりです。

• getMemoryLimitInMB(): Lambda 関数に対して設定したメモリ制限 (MB 単位)。• getFunctionName(): 実行中の Lambda 関数の名前。• getFunctionVersion(): 実行中の Lambda 関数のバージョン。エイリアスを使用して関数を呼び出

した場合、getFunctionVersion はエイリアスが指すバージョンになります。• getInvokedFunctionArn(): この関数の呼び出しに使用された ARN。関数 ARN またはエイリアス

ARN を指定できます。非修飾 ARN は $LATEST バージョンを実行し、エイリアスはそれが指定する関数のバージョンを実行します。

• getAwsRequestId(): リクエストに関連付けられた AWS リクエスト ID。これは、invoke() を呼び出したクライアントに返される ID です。AWS サポートで、フォローアップの問い合わせにリクエストID を使用できます。AWS Lambda が関数を再試行する場合 (たとえば、Kinesis レコードを処理するLambda 関数が例外をスローする状況)、リクエスト ID は同じままです。

• getLogStreamName(): CloudWatch は特定の Lambda 関数の実行のストリーム名を記録します。提供された IAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。

• getLogGroupName(): 呼び出される Lambda 関数と関連付けられた CloudWatch ロググループ名。提供された IAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。

• getClientContext(): AWS Mobile SDK を通じて呼び出されたクライアントアプリケーションとデバイスに関する情報。null とすることができます。クライアントコンテキストでは、クライアント ID、アプリケーションのタイトル、バージョン名、バージョンコード、アプリケーションのパッケージ名などのクライアント情報が提供されます。

• getIdentity(): AWS Mobile SDK を通じて呼び出された場合の、Amazon Cognito ID プロバイダーについての情報。null とすることができます。

• getRemainingTimeInMillis(): 関数が終了するまでの残りの実行時間 (ミリ秒単位)。Lambda 関数を作成するときに、最大の時間制限を設定します。この時間制限に達すると、AWS Lambda は関数の実行を終了します。関数の残り実行時間に関する情報を使用して、タイムアウトに近づいたときの関数の動作を指定できます。

• getLogger(): Context オブジェクトに関連付けられた Lambda ロガーを返します。詳細については、「ロギング (Java) (p. 49)」を参照してください。

次の Java コードスニペットは、コンテキスト情報の一部を表示するハンドラー関数を示しています。

public static void handler(InputStream inputStream, OutputStream outputStream, Context context) {

47

Page 54: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

... System.out.println("Function name: " + context.getFunctionName()); System.out.println("Max mem allocated: " + context.getMemoryLimitInMB()); System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()); System.out.println("CloudWatch log stream name: " + context.getLogStreamName()); System.out.println("CloudWatch log group name: " + context.getLogGroupName()); }

例: Context オブジェクトの使用 (Java)

次の Java コード例では、Context オブジェクトを使用して、実行中に Lambda 関数のランタイム情報を取得する方法を示します。

package example;import java.io.InputStream;import java.io.OutputStream;import com.amazonaws.services.lambda.runtime.Context;

public class Hello { public static void myHandler(InputStream inputStream, OutputStream outputStream, Context context) { int letter; try { while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter)); } Thread.sleep(3000); // Intentional delay for testing the getRemainingTimeInMillis() result. } catch (Exception e) { e.printStackTrace(); } // For fun, let us get function info using the context object. System.out.println("Function name: " + context.getFunctionName()); System.out.println("Max mem allocated: " + context.getMemoryLimitInMB()); System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()); System.out.println("CloudWatch log stream name: " + context.getLogStreamName()); System.out.println("CloudWatch log group name: " + context.getLogGroupName()); }}

コードをテストするために、以下の操作を行うことができます。

• 前述のコードを使用して、デプロイパッケージを作成します。• デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。これを行うに

は、コンソールまたは AWS CLI を使用します。• Lambda 関数をテストするには、Lambda コンソールが提供する "Hello World" サンプルイベントを使用

します。

任意の文字列を入力でき、関数は同じ文字列を大文字で返します。さらに、context オブジェクトで提供される有用な関数情報も取得されます。

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 (オプション) Java で Lambda 関数を作成する (p. 57). 以下の違いに注意してください。

48

Page 55: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数を作成するときに、ハンドラー値として example.Hello::myHandler(package.class::method) を指定します。

ロギング (Java)

Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログをCloudWatch に書き込みます。次のいずれかを使用してログを書き込むことをお勧めします。

Log4j™ 2 のカスタム Appender

AWS Lambda は、Log4j 2 を使用してカスタム Appender を提供することをお勧めします。Lambda が提供するカスタム Log4j (「Apache log4j」を参照) Appender を、Lambda 関数からのログ記録に使用できます。log.debug() または log.error() など、Log4j メソッドへのあらゆる呼び出しは、CloudWatchLogs イベントを発生させます。カスタム Appender は LambdaAppender と呼ばれ、log4j2.xml ファイルで使用する必要があります。aws-lambda-java-log4j2 アーティファクト (artifactId:aws-lambda-java-log4j2) をデプロイパッケージ (.jar ファイル) に含める必要があります。例については、「例 1: Log4J v2.8 を使用したログの書き込み (p. 50)」を参照してください。

LambdaLogger.log()

イベントサイズが許可されている制限内である場合、LambdaLogger.log() を呼び出すたびにCloudWatch Logs イベントが発生します。CloudWatch Logs の制限については、Amazon CloudWatchユーザーガイド の「CloudWatch Logs の制限」を参照してください。例については、「例 2:LambdaLogger を使用したログの書き込み (Java) (p. 52)」を参照してください。

さらに、Lambda 関数コードで次のステートメントを使用してログエントリを生成することもできます。

• System.out()• System.err()

ただし、AWS Lambda は、System.out および System.err で返される各行を別のイベントとして処理することに注意してください。この作業は、各出力行が 1 つのログエントリに対応するときに適しています。ログエントリに複数行の出力が含まれている場合、AWS Lambda は改行を使用してそれらの解析を試み、異なるイベントを識別します。たとえば、次のコードでは、2 つの単語 ("Hello" と "world") を 2 つの個別のイベントとして記録します。

System.out.println("Hello \n world");

ログの検索方法

Lambda 関数が書き込んだログは、次のように確認できます。

• CloudWatch Logs でログを見つけます。context オブジェクト (aws-lambda-java-core ライブラリ) は、getLogStreamName() および getLogGroupName() メソッドを提供します。これらのメソッドを使用して、ログの書き込み先の特定のログストリームを見つけることができます。

• コンソールを通じて Lambda 関数を呼び出す場合、呼び出しタイプは常に RequestResponse (同期実行) になります。コンソールは、Lambda 関数が LambdaLogger オブジェクトを使用して書き込むログを表示します。また、AWS Lambda は、System.out および System.err メソッドからログを返します。

• Lambda 関数をプログラムで呼び出す場合、LogType パラメータを追加して、CloudWatch Logs に書き込まれるログデータの最後の 4 KB を取得できます。詳細については、「Invoke (p. 463)」を参照してください。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返

49

Page 56: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

します。AWS Command Line Interface を使用して関数を呼び出す場合、--log-type パラメータを値Tail とともに指定できます。

ログ作成の例 (Java)

このセクションでは、Log4j のカスタム Appender および情報を記録するための LambdaLogger オブジェクトの使用例を示します。

例 1: Log4J v2.8 を使用したログの書き込み

• 以下は、Log4j v2.8 プラグインが正しく含まれるように Maven を使用してアーティファクトを構築する方法です。• Maven pom.xml の場合 :

<dependencies> ... <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> ....</dependencies>

• Maven Shade プラグインを使用している場合は、プラグインの設定を次のように設定します。

<plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer"> </transformer> </transformers> </configuration> </execution> </executions> <dependencies>

50

Page 57: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

<dependency> <groupId>com.github.edwgiz</groupId> <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> <version>2.8.1</version> </dependency> </dependencies> </plugin> ...</plugins>

• 次の Java コード例は、Lambda で Log4j を使用する方法を示しています。

package example;

import com.amazonaws.services.lambda.runtime.Context;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

public class Hello { // Initialize the Log4j logger. static final Logger logger = LogManager.getLogger(Hello.class);

public String myHandler(String name, Context context) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out");

// System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr. \n this is a continuation of system.err");

// Use log4j to log the same thing as above and AWS Lambda will log only one event in CloudWatch. logger.debug("log data from log4j debug \n this is continuation of log4j debug");

logger.error("log data from log4j err. \n this is a continuation of log4j.err");

// Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); }}

• 上記の例では、次の log4j2.xml ファイルを使用してプロパティをロードしています。

<?xml version="1.0" encoding="UTF-8"?><Configuration packages="com.amazonaws.services.lambda.runtime.log4j2.LambdaAppender"> <Appenders> <Lambda name="Lambda"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern> </PatternLayout> </Lambda>

51

Page 58: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

</Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Lambda" /> </Root> </Loggers></Configuration>

例 2: LambdaLogger を使用したログの書き込み (Java)

次の Java コード例では、AWS Lambda が情報を CloudWatch に記録する方法の違いを示すため、Systemメソッドと LambdaLogger オブジェクトの両方を使用してログを書き込みます。

package example;

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger;

public class Hello { public String myHandler(String name, Context context) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr \n this is continuation of system.err");

LambdaLogger logger = context.getLogger(); // Write log to CloudWatch using LambdaLogger. logger.log("log data from LambdaLogger \n this is continuation of logger.log"); // Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); }}

次に示すのは、CloudWatch Logs のログエントリのサンプルです。

注意:

• AWS Lambda は、改行のため、System.out.println() および System.err.println() の各ステートメントのログ文字列を、2 つの個別のイベントとして解析します (スクリーンショットの 2 つの下向き矢印に注目してください)。

52

Page 59: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• LambdaLogger.log() は 1 つの CloudWatch イベントを作成します。

コードをテストするために、以下の操作を行うことができます。

• コードを使用して、デプロイパッケージを作成します。• デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。• Lambda 関数をテストするには、サンプルイベントとして文字列 ("this is a test") を使用します。ハンド

ラーコードはサンプルイベントを受信しますが、それに対して何も行いません。ログを書き込む方法のみを示します。

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 (オプション) Java で Lambda 関数を作成する (p. 57). 以下の違いに注意してください。

• デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

• Lambda 関数を作成するときに、ハンドラー値として example.Hello::myHandler(package.class::method) を指定します。

関数エラー (Java)

Lambda 関数が例外をスローする場合、AWS Lambda はエラーを認識して JSON に例外情報をシリアル化し、それを返します。エラーメッセージの例を次に示します。

{ "errorMessage": "Name John Doe is invalid. Exception occurred...", "errorType": "java.lang.Exception", "stackTrace": [ "example.Hello.handler(Hello.java:9)", "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(Method.java:497)" ]}

スタックの stackTrace JSON 配列が要素をトレースするときに、スタックトレースが返されることに注意してください。

エラー情報を取得する方法は、関数の呼び出し時に指定した呼び出しタイプによって異なります。

• RequestResponse 呼び出し型 (同期実行) : この場合、エラーメッセージを取得します。

たとえば、Lambda コンソールを使用して Lambda 関数を呼び出す場合、RequestResponse が常に呼び出しタイプであり、次の図に示すように、コンソールには AWS Lambda で返されるエラー情報が[Execution result] セクションに表示されます。

53

Page 60: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• Event 呼び出し型 (非同期実行) : この場合、AWS Lambda は何も返しません。代わりに、エラー情報がCloudWatch Logs および CloudWatch メトリクスに記録されます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。たとえば、Kinesis が Lambda 関数のイベントソースである場合、AWS Lambda は、Lambda 関数が成功するか、ストリームのレコードの有効期限が切れるまで、エラーになった関数を再試行します。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions StateMachine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

• タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。• 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ス

テートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。Java のカスタムエラーは Exception クラスを拡張する必要があることに注意してください。

package com.example;

public static class AccountAlreadyExistsException extends Exception { public AccountAlreadyExistsException(String message) { super(message); }}

package com.example;

import com.amazonaws.services.lambda.runtime.Context;

public class Handler { public static void CreateAccount(String name, Context context) throws AccountAlreadyExistsException { throw new AccountAlreadyExistsException ("Account is in use!"); }}

Catch ルールを使用してエラーをキャッチするように Step Functions を設定できます。Lambda は実行時にエラー名を例外の完全修飾クラス名に自動的に設定します。

54

Page 61: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["com.example.AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … }}

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおりSuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル (p. 19) でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

以前のカスタム appender を Log4j™1.2 に使用する (推奨されません)Note

Log4j v1.2 カスタム appender のサポートには、End-of-Life がマークされています。開発中の更新は受け取らず、使用することはお勧めしません。詳細については、「Log4j 1.2」を参照してください。

AWS Lambda は、カスタム Appender を提供して Log4j 1.2 をサポートします。Lambda が提供するカスタム Log4j (「Apache log4j 1.2」を参照) Appender を、Lambda 関数からのログ記録に使用できます。log.debug() または log.error() など、Log4j メソッドへのあらゆる呼び出しは、CloudWatch Logs イベントを発生させます。カスタム Appender は LambdaAppender と呼ばれ、log4j.properties ファイルで使用する必要があります。aws-lambda-java-log4j アーティファクト (artifactId:aws-lambda-java-log4j) をデプロイパッケージ (.jar ファイル) に含める必要があります。例については、「例 : Log4J v1.2 を使用してログを書き込む (推奨されません) (p. 55)」を参照してください。

例 : Log4J v1.2 を使用してログを書き込む (推奨されません)Note

Log4j のバージョン1.x にはサポート終了のマークが付いています。詳細については、「Log4j1.2」を参照してください。

次の Java コード例では、AWS Lambda が情報を CloudWatch に記録する際の違いを示すため、Systemメソッドと Log4j の両方を使用してログを書き込みます。

package example;

import com.amazonaws.services.lambda.runtime.Context;

import org.apache.logging.log4j.Logger;

55

Page 62: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

public class Hello { // Initialize the Log4j logger. static final Logger log = Logger.getLogger(Hello.class);

public String myHandler(String name, Context context) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr. \n this is a continuation of system.err");

// Use log4j to log the same thing as above and AWS Lambda will log only one event in CloudWatch. log.debug("log data from log4j debug \n this is continuation of log4j debug");

log.error("log data from log4j err. \n this is a continuation of log4j.err"); // Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); }}

この例では、次の log4j.properties ファイル (project-dir/src/main/resources/ directory) を使用します。

log = .log4j.rootLogger = DEBUG, LAMBDA

#Define the LAMBDA appenderlog4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppenderlog4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayoutlog4j.appender.LAMBDA.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} <%X{AWSRequestId}> %-5p %c{1}:%m%n

次に示すのは、CloudWatch Logs のログエントリのサンプルです。

注意:

• AWS Lambda は、改行のため、System.out.println() および System.err.println() の各ステートメントのログ文字列を、2 つの個別のイベントとして解析します (スクリーンショットの 2 つの下向き矢印に注目してください)。

• Log4j のメソッド (log.debug() および log.error()) は、1 つの CloudWatch イベントを作成します。

56

Page 63: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• AWS Lambda ランタイムは、MDC の AWSRequestId をlog4j コンテキストに追加します (「ClassMDC for log4j v 1.2 および Class ThreadContext」を参照)。例のようにこの値を取得するため、%X{AWSRequestId} ファイルの変換パターンに log4.properties を追加しました。

コードをテストするために、以下の操作を行うことができます。

• コードを使用して、デプロイパッケージを作成します。プロジェクトで、project-dir/src/main/resources/ ディレクトリに log4j.properties ファイルを追加し忘れないようにしてください。

• デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。• Lambda 関数をテストするには、サンプルイベントとして文字列 ("this is a test") を使用します。ハンド

ラーコードはサンプルイベントを受信しますが、それに対して何も行いません。ログを書き込む方法のみを示します。

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 (オプション) Java で Lambda 関数を作成する (p. 57). 以下の違いに注意してください。

• デプロイパッケージを作成するときに、Log4j 1.2 の依存関係に対する aws-lambda-java-log4j の依存関係を忘れないでください。

• Lambda 関数を作成するときに、ハンドラー値として example.Hello::myHandler(package.class::method) を指定します。

(オプション) Java で Lambda 関数を作成する設計図には、Python または Node.js. で作成されたサンプルコードが用意されています。コンソールでインラインエディターを使用して例に簡単に変更を加えることができます。ただし、Java で Lambda 関数のコードを作成する場合、設計図は用意されていません。また、AWS Lambda コンソールで Java コードを記述するためのインラインエディターはありません。

つまり、Java コードを記述し、コンソールの外でデプロイパッケージを作成する必要があります。デプロイパッケージの作成後、コンソールを使用して AWS Lambda にパッケージをアップロードしたら、Lambda 関数を作成できます。さらに、コンソールを使用して、関数を手動で呼び出すことでテストすることもできます。

このセクションでは、以下の Java コード例を使用して Lambda 関数を作成します。

package example;

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger;

public class Hello { public String myHandler(int myCount, Context context) { LambdaLogger logger = context.getLogger(); logger.log("received : " + myCount); return String.valueOf(myCount); }}

プログラミングモデルでは、AWS Lambda がサポートしている入出力の型など、Java コードを記述する方法の詳細について説明します。プログラミングモデルの詳細については、「Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)」を参照してください。ここでは、このコードに関して以下の点に注意してください。

• このコードをパッケージ化してアップロードし、Lambda 関数を作成する場合は、example.Hello::myHandler メソッド参照をハンドラーとして指定します。

• この例のハンドラーでは、入力に int 型を、出力に String 型を使用しています。

57

Page 64: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

AWS Lambda では、JSON シリアライズ型と InputStream/OutputStream 型の入力/出力がサポートされています。この関数を呼び出すときは、サンプルの int (123 など) を渡します。

• Lambda コンソールを使用して、この Lambda 関数を呼び出すことができます。コンソールでは常にRequestResponse 呼び出しタイプ (同期) が使用されるため、コンソールに応答が表示されます。

• ハンドラーにはオプションの Context パラメータが含まれます。コードでは、CloudWatch ログにログエントリを書き込むために Context オブジェクトによって提供される LambdaLogger を使用します。Context オブジェクトの使用の詳細については、「Context オブジェクト (Java) (p. 47)」を参照してください。

最初に、デプロイパッケージにこのコードや依存関係をパッケージ化する必要があります。その後、「開始方法」の演習の手順に従って、コンソールを使用してパッケージをアップロードしたら、Lambda 関数を作成してテストできます。デプロイパッケージの作成に関する詳細は「デプロイパッケージの作成(Java) (p. 97)」をご覧ください。

Python で Lambda 関数を作成するためのプログラミングモデル以下のセクションでは、Lambda 関数のコードを Python で記述する際に、一般的なプログラミングパターンと主要概念 がどのように適用されるかについて説明します。

トピック• Lambda 関数ハンドラー (Python) (p. 58)• Context オブジェクト (Python) (p. 59)• ログ記録 (Python) (p. 62)• 関数エラー (Python) (p. 64)

Lambda 関数ハンドラー (Python)

Lambda 関数を作成するときに、ハンドラーを指定します。これはサービスでコードを実行する際に AWSLambda が呼び出すコード内の関数です。Python でハンドラー関数を作成する場合は、次の一般的な構文構造を使用します。

def handler_name(event, context): ... return some_value

構文では、以下の点に注意してください。

• event – AWS Lambda はこのパラメーターを使用してイベントデータをハンドラーに渡します。このパラメータは通常、Python の dict タイプです。また、list、str、int、float、または NoneTypeタイプを使用できます。

• context – AWS Lambda はこのパラメーターを使用してランタイム情報をハンドラーに提供します。このパラメータは LambdaContext タイプになります。

• オプションで、ハンドラーは値を返すことができます。Lambda 関数の呼び出しに使用した呼び出しタイプに応じて、戻り値は次のようになります。• RequestResponse 呼び出しタイプ (同期実行) を使用する場合、AWS Lambda は Python 関数呼

び出しの結果を、Lambda 関数を呼び出したクライアントに返します (呼び出しリクエストに対する HTTP レスポンスでは、JSON にシリアル化されます)。たとえば、AWS Lambda コンソールはRequestResponse 呼び出しタイプを使用するため、コンソールを使用して関数を呼び出すと、コンソールに戻り値が表示されます。

ハンドラが NONE を返した場合、AWS Lambda は null を返します。

58

Page 65: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• Event 呼び出しタイプ (非同期実行) を使用すると、値は破棄されます。

たとえば、次の Python コードの例を考えてみます。

def my_handler(event, context): message = 'Hello {} {}!'.format(event['first_name'], event['last_name'])  return { 'message' : message }

この例では、my_handler という 1 つの関数があります。この関数は、入力として受け取ったイベントからのデータを含むメッセージを返します。

このコードを Lambda 関数としてアップロードしてテストするには

1. このファイル (hello_python.py など) を保存します。2. ファイルと依存関係をすべて .zip ファイルにパッケージ化します。zip を作成するときは、コードお

よび依存関係のみを含め、フォルダは含めません。

手順については、「デプロイパッケージの作成 (Python) (p. 104)」を参照してください。3. コンソールまたは AWS CLI を使用して .zip ファイルをアップロードし、Lambda 関数を作成しま

す。Lambda 関数を作成する際に、ハンドラーとして使用する Python コードで関数名を指定します。コンソールを使用して Lambda 関数を作成する手順については、 シンプルな Lambda 関数を作成する (p. 9)。この例では、ハンドラーは hello_python.my_handler (file-name.function-name)です。「ご利用開始にあたって (p. 3)」では、Lambda 関数用のサンプルコードを提供する設計図を使用していることに注意してください。この場合は、デプロイパッケージが既に存在しています。したがって、関数の設定のステップで、ZIP ファイルをアップロードすることを選択します。

次の create-function AWS CLI コマンドは、Lambda 関数を作成します。その他のパラメータの中で、--handler パラメータを指定してハンドラー名を指定しています。--runtime パラメータはpython3.6 を指定することに注意してください。python2.7 を使用することもできます。

aws lambda create-function \--region region \--function-name HelloPython \--zip-file fileb://deployment-package.zip \--role arn:aws:iam::account-id:role/lambda_basic_execution \--handler hello_python.my_handler \--runtime python3.6 \--timeout 15 \--memory-size 512

Context オブジェクト (Python)

トピック• 例 (p. 60)• Context オブジェクトのメソッド (Python) (p. 60)• Context オブジェクトの属性 (Python) (p. 60)

Lambda 関数の実行中に、AWS Lambda サービスを操作して次のような有益なランタイム情報を入手できます。

• AWS Lambda が Lambda 関数を終了するまでの残り時間 (タイムアウトは Lambda 関数の設定プロパティの 1 つです)。

59

Page 66: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• 実行中の Lambda 関数に関連付けられた CloudWatch ロググループとログのストリーム。• Lambda 関数を呼び出したクライアントに返された AWS リクエスト ID。AWS サポートで、フォロー

アップの問い合わせにリクエスト ID を使用できます。• Lambda 関数が AWS Mobile SDK を通して呼び出された場合は、Lambda 関数を呼び出すモバイルアプ

リケーションの詳細を知ることができます。

AWS Lambda はこの情報を、サービスが Lambda 関数ハンドラーに 2 番目のパラメータとして渡す context オブジェクトを介して提供します。詳細については、「Lambda 関数ハンドラー(Python) (p. 58)」を参照してください。

以下のセクションでは、context オブジェクトを使用する Lambda 関数の例を説明し、その後使用可能なすべてのメソッドおよび属性をリストします。

次の Python の例を考えます。これには、ハンドラーでもある関数が 1 つあります。ハンドラーはパラメータとして渡される context オブジェクトを通してランタイム情報を受け取ります。

from __future__ import print_function

import timedef get_my_log_stream(event, context):     print("Log stream name:", context.log_stream_name)   print("Log group name:", context.log_group_name)   print("Request ID:",context.aws_request_id)   print("Mem. limits(MB):", context.memory_limit_in_mb) # Code will execute quickly, so we add a 1 second intentional delay so you can see that in time remaining value. time.sleep(1)    print("Time remaining (MS):", context.get_remaining_time_in_millis())

この例では、ハンドラーコードは単純にランタイム情報の一部を印刷します。各印刷ステートメントはCloudWatch にログエントリを作成します。Lambda コンソールを使用して関数を呼び出す場合は、コンソールがログを表示します。from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。

AWS Lambda コンソールでこのコードをテストするには

1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。[Runtime]で [Python2.7] を選択します。[Handler] の lambda_function.lambda_handler をlambda_function.get_my_log_stream と置き換えます。これを行う手順については、 シンプルな Lambda 関数を作成する (p. 9)。

2. 関数をテストし、コードを更新してより詳細な context 情報を入手できます。

以下のセクションでは、Lambda 関数のランタイム情報の取得に使用できる context オブジェクトのメソッドと属性をリストします。

Context オブジェクトのメソッド (Python)

context オブジェクトは次のメソッドを提供します。

get_remaining_time_in_millis()

AWS Lambda が関数を終了するまでの残りの実行時間をミリ秒で返します。

Context オブジェクトの属性 (Python)

context オブジェクトは次の属性を提供します。

60

Page 67: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

function_name

実行中の Lambda 関数の名前。function_version

実行中の Lambda 関数のバージョン。エイリアスを使用して関数を呼び出した場合、function_version はエイリアスが指すバージョンになります。

invoked_function_arn

この関数の呼び出しに使用された ARN。関数 ARN またはエイリアス ARN を指定できます。非修飾ARN は $LATEST バージョンを実行し、エイリアスはそれが指定する関数のバージョンを実行します。

memory_limit_in_mb

Lambda 関数に対して設定したメモリ制限 (MB 単位)。Lambda 関数の作成時にメモリ制限を設定します。後で変更できます。

aws_request_id

リクエストに関連付けられた AWS リクエスト ID。invoke メソッドを呼び出したクライアントに返される ID です。

Note

AWS Lambda が呼び出しを再試行する場合 (たとえば、Kinesis レコードを処理する Lambda関数が例外をスローする状況)、リクエスト ID は同じままです。

log_group_name

Lambda 関数によって記述されたログがある CloudWatch ロググループの名前です。log_stream_name

Lambda 関数によって記述されたログがある CloudWatch ログストリームの名前です。ログストリームは、Lambda 関数の呼び出しごとに変わる場合と、そうでない場合があります。

Lambda 関数がログストリームを作成できない場合、この値は Null になります。これは、Lambda 関数に必要なアクセス権限を付与する実行ロールに、CloudWatch Logs アクションのアクセス権限が含まれていない場合に発生することがあります。

identity

AWS Mobile SDK を通じて呼び出されたときの、Amazon Cognito 認証プロバイダーに関する情報。null とすることができます。• identity.cognito_identity_id• identity.cognito_identity_pool_id

client_context

AWS Mobile SDK を通じて呼び出されたクライアントアプリケーションとデバイスに関する情報。null とすることができます。• client_context.client.installation_id• client_context.client.app_title• client_context.client.app_version_name• client_context.client.app_version_code• client_context.client.app_package_name• client_context.custom

61

Page 68: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

モバイルクライアントアプリケーションによって設定されたカスタム値の dict です。• client_context.env

AWS Mobile SDK によって提供される環境情報の dict です。

上記に一覧表示するオプションに加えて、Python (p. 341) 用 AWS X-Ray SDK を使用して、重要なコードパスの識別、パフォーマンスのトレースおよび分析のためにデータをキャプチャすることもできます。

ログ記録 (Python)

Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログをCloudWatch に書き込みます。Lambda コンソールを使用して Lambda 関数を呼び出すと、コンソールに同じログが表示されます。

次の Python ステートメントはログエントリを生成します。

• print ステートメント。• logging モジュールの Logger 関数 (たとえば、logging.Logger.info およびlogging.Logger.error) です。

print と logging.* 関数はどちらも CloudWatch Logs にログを書き込みますが、logging.* 関数は各ログエントリにタイムスタンプやログレベルなどの追加情報を書き込みます。

たとえば、次の Python コードの例を考えてみます。

import logginglogger = logging.getLogger()logger.setLevel(logging.INFO)def my_logging_handler(event, context): logger.info('got event{}'.format(event)) logger.error('something went wrong') return 'Hello from Lambda!'

コード例では logging モジュールを使用してログにメッセージを書き込んでいるため、タイムスタンプやログレベルなどの追加情報をログで取得できます。ログレベルは、[INFO]、[ERROR]、[DEBUG] などのログのタイプを示します。

これらのログは CloudWatch にもあります。詳細については、「AWS Lambda の Amazon CloudWatch ログへのアクセス (p. 331)」を参照してください。

logging モジュールを使用する代わりに、次の Python の例に示すように print ステートメントをコードで使用できます。

from __future__ import print_functiondef lambda_handler(event, context): print('this will also show up in cloud watch')  return 'Hello World!'

この場合、印刷メソッドに渡されるテキストのみが CloudWatch に送信されます。ログエントリには、logging.* 関数が返す追加情報はありません。from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。

62

Page 69: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

コンソールは、RequestResponse 呼び出しタイプ (同期呼び出し) を使用して関数を呼び出します。したがって、値 ("Hello world!") が返ります。をコンソールが表示する AWS Lambda から取得します。

前述の Python コードをテストするには (コンソール)

1. コンソールで、hello-world-python 設計図を使用して Lambda 関数を作成します。[Runtime]で [Python2.7] を選択します。[ハンドラー] で lambda_function.lambda_handler をlambda_function.my_other_logging_handler に置き換え、[ロール] で [基本実行ロール] を選択します。設計図で提供されているコードを、このセクションのコードで置き換えます。コンソールを使用して Lambda 関数を作成する詳細な手順については、 「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

2. テンプレートコードをこのセクションで提供されたコードに置き換えます。3. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関

数をテストします。

ログの検索

Lambda 関数が書き込んだログは、次のように確認できます。

• AWS Lambda コンソール – AWS Lambda コンソールの [Log output] セクションにログが表示されます。

• レスポンスのヘッダー、Lambda 関数をプログラムで呼び出した場合 – Lambda 関数をプログラムで呼び出した場合、LogType パラメーターを追加して、CloudWatch ログに書き込まれたログデータの最後の 4 KB を取得できます。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返します。詳細については、「Invoke (p. 463)」を参照してください。

AWS CLI を使用して関数を呼び出した場合は、 --log-type parameter を値 Tail とともに指定して同じ情報を取得できます。

• CloudWatch ログ – CloudWatch でログを確認するには、ロググループ名とログストリーム名を把握しておく必要があります。コード内で context.log_group_name および context.log_stream_name

63

Page 70: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

プロパティを使用してこの情報を取得できます。Lambda 関数を実行すると、コンソールまたは CLI の結果ログが、ロググループ名およびログストリーム名を表示します。

関数エラー (Python)

Lambda 関数で例外が発生した場合、AWS Lambda はエラーを認識して JSON に例外情報をシリアル化し、それを返します。次の例を考えます。

def always_failed_handler(event, context): raise Exception('I failed!')

この Lambda 関数を呼び出すと、例外が発生し、AWS Lambda が次のエラーメッセージを返します。

{ "errorMessage": "I failed!", "stackTrace": [ [ "/var/task/lambda_function.py", 3, "my_always_fails_handler", "raise Exception('I failed!')" ] ], "errorType": "Exception"}

スタックの stackTrace JSON 配列が要素をトレースするときに、スタックトレースが返されることに注意してください。

返されるエラー情報の取得方法は、関数呼び出し時にクライアントが指定する呼び出しタイプによって決まります。

• クライアントが RequestResponse 呼び出しタイプ (同期実行です) を指定した場合、呼び出しを行ったクライアントに結果が返ります。

たとえば、コンソールは常に RequestResponse 呼び出しタイプを使用するため、[Execution result] セクションに次のようなエラーが表示されます。

同じ情報は、CloudWatch にも送信され、[Log output] セクションに同じログが表示されます。

64

Page 71: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• クライアントが Event 呼び出しタイプ (非同期実行です) を指定した場合は、AWS Lambda は何も返しません。代わりに、CloudWatch ログにエラー情報がログ記録されます。CloudWatch メトリクスでエラーメトリクスを確認することもできます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。たとえば、Kinesis がイベントソースである場合、AWS Lambda は Lambda 関数が成功するかストリームのレコードの有効期限が切れるまで、エラーになった呼び出しを再試行します。

前述の Python コードをテストするには (コンソール)

1. コンソールで、hello-world 設計図を使用して Lambda 関数を作成します。[runtime] で、[Python3.6] または [Python 2.7] を選択します。[Handler] の lambda_function.lambda_handler をlambda_function.always_failed_handler と置き換えます。これを行う手順については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

2. テンプレートコードをこのセクションで提供されたコードに置き換えます。3. Lambda コンソールが提供する [Hello World] という [Sample event template] を使用して Lambda 関

数をテストします。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions StateMachine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

• タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。• 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ス

テートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。Python のカスタムエラーは Exception クラスを拡張する必要があることに注意してください。

class AccountAlreadyExistsException(Exception): pass def create_account(event, context): raise AccountAlreadyExistsException('Account is in use!')

65

Page 72: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

Catch ルールを使用してエラーをキャッチするように Step Functions を設定できます。Lambda は実行時にエラー名を例外のシンプルなクラス名に自動的に設定します。

{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … }}

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおりSuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル (p. 19) でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

Go で Lambda 関数を作成するためのプログラミングモデル以下のセクションでは、Lambda 関数のコードを Go で記述する際に、一般的なプログラミングパターンと主要概念がどのように適用されるかについて説明します。

トピック• Lambda 関数ハンドラ (Go) (p. 67)• コンテキストオブジェクト (Go) (p. 70)• ログ記録 (Go) (p. 72)• 関数エラー (Go) (p. 73)• 環境変数の使用 (Go) (p. 75)

さらに、AWS Lambda では以下が提供されます。

• github.com/aws/aws-lambda-go/lambda: Go 用の Lambda プログラミングモデルの実装。このパッケージは、Lambda 関数ハンドラ (Go) (p. 67) を呼び出すために AWS Lambda によって使用されます。

• github.com/aws/aws-lambda-go/lambdacontext: コンテキストオブジェクト (Go) (p. 70) で実行コンテキストにアクセスするための Helper。

• github.com/aws/aws-lambda-go/events: このライブラリは一般的なイベントソース統合のタイプの定義を提供します。

66

Page 73: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

Lambda 関数ハンドラ (Go)

Go で書き込まれた Lambda 関数は、Go 実行可能ファイルとして作成されます。Lambda 関数コードでは、Go 用 Lambda プログラミングモデルを実装する github.com/aws/aws-lambda-go/lambda パッケージを含むことが必要です。加えて、ハンドラ関数および main() 関数の実装が必要となります。

package main

import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda")

type MyEvent struct { Name string `json:"name"`}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil}

func main() { lambda.Start(HandleRequest)}

次の点に注意してください。

• package main: Go では、func main() を含むパッケージは常に main と名付けられることが必要です。

• インポート : これを使用して、Lambda 関数に必要なライブラリを含めます。この場合、次のものが含まれます。• コンテキスト: コンテキストオブジェクト (Go) (p. 70)。• fmt: 関数の戻り値の書式に使用される Go フォーマット オブジェクト。• github.com/aws/aws-lambda-go/lambda: 前に説明した Go 用の Lambda プログラミングモデルの実

装。• func HandleRequest(ctx コンテキスト、名前文字列) (文字列、エラー): これは、Lambda ハンドラ署名

を指し、実行されるコードを含んでいます。また、次に示すパラメータも含まれます。• ctx context.Context: Lambda 関数呼び出しへのランタイム情報を提供します。ctx は、コンテキスト

オブジェクト (Go) (p. 70) を経由して利用できる情報を活用する宣言を行う変数です。• 名前文字列: 値が return ステートメントに返される name の変数名の入力タイプです。• 文字列エラー: スタンダード エラー を返します。カスタムエラー処理の詳細については、「関数エ

ラー (Go) (p. 73)」を参照してください。• return fmt.Sprintf("Hello %s!", name), nil: フォーマットされた 「こんにちは」の挨拶をハンドラ署名と

して指定した名前で単純に返します。nil は、エラーがなく、関数が正常に実行されたことを示します。

• func main(): Lambda 関数コードが実行するエントリポイント。これは必須です。

func main(){} コードの括弧内に lambda.Start(HandleRequest) を追加すると、Lambda 関数が実行されます。

Note

Go 言語スタンダードごとに、開いた括弧内で { を main 関数署名の最後に直接置く必要があります。

67

Page 74: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

構造化されたタイプを使用した Lambda 関数ハンドラ

上記の例では、入力タイプは単純な文字列でした。ただし、構造化されたイベントを関数ハンドラに渡すこともできます。

package main import ( "fmt" "github.com/aws/aws-lambda-go/lambda") type MyEvent struct { Name string 'json:"What is your name?"' Age int 'json:"How old are you?"'} type MyResponse struct { Message string 'json:"Answer:"'} func HandleLambdaEvent(event MyEvent) (MyResponse, error) { return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil} func main() { lambda.Start(HandleLambdaEvent)}

リクエストは次のようになります。

# request{ "What is your name?": "Jim", "How old are you?": 33}

また、レスポンスは次のようになります。

# request{ "Answer": "Jim is 33 years old!"}

AWS イベントスースでイベントを処理するための詳細は、「aws-lambda-go/events」を参照してください。

有効なハンドラ署名

Go で Lambda 関数ハンドラを構築するには複数の方法がありますが、次のルールに従う必要があります。

• ハンドラは関数である必要があります。• ハンドラは 0 から 2 までの引数を取る場合があります。2 つの引数がある場合は、最初の引数がcontext.Context を実装する必要があります。

• ハンドラは 0 から 2 までの引数を返す場合があります。単一の戻り値がある場合は、この値が errorを実装する必要があります。2 つの戻り値がある場合には、2 番目の値が error を実装している必要が

68

Page 75: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

あります。実装エラーの処理情報に関する詳細については、「関数エラー (Go) (p. 73)」を参照してください。

次のリストは、有効なハンドラ署名の一覧です。TIn と TOut は、encoding/json 標準ライブラリと互換性のあるタイプを表しています。詳細については、「func アンマーシャリング」でこれらのタイプが逆シリアル化する方法を参照してください。

• func ()

• func () error

• func (TIn), error

• func () (TOut, error)

• func (context.Context) error

• func (context.Context, TIn) error

• func (context.Context) (TOut, error)

• func (context.Context, TIn) (TOut, error)

グローバルな状態を利用してパフォーマンスを最大化する

パフォーマンスを最大化するには、関数のハンドラコードとは別のグローバルな変数を宣言して変更する必要があります。さらに、ハンドラがロードされている場合に実行される init 関数をハンドラが宣言することがあります。これは、AWS Lambda でも標準の Go プログラムと同じように作動します。Lambda関数の単一のインスタンスは、同時に複数のイベントを処理することはありません。これは、たとえば、変更が新規の実行コンテキストを要求すること、そして前の実行コンテキストに関数呼び出しのロックあるいは不安定な動作が導入されないことを確実にしながら、グローバルな状態を安全に変更できることを意味します。詳細については、「AWS Lambda 関数を使用する際のベストプラクティス (p. 399)」を参照してください。

package main import ( "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/aws") var invokeCount = 0var myObjects []*s3.Objectfunc init() { svc := s3.New(session.New()) input := &s3.ListObjectsV2Input{ Bucket: aws.String("examplebucket"), } result, _ := svc.ListObjectsV2(input) myObjects = result.Contents} func LambdaHandler() int { invokeCount = invokeCount + 1 log.Print(myObjects) return invokeCount} func main() { lambda.Start(LambdaHandler)}

69

Page 76: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

次のステップ

コンテキストオブジェクト (Go) (p. 70)

コンテキストオブジェクト (Go)

Lambda 関数の実行中に、AWS Lambda とやり取りをして次のような有益なランタイム情報を入手できます。

• AWS Lambda が Lambda 関数を終了するまでの残り時間 (タイムアウトは Lambda 関数の設定プロパティの 1 つです)。

• CloudWatch ロググループと実行している Lambda 関数に関連付けられるログストリーム。• Lambda 関数を呼び出したクライアントに返された AWS リクエスト ID。AWS サポートで、フォロー

アップの問い合わせにリクエスト ID を使用できます。• Lambda 関数が AWS Mobile SDK を通して呼び出された場合は、Lambda 関数を呼び出すモバイルアプ

リケーションの詳細を知ることができます。• 以下に一覧表示するオプションに加えて、Go (p. 343) 用 AWS X-Ray SDK を使用して、重要なコード

パスの識別、パフォーマンスのトレースおよび分析のためにデータをキャプチャすることもできます。

AWS Lambda はこの情報を、サービスが Lambda 関数ハンドラーにパラメータとして渡すcontext.Context オブジェクトを経由して提供します。詳細については、「有効なハンドラ署名 (p. 68)」を参照してください。

以下のセクションでは、context オブジェクトを使用する Lambda 関数の例を説明し、その後使用可能なすべてのメソッドおよび属性をリストします。

呼び出しコンテキスト情報へのアクセス

Lambda 関数には、環境と呼び出しリクエストに関するメタデータへのアクセスがあります。これには、パッケージのコンテキストでアクセスできます。ハンドラにはパラメータとして context.Contextが含まれている必要があり、Lambda は関数に関する情報をコンテキストの Value プロパティに挿入します。context.Contextのコンテキストにアクセスするために、lambdacontext ライブラリをインポートする必要があることに注意してください。

package main import ( "context" "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-lambda-go/lambdacontext") func CognitoHandler(ctx context.Context) { lc, _ := lambdacontext.FromContext(ctx) log.Print(lc.Identity.CognitoPoolID)} func main() { lambda.Start(CognitoHandler)}

上記の例では、lc はコンテキストオブジェクトがキャプチャした情報を消費するために使用される変数であり、log.Print(lc.Identity.CognitoPoolID) はその情報を印刷します (この場合はCognitoPoolID)。

70

Page 77: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

関数の実行時間のモニタリング

次の例では、Lambda 関数を実行するときにかかる時間をモニタリングするためにコンテキストオブジェクトを使用する方法を紹介しています。これによって、予期されるパフォーマンスを分析し、必要な場合には関数コードを調整します。

package main import ( "context" "log" "time" "github.com/aws/aws-lambda-go/lambda") func LongRunningHandler(ctx context.Context) string { deadline, _ := ctx.Deadline() for { select { case <- time.Until(deadline).Truncate(100 * time.Millisecond): return "Finished before timing out." default: log.Print("hello!") time.Sleep(50 * time.Millisecond) } }} func main() { lambda.Start(LongRunningHandler) }

Lambda コンテキストライブラリは、次のグローバル変数を提供します。

• MemoryLimitInMB: Lambda 関数に対して設定したメモリ制限 (MB 単位)。• FunctionName: 実行中の Lambda 関数の名前。• FunctionVersion: 実行中の Lambda 関数のバージョン。エイリアスを使用して関数を呼び出した場

合、FunctionVersion はエイリアスが指すバージョンになります。• LogStreamName: CloudWatch は特定の Lambda 関数の実行のストリーム名を記録します。提供された

IAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。• LogGroupName: 呼び出される Lambda 関数と関連付けられた CloudWatch ロググループ名。提供され

た IAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。

Lambda コンテキストオブジェクトには、次のプロパティも含まれています。

• AwsRequestID: リクエストに関連付けられた AWS リクエスト ID。これは、この Lambda 関数を呼び出したクライアントに返された ID です。AWS サポートで、フォローアップの問い合わせにリクエスト ID を使用できます。AWS Lambda が関数を再試行する場合 (たとえば、Kinesis レコードを処理するLambda 関数が例外をスローする状況)、リクエスト ID は同じままです。

• ClientContext: AWS Mobile SDK を通じて呼び出されたクライアントアプリケーションとデバイスに関する情報。null とすることができます。クライアントコンテキストでは、クライアント ID、アプリケーションのタイトル、バージョン名、バージョンコード、アプリケーションのパッケージ名などのクライアント情報が提供されます。

• Identity: 前の例で使用されています。AWS Mobile SDK を通じて呼び出された場合の、AmazonCognito ID プロバイダーについての情報。null とすることができます。

• InvokedFunctionArn: この関数の呼び出しに使用された ARN。関数 ARN またはエイリアス ARN を指定できます。非修飾 ARN は $LATEST バージョンを実行し、エイリアスはそれが指定する関数のバージョンを実行します。

71

Page 78: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

次のステップ

ログ記録 (Go) (p. 72)

ログ記録 (Go)Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログをCloudWatch に書き込みます。Lambda コンソールを使用して Lambda 関数を呼び出すと、コンソールに同じログが表示されます。

たとえば、次の例を考慮します。

package main import ( "log" "github.com/aws/aws-lambda-go/lambda") func HandleRequest() { log.Print("Hello from Lambda")} func main() { lambda.Start(HandleRequest)}

log モジュールをインポートすることで、Lambda はタイムスタンプなどの追加ログ記録の情報を書き込みます。

CloudWatch でログを分析することもできます。詳細については、「AWS Lambda の AmazonCloudWatch ログへのアクセス (p. 331)」を参照してください。

log モジュールを使用する代わりに、次に示すように print ステートメントをコードで使用できます。

package main import ( "fmt" "github.com/aws/aws-lambda-go/lambda") func HandleRequest() { fmt.Print("Hello from Lambda")} func main() { lambda.Start(HandleRequest)}

この場合、印刷メソッドに渡されるテキストのみが CloudWatch に送信されます。ログエントリには、log.Print 関数が返す追加情報はありません。さらに、stdout あるいは stderror に書き込むすべてのロガーは、Go 関数と CloudWatch ログに自動的に送信されるログに継続的に統合されます。

コンソールは、RequestResponse 呼び出しタイプ (同期呼び出し) を使用して関数を呼び出します。したがって、戻り値 (「Hello from Lambda!」) が AWS Lambda から返されます。

ログの検索

Lambda 関数が書き込んだログは、次のように確認できます。

• AWS Lambda コンソール – AWS Lambda コンソールの [ログ出力] セクションにログが表示されます。

72

Page 79: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• レスポンスのヘッダー、Lambda 関数をプログラムで呼び出した場合 – Lambda 関数をプログラムで呼び出した場合、LogType パラメーターを追加して、CloudWatch ログに書き込まれたログデータの最後の 4 KB を取得できます。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返します。詳細については、「Invoke (p. 463)」を参照してください。

AWS CLI を使用して関数を呼び出した場合は、 --log-type parameter を値 Tail とともに指定して同じ情報を取得できます。

• CloudWatch ログ – CloudWatch でログを確認するには、ロググループ名とログストリーム名を把握しておく必要があります。context.logGroupName および context.logStreamName グローバル変数をコンテキストオブジェクト (Go) (p. 72) ライブラリで使用して、この情報を取得できます。Lambda関数を実行すると、コンソールまたは CLI の結果ログが、ロググループ名およびログストリーム名を表示します。

次のステップ

関数エラー (Go) (p. 73)

関数エラー (Go)カスタムエラー処理を作成して Lambda 関数で例外が直接発生するようにして、直接処理することができます。

次のコード例はそれを行う方法を示しています。Go のカスタムエラーには、errors モジュールをインポートする必要があることに注意してください。

package main import ( "errors" "github.com/aws/aws-lambda-go/lambda") func OnlyErrors() error { return errors.New("something went wrong!")} func main() { lambda.Start(OnlyErrors)}

これは次を返します。{ "errorMessage": "something went wrong!" }

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions StateMachine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

• タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。• 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ス

テートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。

73

Page 80: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

package main

type CustomError struct {}

func (e *CustomError) Error() string { return "bad stuff happened..."}

func MyHandler() (string, error) { return "", &CustomError{}}

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおりSuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル (p. 19) でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

予期しないエラーの処理

Lambda 関数は、ネットワークの停止など、制御できない理由によって失敗することがあります。このような状況は、例外的です。Go では、panic がこのような問題に対応します。コードがパニックすると、Lambda はエラーをキャプチャして、標準エラー json フォーマットでそのエラーをシリアル化することを試みます。また、Lambda はパニックの値を関数の CloudWatch ログに挿入することも試みます。回答が返されると、Lambda は自動的に関数を再作成します。必要と思われる場合には、コードに panic 関数を含めて、エラー回答をカスタマイズできます。

package main

import ( "errors"

"github.com/aws/aws-lambda-go/lambda")

func handler(string) (string, error) { panic(errors.New("Something went wrong"))}

func main() { lambda.Start(handler)}

これは、次のスタックを json に返します。

{ "errorMessage": "Something went wrong", "errorType": "errorString", "stackTrace": [ { "path": "github.com/aws/aws-lambda-go/lambda/function.go", "line": 27, "label": "(*Function).Invoke.function" }, ...

74

Page 81: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

]}

環境変数の使用 (Go)Go で Environment Variables (p. 391) にアクセスするには、Getenv 関数を使用します。

次にこれを実行する方法を説明します。この関数は、印刷した結果をフォーマットする fmt パッケージと環境変数にアクセスできる独立したプラットフォームシステムインターフェースである os パッケージをインポートすることに注意してください。

package main

import ( "fmt" "os" "github.com/aws/aws-lambda-go/lambda")

func main() { fmt.Printf("%s is %s. years old\n", os.Getenv("NAME"), os.Getenv("AGE"))

}

Lambda は、デフォルトで次の環境変数を設定します。Lambda 関数で使用できる環境変数 (p. 404)。

C# で Lambda 関数を作成するためのプログラミングモデル以下のセクションでは、Lambda 関数のコードを C# で記述する際に、一般的なプログラミングパターンと主要概念がどのように適用されるかについて説明します。

トピック• Lambda 関数ハンドラー (C#) (p. 76)• Context オブジェクト (C#) (p. 79)• ログ記録 (C#) (p. 80)• 関数エラー (C#) (p. 81)

さらに、AWS Lambda では以下が提供されています。

• Amazon.Lambda.Core – このライブラリでは、静的 Lambda ロガー、シリアル化インターフェイス、Context オブジェクトが提供されています。Context オブジェクト (Context オブジェクト(C#) (p. 79)) は、Lambda 関数に関するランタイム情報を提供します。

• Amazon.Lambda.Serialization.Json – これは、Amazon.Lambda.Core のシリアル化インターフェイスの実装です。

• Amazon.Lambda.Logging.AspNetCore – これは、ASP.NET からのログ記録のライブラリを提供します。

• 次のものを含む複数の AWS サービスのイベントオブジェクト (POCO) :• Amazon.Lambda.APIGatewayEvents• Amazon.Lambda.CognitoEvents• Amazon.Lambda.ConfigEvents• Amazon.Lambda.DynamoDBEvents• Amazon.Lambda.KinesisEvents• Amazon.Lambda.S3Events• Amazon.Lambda.SNSEvents

75

Page 82: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

これらのパッケージは Nuget Packages で入手できます。

Lambda 関数ハンドラー (C#)

Lambda 関数を作成する際、サービスがユーザーに代わって関数を実行するときに AWS Lambda が呼び出すことができるハンドラーを指定します。

Lambda 関数ハンドラーをクラスのインスタンスまたは静的メソッドとして定義します。Lambda contextオブジェクトへのアクセスは、ILambdaContext 型のメソッドパラメータ、現在の関数、メモリ制限、残り実行時間など現在の実行に関する情報にアクセスするために使用するインターフェイス、ログ記録を定義することで可能になります。

returnType handler-name(inputType input, ILambdaContext context) { ...}

構文では、以下の点に注意してください。

• inputType – ハンドラーの最初のパラメーターはハンドラーへの入力です。このパラメーターには、イベントデータ (イベントソースによって発行される) またはユーザーが提供するカスタム入力 (文字列やカスタムデータオブジェクトなど) を指定できます。

• returnType – Lambda 関数を同期的に呼び出す (RequestResponse 呼び出しタイプを使用) 場合は、サポートされているいずれかのデータ型を使用して関数の出力を返すことができます。たとえば、Lambda 関数をモバイルアプリケーションのバックエンドとして使用する場合、これを同期的に呼び出しています。出力データ型は JSON にシリアル化されます。

Lambda 関数を非同期的に呼び出す (Event 呼び出しタイプを使用) 計画の場合、returnType は voidである必要があります。たとえば、Amazon S3 や Amazon SNS などのイベントソースとともに AWSLambda を使用する場合、これらのイベントソースは Event 呼び出しタイプを使用して Lambda 関数を呼び出します。

ストリームの処理

System.IO.Stream タイプのみ入力パラメータとしてデフォルトでサポートされています。

たとえば、次の C# コードの例を考えてみます。

using System.IO;

namespace Example{

public class Hello { public Stream MyHandler(Stream stream) { //function logic } }}

例の C# コードでは、最初のパラメータはハンドラー (MyHandler) の入力であり、イベントデータ(Amazon S3 などのイベントソースによって発行)、Stream など指定するカスタム入力 (この例のように)、または任意のカスタムデータオブジェクトとすることができます。出力は Stream 型となります。

標準のデータ型の処理

ここに示されているそのほかの型は、すべてシリアライザーを指定する必要があります。

76

Page 83: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• .NET プリミティブ型 (文字列、整数など)。• コレクションとマップ - IList、IEnumerable、IList<T>、Array、IDictionary、IDictionary<TKey, TValue>• POCO (Plain old CLR objects) 型• 定義済み AWS イベントタイプ• 非同期の呼び出しの際、戻り型は Lambda により無視されます。このような場合、戻り型を void に設定

することもできます。• .NET 非同期プログラミングを使用している場合、戻り型は Task および Task<T> 型で async およびawait キーワードを使用できます。詳細については、「AWS Lambda で C# 関数の Async を使用する (p. 78)」を参照してください。

関数の入力および出力パラメータが System.IO.Stream 型でない限り、シリアル化する必要があります。AWS Lambda は、アプリケーションのアセンブリレベルまたはメソッドレベルで適用できるデフォルトのシリアライザーを提供します。または、ILambdaSerializer インターフェイスを実装して独自に定義することもできます。このインターフェイスは、Amazon.Lambda.Core ライブラリで提供されています。詳細については、「デプロイパッケージの作成 (C#) (p. 87)」を参照してください。

メソッドにデフォルトのシリアライザー属性を追加するには、最初に project.json ファイルのAmazon.Lambda.Serialization.Json に依存関係を追加します。

{ "version": "1.0.0-*", "dependencies":{ "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.1" }, "Amazon.Lambda.Serialization.Json": "1.0.0" }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } }}

以下の例では、あるメソッドでデフォルトの Json.NET シリアライザーを指定し、別のメソッドで選択したものを指定することで、柔軟な利用が可能であることを示しています。

public class ProductService{ [LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] public Product DescribeProduct(DescribeProductRequest request) { return catalogService.DescribeProduct(request.Id); } [LambdaSerializer(typeof(MyJsonSerializer))] public Customer DescribeCustomer(DescribeCustomerRequest request) { return customerService.DescribeCustomer(request.Id); }}

ハンドラー署名

Lambda 関数を作成する場合、呼び出すコードをどこで探すか AWS Lambda に指示するハンドラー文字列を指定する必要があります。C# では、次の形式になります。

ASSEMBLY::TYPE::METHOD where:

77

Page 84: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• ASSEMBLY は、アプリケーションの .NET アセンブリファイルの名前です。.NET Core CLI を使用してアプリケーションを構築する場合、project.json で buildOptions.outputName 設定を使用してアセンブリ名を設定していない場合、ASSEMBLY 名が project.json ファイルを含むフォルダの名前になります。詳細については、「.NET Core CLI (p. 87)」を参照してください。この場合、フォルダ名はHelloWorldApp だと仮定します。

• TYPE は、Namespace と ClassName からなるハンドラー型の正式名称となります。 この場合、Example.Hello です。

• METHOD は、関数ハンドラー名で、この場合 MyHandler です。

最終的に、署名の形式は、Assembly::Namespace.ClassName::MethodName となります。

再び次の例を考えます。

using System.IO;{ namespace Example public class Hello { public Stream MyHandler(Stream stream) { //function logic }}

ハンドラー文字列は次のようになります。 HelloWorldApp::Example.Hello::MyHandlerImportant

ハンドラー文字列で指定されたメソッドが過負荷になっている場合は、Lambda が呼び出す必要があるメソッドの正確な署名を指定する必要があります。複数の (過負荷の) 署名の中から選択する必要がある場合、AWS Lambda は有効な署名を拒否します。

Lambda 関数ハンドラーの制限

ハンドラー署名にいくつかの制限があることに注意してください

• unsafe コンテキストは、ハンドラーメソッドとその依存関係の内部で使用できますが、ハンドラー署名に unsafe がなくポインタ型を使用できない場合があります。詳細については、unsafe (C# リファレンス) を参照してください。

• params キーワードを使用して可変数のパラメータを渡さなかったり、可変数のパラメータをサポートするために使用する入力パラメータまたは戻りパラメータとして ArgIterator を使用できない場合があります。

• ハンドラーは汎用メソッドでないことがあります (例: IList<T> Sort<T>(IList<T> input))。• async void 署名を持つ Async ハンドラーはサポートされていません。

AWS Lambda で C# 関数の Async を使用する

大容量ファイルを Amazon S3 にアップロードする、DynamoDB から大量のストリームのレコードを読み込むなど、Lambda 関数で長時間実行するプロセスが必要になることがわかっている場合は、async/awaitパターンを利用できます。この署名でハンドラーを作成することにより、Lambda は関数を同期的に実行し、実行が完了するのに最大 5 分間待ってから戻るかタイムアウトになります。以下に例を示します。

public async Task<Response> ProcessS3ImageResizeAsync(SimpleS3Event input){ var response = await client.DoAsyncWork(input); return response;}

78

Page 85: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

このパターンを使用する場合は、いくつかの考慮事項を検討してください。

• AWS Lambda は async void メソッドをサポートしません。• await 演算子を実装しないで非同期 Lambda 関数を作成すると、.NET がコンパイラの警告を出し、予

期しない動作が発生します。たとえば、ある非同期アクションは実行され、他の非同期アクションは実行されない、または関数の実行が完了する前に一部の非同期アクションが完了しない、などです。

public async Task ProcessS3ImageResizeAsync(SimpleS3Event event) // Compiler warning{ client.DoAsyncWork(input); }

• Lambda 関数は複数の非同期呼び出しを含めることができ、また並行で呼び出すことができます。複数のタスクを使用するため、Task.WhenAll および Task.WhenAny メソッドを使用できます。Task.WhenAll メソッドを使用するには、配列としてオペレーションのリストをメソッドに渡します。以下の例では、配列へ一部の操作を含めるのを怠ると、その操作が完了する前に呼び出しが返されることに注意してください。

public async Task DoesNotWaitForAllTasks1(){ // In Lambda, Console.WriteLine goes to CloudWatch Logs. var task1 = Task.Run(() => Console.WriteLine("Test1")); var task2 = Task.Run(() => Console.WriteLine("Test2")); var task3 = Task.Run(() => Console.WriteLine("Test3")); // Lambda may return before printing "Test2" since we never wait on task2. await Task.WhenAll(task1, task3);}

Task.WhenAny メソッドを使用するには、配列としてオペレーションのリストを再度メソッドに渡します。最初の操作が完了すると、他がまだ実行中でも呼び出しがすぐに返されます。

public async Task DoesNotWaitForAllTasks2(){ // In Lambda, Console.WriteLine goes to CloudWatch Logs. var task1 = Task.Run(() => Console.WriteLine("Test1")); var task2 = Task.Run(() => Console.WriteLine("Test2")); var task3 = Task.Run(() => Console.WriteLine("Test3")); // Lambda may return before printing all tests since we're only waiting for one to finish. await Task.WhenAny(task1, task2, task3);}

Context オブジェクト (C#)

メソッドに ILambdaContext パラメータを追加することにより、Lambda 関数がどのように AWSLambda ランタイムとやり取りするか、役に立つ情報を取得できます。その代わりに、AWS Lambda は関数に関連付けられた CloudWatch ログストリームや、関数を呼び出したクライアントの ID などの実行時の詳細を提供します。これには、コンテキストオブジェクトによって提供されるプロパティを介してアクセスできます。

これを行うには、次の署名でメソッドを作成します。

public void Handler(string Input, ILambdaContext context)

context オブジェクトのプロパティは次のとおりです。

79

Page 86: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• MemoryLimitInMB: Lambda 関数に対して設定したメモリ制限 (MB 単位)。• FunctionName: 実行中の Lambda 関数の名前。• FunctionVersion: 実行中の Lambda 関数のバージョン。エイリアスを使用して関数を呼び出した場

合、FunctionVersion はエイリアスが指すバージョンになります。• InvokedFunctionArn: この関数の呼び出しに使用された ARN。関数 ARN またはエイリアス ARN を

指定できます。非修飾 ARN は $LATEST バージョンを実行し、エイリアスはそれが指定する関数のバージョンを実行します。

• AwsRequestId: リクエストに関連付けられた AWS リクエスト ID。これは、この Lambda 関数を呼び出したクライアントに返された ID です。AWS サポートで、フォローアップの問い合わせにリクエスト ID を使用できます。AWS Lambda が関数を再試行する場合 (たとえば、Kinesis レコードを処理するLambda 関数が例外をスローする状況)、リクエスト ID は同じままです。

• LogStreamName: CloudWatch は特定の Lambda 関数の実行のストリーム名を記録します。提供されたIAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。

• LogGroupName: 呼び出される Lambda 関数と関連付けられた CloudWatch ロググループ名。提供された IAM ユーザーに CloudWatch アクションのアクセス権限がない場合、null になることがあります。

• ClientContext: AWS Mobile SDK を通じて呼び出されたクライアントアプリケーションとデバイスに関する情報。null とすることができます。クライアントコンテキストでは、クライアント ID、アプリケーションのタイトル、バージョン名、バージョンコード、アプリケーションのパッケージ名などのクライアント情報が提供されます。

• Identity: AWS Mobile SDK を通じて呼び出された場合の、Amazon Cognito ID プロバイダーについての情報。null とすることができます。

• RemainingTime: 関数が終了するまでの残りの実行時間。Lambda 関数を作成するときに、最大の時間制限を設定します。この時間制限に達すると、AWS Lambda は関数の実行を終了します。関数の残り実行時間に関する情報を使用して、タイムアウトに近づいたときの関数の動作を指定できます。これは、TimeSpan フィールドです。

• Logger: ILambdaContext オブジェクトに関連付けられた Lambda ロガーを返します。詳細については、「ログ記録 (C#) (p. 80)」を参照してください。

次の C# コードスニペットは、コンテキスト情報の一部を表示する単純なハンドラ関数を示しています。

public async Task Handler(ILambdaContext context){ Console.Writeline("Function name: " + context.FunctionName); Console.Writeline("RemainingTime: " + context.RemainingTime); await Task.Delay(TimeSpan.FromSeconds(0.42)); Console.WriteLine("RemainingTime after sleep: " + context.RemainingTime);}

ログ記録 (C#)Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログをCloudWatch Logs に書き込みます。

C# プログラミングモデルでは、関数にデータログを記録する 3 つの方法があることに注意してください。

• C# Console クラスで提供される静的 Write メソッドまたは WriteLine メソッドを使用します。Console.Write または同様のメソッドを使用して標準出力または標準エラーに書き込まれたものはCloudWatch Logs に記録されます。

public class ProductService{ public async Task<Product> DescribeProduct(DescribeProductRequest request) { Console.WriteLine("DescribeProduct invoked with Id " + request.Id);

80

Page 87: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

return await catalogService.DescribeProduct(request.Id); }}

• Amazon.Lambda.Core.LambdaLogger クラスの Log メソッドを使用します。これはアプリケーションのどこでも使用できる静的クラスです。これを使用するには、Amazon.Lambda.Core ライブラリを含める必要があります。

using Amazon.Lambda.Core; public class ProductService{ public async Task<Product> DescribeProduct(DescribeProductRequest request) { LambdaLogger.Log("DescribeProduct invoked with Id " + request.Id); return await catalogService.DescribeProduct(request.Id); }}

イベントサイズが許可されている制限内である場合、LambdaLogger.Log を呼び出すたびにCloudWatch Logs イベントが発生します。CloudWatch Logs の制限については、Amazon CloudWatchユーザーガイド の「CloudWatch Logs の制限」を参照してください。

• ILambdaContext のロガーを使用します。メソッドの ILambdaContext オブジェクト (指定した場合)には、LambdaLogger を表す Logger プロパティが含まれています。以下は、このメソッドを使用する例です。

public class ProductService{ public async Task<Product> DescribeProduct(DescribeProductRequest request, ILambdaContext context) { context.Logger.Log("DescribeProduct invoked with Id " + request.Id); return await catalogService.DescribeProduct(request.Id); }}

ログの検索方法

Lambda 関数が書き込んだログは、次のように確認できます。

• CloudWatch Logs でログを見つけます。ILambdaContext オブジェクトは、LogStreamName およびLogGroupName プロパティを提供します。これらのプロパティを使用して、ログの書き込み先の特定のログストリームを見つけることができます。

• コンソールを通じて Lambda 関数を呼び出す場合、呼び出しタイプは常に RequestResponse (同期実行) になります。コンソールは、Lambda 関数が LambdaLogger オブジェクトを使用して書き込むログを表示します。また、AWS Lambda は、Console.Write および Console.WriteLine メソッドからログを返します。

• Lambda 関数をプログラムで呼び出す場合、LogType パラメータを追加して、CloudWatch Logs に書き込まれるログデータの最後の 4 KB を取得できます。詳細については、「Invoke (p. 463)」を参照してください。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返します。AWS Command Line Interface を使用して関数を呼び出す場合、--log-type パラメータを値Tail とともに指定できます。

関数エラー (C#)Lambda 関数に例外が発生した場合は、Lambda によって例外の情報が返されます。例外は 2 つの異なる場所に発生する場合があります。

81

Page 88: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

• 初期化 (Lambda によるコードのロード、ハンドラー文字列の検証、静的でない場合はクラスのインスタンスの作成)。

• Lambda 関数の呼び出し。

シリアル化された例外情報はモデル化された JSON オブジェクトとしてペイロードとして返され、CloudWatch ログに出力されます。

初期化フェーズでは、無効なハンドラー文字列、ルール違反の型およびメソッド (Lambda 関数ハンドラーの制限 (p. 78) を参照)、またはその他の検証メソッド (シリアライザ属性を忘れる、入力または出力タイプとして POCO を持つなど) の例外がスローされる場合があります。これらの例外は、LambdaException 型です。以下に例を示します。

{ "errorType": "LambdaException", "errorMessage": "Invalid lambda function handler: 'http://this.is.not.a.valid.handler/'. The valid format is 'ASSEMBLY::TYPE::METHOD'."}

コンストラクタが例外をスローすると、エラータイプも LambdaException 型になりますが、構築中にスローされる例外は、それ自体がモデル化された例外オブジェクトの cause プロパティで提供されます。

{ "errorType": "LambdaException", "errorMessage": "An exception was thrown when the constructor for type 'LambdaExceptionTestFunction.ThrowExceptionInConstructor' was invoked. Check inner exception for more details.", "cause": { "errorType": "TargetInvocationException", "errorMessage": "Exception has been thrown by the target of an invocation.", "stackTrace": [ "at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean&canBeCached, RuntimeMethodHandleInternal&ctor, Boolean& bNeedSecurityCheck)", "at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)", "at System.Activator.CreateInstance(Type type, Boolean nonPublic)", "at System.Activator.CreateInstance(Type type)" ], "cause": { "errorType": "ArithmeticException", "errorMessage": "Sorry, 2 + 2 = 5", "stackTrace": [ "at LambdaExceptionTestFunction.ThrowExceptionInConstructor..ctor()" ] } }}

例に示すように、内部例外は常に保持され (cause プロパティとして)、深い入れ子になる場合があります。

例外は、呼び出し中にも発生することがあります。この場合、例外のタイプが保持され、例外はペイロードとして直接 CloudWatch ログで返されます。以下に例を示します。

{ "errorType": "AggregateException", "errorMessage": "One or more errors occurred. (An unknown web exception occurred!)", "stackTrace": [ "at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)", "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)",

82

Page 89: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

"at lambda_method(Closure , Stream , Stream , ContextInfo )" ], "cause": { "errorType": "UnknownWebException", "errorMessage": "An unknown web exception occurred!", "stackTrace": [ "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<CheckWebsiteStatus>d__0.MoveNext()" ], "cause": { "errorType": "WebException", "errorMessage": "An error occurred while sending the request. SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)", "at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()" ], "cause": { "errorType": "HttpRequestException", "errorMessage": "An error occurred while sending the request.", "stackTrace": [ "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.<SendRequest>d__63.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)" ], "cause": { "errorType": "CurlException", "errorMessage": "SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)", "at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)" ] } } } }

83

Page 90: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプログラミングモデル

}

エラー情報が表示される方法は、その呼び出し型によって決まります。

• RequestResponse 呼び出し型 (同期実行) : この場合、エラーメッセージを取得します。

たとえば、Lambda コンソールを使用して Lambda 関数を呼び出す場合、RequestResponse は常に呼び出し型であり、コンソールには AWS Lambda により返されるエラー情報が [Execution result] セクションに表示されます。

• Event 呼び出し型 (非同期実行) : この場合、AWS Lambda は何も返しません。代わりに、エラー情報がCloudWatch Logs および CloudWatch メトリクスに記録されます。

イベントソースに応じて、AWS Lambda はエラーになった Lambda 関数を返す場合があります。詳細については、「再試行動作について (p. 160)」を参照してください。

関数エラーの処理

カスタムエラー処理を作成して、Lambda 関数から直接例外をスローさせ、AWS Step Functions StateMachine 内で直接処理 (再試行またはキャッチ) できます。詳細については、ステートマシンを使用したエラー条件の処理を参照してください。

CreateAccount ステートは、Lambda 関数を使用してお客様の詳細をデータベースに書き込むタスクと考えてください。

• タスクが成功した場合は、アカウントが作成され、ようこそ E メールが送信されます。• 既に存在するユーザー名でアカウントを作成しようとすると、Lambda 関数はエラーを発生させ、ス

テートマシンによって別のユーザー名を使用してアカウント作成プロセスを再試行するように促されます。

次のコード例はそれを行う方法を示しています。C# のカスタムエラーは Exception クラスを拡張する必要があることに注意してください。

namespace Example { public class AccountAlreadyExistsException : Exception { public AccountAlreadyExistsException(String message) : base(message) { } }}

namespace Example { public class Handler { public static void CreateAccount() { throw new AccountAlreadyExistsException("Account is in use!"); } }}

Catch ルールを使用してエラーをキャッチするように Step Functions を設定できます。Lambda は実行時にエラー名を例外のシンプルなクラス名に自動的に設定します。

{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [

84

Page 91: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

{ "ErrorEquals": ["AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … }}

実行時、AWS Step Functions はエラーをキャッチし、Next 移行に指定されているとおりSuggestAccountName 状態に移行します。

カスタムエラー処理によって、サーバーレスアプリケーションの作成がより簡単になります。この機能は、Lambda プログラミングモデル (p. 19) でサポートされているすべての言語に統合できるため、選択したプログラミング言語でアプリケーションを設計したり、作業途中で混用したり組み合わせたりできます。

AWS Step Functions および AWS Lambda を使用した独自のサーバーレスアプリケーション作成の詳細については、AWS Step Functions を参照してください。

デプロイパッケージの作成Lambda 関数を作成するには、最初に Lambda 関数デプロイパッケージ (コードと依存関係で構成される .zip または .jar ファイル) を作成します。zip を作成するときは、コードおよび依存関係のみを含め、フォルダは含めません。zip パッケージでセキュリティのアクセス権限を適切に設定する必要があります。

Lambda デプロイパッケージのアクセス権限ポリシーアップロードされた zip パッケージのアクセス権限が正しくないと、実行エラーの原因になることがあります。AWS Lambda では、デプロイパッケージを構成するコードファイルおよび任意の依存ライブラリにグローバルの読み取り権限が必要です。以下のサンプルを使用して、ユーザーアカウントに対するアクセス権限が制限されていないことを確認できます。

• Linux/Unix/OSX 環境 : zipinfo を下の例に示すように使用します。

$ zipinfo test.zipArchive: test.zipZip file size: 473 bytes, number of entries: 2-r-------- 3.0 unx 0 bx stor 17-Aug-10 09:37 exlib.py-r-------- 3.0 unx 234 tx defN 17-Aug-10 09:37 index.py2 files, 234 bytes uncompressed, 163 bytes compressed: 30.3%

-r-------- は、このファイルの所有者のみに読み取りアクセス権限があることを示します。個の場合、Lambda 関数の実行が失敗する可能性があります。必要なグローバル読み取りアクセス権限がある場合は、以下のように表示されます。

$ zipinfo test.zipArchive: test.zipZip file size: 473 bytes, number of entries: 2-r--r--r-- 3.0 unx 0 bx stor 17-Aug-10 09:37 exlib.py-r--r--r-- 3.0 unx 234 tx defN 17-Aug-10 09:37 index.py2 files, 234 bytes uncompressed, 163 bytes compressed: 30.3%

これを再帰的に解決するには、次のコマンドを実行します。

$ chmod 644 $(find /tmp/package_contents -type f)$ chmod 755 $(find /tmp/package_contents -type d)

85

Page 92: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

• 最初のコマンドで、/tmp/package_contents のすべてのファイルが、所有者に対して読み取り/書き込みアクセス権限を持ち、グループおよびグローバルに対して読み取りアクセス権限を持つように変更します。

• 2 番目のコマンドで、同じ権限をディレクトリにカスケードします。

完了したら、パッケージで必要な IAM アクセス権限を設定します。詳しくは AWS Lambda に対する認証とアクセスコントロール (p. 353) ポリシーを参照してください。

• デプロイパッケージの作成 (Node.js) (p. 86)• デプロイパッケージの作成 (C#) (p. 87)• デプロイパッケージの作成 (Go) (p. 96)• デプロイパッケージの作成 (Java) (p. 97)• デプロイパッケージの作成 (Python) (p. 104)

デプロイパッケージの作成 (Node.js)Lambda 関数を作成するには、最初に Lambda 関数デプロイパッケージ (コードと依存関係で構成される .zip ファイル) を作成します。前述したように、zip パッケージでセキュリティのアクセス権限を適切に設定する必要があります。詳しくは AWS Lambda に対する認証とアクセスコントロール (p. 353) ポリシーを参照してください。

デプロイパッケージは自分で作成するか、または Lambda コンソールで作成できます。コンソールでコードを直接記述すると、コンソールによってデプロイパッケージが作成およびアップロードされ、Lambda関数が作成されます。コンソールを使用して Lambda 関数を作成できるかどうかを判断するには、以下の点に注意してください。

• シンプルなシナリオ – カスタムコードで AWS SDK ライブラリのみが必要な場合は、AWS Lambda コンソールのインラインエディターを使用できます。コンソールを使用して、コードの編集および AWSLambda へのアップロードを行うことができます。コンソールは、コードとそれに関連する設定情報を、Lambda サービスが実行可能なデプロイパッケージに圧縮します。

サンプルイベントデータを使って手動で呼び出すことにより、コンソールでコードをテストすることもできます。

Note

Lambda サービスによって、AWS SDK for Node.js が事前インストールされています。• 高度なシナリオ – 画像処理のグラフィックスライブラリなど他のリソースを使用するコードを作成する

場合や、コンソールではなく AWS CLI を使用する場合は、最初に Lambda 関数デプロイパッケージを作成した後、コンソールまたは CLI を使用してパッケージをアップロードする必要があります。

Note

デプロイパッケージを作成した後、それを直接アップロードできます。またはオプションで先に .zip ファイルを Lambda 関数を作成する同じ AWS リージョンの Amazon S3 バケットにアップロードしておき、その後コンソールまたは AWS CLI を使用して Lambda 関数を作成するときにバケット名とオブジェクトキー名を指定できます。

以下に示しているのは、 (コンソールの外で) デプロイパッケージを作成する手順の例です。filename.js コードファイルを含むデプロイパッケージを作成するとし、コードには async ライブラリを使用しているとします。

1. テキストエディターを開き、コードを記述します。ファイル (filename.js など) を保存します。

このファイル名は、Lambda 関数の作成でハンドラーを指定するために使用します。

86

Page 93: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

2. 同じディレクトリで、npm を使用してコードが依存するライブラリをインストールします。たとえば、コードが async ライブラリを使用する場合、次の npm コマンドを使用します。

npm install async

3. ディレクトリは次の構造になります。

filename.jsnode_modules/asyncnode_modules/async/libnode_modules/async/lib/async.jsnode_modules/async/package.json

4. フォルダーの内容を zip 圧縮します。これがデプロイパッケージ (たとえば、sample.zip) です。

次に、Lambda 関数の作成時にデプロイパッケージとしてこの .zip ファイル名を指定します。

ネイティブバイナリなどの独自のバイナリを含める場合は、単純にアップロードする Zip ファイルにパッケージ化して、Node.js または先に開始した他の処理からそれらを呼び出すときに参照(作成した Zip ファイル内の相対パスを含めます) します。関数コードの先頭に次のものが含まれることを確認してください。process.env[‘PATH’] = process.env[‘PATH’] + ‘:’ +process.env[‘LAMBDA_TASK_ROOT’]

Lambda 関数パッケージにネイティブバイナリを含める方法について詳しくは、Running Executables inAWS Lambdaを参照してください。また、Zip ファイルのコンテンツに必要なアクセス権限を指定する必要があります。詳細については、「Lambda デプロイパッケージのアクセス権限ポリシー (p. 85)」を参照してください。

デプロイパッケージの作成 (C#).NET Core Lambda デプロイパッケージは、すべてのアセンブリの依存関係と共にコンパイルされた関数の zip ファイルです。このパッケージには、proj.deps.json ファイルも含まれています。これは、関数のすべての依存関係および .NET Core ランタイムを設定するために使用されるproj.runtimeconfig.json ファイルを .NET Core ランタイムに合図します。.NET CLI の publish コマンドは、これらすべてのファイルでフォルダを作成できますが、Lambda プロジェクトが通常クラスライブラリとして設定されていることより、デフォルトでは proj.runtimeconfig.json は含まれていません。proj.runtimeconfig.json を publish プロセスの一部として強制的に書き込むには、次をコマンドライン引数に渡します。/p:GenerateRuntimeConfigurationFiles=true to the publishcommand。

Note

dotnet publish コマンドでデプロイパッケージを作成することができますが、AWS Toolkitfor Visual Studio (p. 94) または .NET Core CLI (p. 87) のどちらかでデプロイパッケージを作成することが推奨されます。これらは、lambda-project.runtimeconfig.json ファイルを確認し、非 Linux ベースの依存関係の削除を含むパッケージバンドルの最適化を確保するために、Lambda 専用に最適化されたツールです。

トピック• .NET Core CLI (p. 87)• AWS Toolkit for Visual Studio (p. 94)

.NET Core CLI

.NET Core CLI では、クロスプラットフォームで .NET ベースの Lambda アプリケーションを作成することができます。このセクションでは、.NET Core CLI がインストールされていることを確認します。インストールしていない場合は、ここで行います。

87

Page 94: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

.NET CLI では、コマンドラインから .NET プロジェクトを作成するために new コマンドを使用します。これは、Visual Studio 以外でプラットフォームに既存しないプロジェクトを作成する場合に特に便利です。使用可能なプロジェクトタイプのリストを表示するには、コマンドラインを開き、.NET Core ランタイムをインストールした場所に移動し、次を入力します。dotnet new -all

次のように表示されます。

dotnet new -allUsage: new [options]

Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --force Forces content to be generated even if it would change existing files. -lang, --language Specifies the language of the template to create.

Templates Short Name Language Tags -----------------------------------------------------------------------------------------------------------------------------Console Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest xUnit Test Project xunit [C#], F#, VB Test/xUnit ASP.NET Core Empty web [C#], F# Web/Empty ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC ASP.NET Core Web App razor [C#] Web/MVC/Razor PagesASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA ASP.NET Core Web API webapi [C#], F# Web/WebAPI global.json file globaljson Config NuGet Config nugetconfig Config Web Config webconfig Config Solution File sln Solution Razor Page page Web/ASP.NET MVC ViewImports viewimports Web/ASP.NET

88

Page 95: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

MVC ViewStart viewstart Web/ASP.NET

Examples: dotnet new mvc --auth None --framework netcoreapp1.1 dotnet new mvc --framework netcoreapp1.1 dotnet new --help

したがって、たとえば、コンソールプロジェクトを作成するには、次を実行します。

1. 次のコマンドを使用して、プロジェクトの作成先となるディレクトリを作成します。mkdir 例2. 次のコマンドを使用して、そのディレクトリに移動します。 cd 例3. 次のコマンドを入力します。dotnet new console -o myproject

これにより、例ディレクトリに次のファイルが作成されます。

• Program.cs で、Lambda 関数のコードを作成します。• ファイルと .NET アプリケーションを構成する依存関係をリスト表示する XML ファイルである

MyProject.csproj。

AWS Lambda は、Amazon.Lambda.Templates nuget パッケージで追加のテンプレートを提供しています。次のコマンドを実行して、このパッケージをインストールします。dotnet new -i Amazon.Lambda.Templates::*

コマンド末尾の ::* は、最新バージョンをインストールするように信号を発信します。インストールが完了すると、Lambda テンプレートは dotnet new の一部として表示されます。これを確認するには、次のコマンドを再度実行します。dotnet new -all

これで、次が表示されます。

dotnet new -allUsage: new [options]

Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --force Forces content to be generated even if it would change existing files. -lang, --language Specifies the language of the template to create.

Templates Short Name Language Tags -----------------------------------------------------------------------------------------------------------------------------Lambda Detect Image Labels lambda.DetectImageLabels [C#] AWS/Lambda/FunctionLambda Empty Function lambda.EmptyFunction [C#] AWS/Lambda/FunctionLex Book Trip Sample lambda.LexBookTripSample [C#] AWS/Lambda/Function

89

Page 96: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

Lambda Simple DynamoDB Function lambda.DynamoDB [C#] AWS/Lambda/FunctionLambda Simple Kinesis Firehose Function lambda.KinesisFirehose [C#] AWS/Lambda/FunctionLambda Simple Kinesis Function lambda.Kinesis [C#] AWS/Lambda/FunctionLambda Simple S3 Function lambda.S3 [C#] AWS/Lambda/FunctionLambda ASP.NET Core Web API lambda.AspNetCoreWebAPI [C#] AWS/Lambda/ServerlessLambda DynamoDB Blog API lambda.DynamoDBBlogAPI [C#] AWS/Lambda/ServerlessLambda Empty Serverless lambda.EmptyServerless [C#] AWS/Lambda/ServerlessStep Functions Hello World lambda.StepFunctionsHelloWorld [C#] AWS/Lambda/ServerlessConsole Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest xUnit Test Project xunit [C#], F#, VB Test/xUnit ASP.NET Core Empty web [C#], F# Web/Empty ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC ASP.NET Core Web App razor [C#] Web/MVC/Razor PagesASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA ASP.NET Core Web API webapi [C#], F# Web/WebAPI global.json file globaljson Config NuGet Config nugetconfig Config Web Config webconfig Config Solution File sln Solution Razor Page page Web/ASP.NET MVC ViewImports viewimports Web/ASP.NET MVC ViewStart viewstart Web/ASP.NET

Examples: dotnet new mvc --auth Individual dotnet new console dotnet new --help

特定のテンプレートに関する詳細を確認するには、次のコマンドを使用します。dotnet new lambda.EmptyFunction --help

次の点に注意してください。

90

Page 97: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

-p|--profile The AWS credentials profile set in aws-lambda-tools-defaults.json and used as the default profile when interacting with AWS.string - Optional -r|--region The AWS region set in aws-lambda-tools-defaults.json and used as the default region when interacting with AWS.string - Optional

これらは Lambda 関数を作成するときに設定できるオプションの値であり、関数作成プロセスの一部として構成される aws-lambda-tools-defaults.json ファイルに自動的に書き込まれます。以下にこれらの意味を説明します。

• --profile: 実行ロール。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのIAM ロールのステップに従って、IAM ロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。• [ポリシーのアタッチ] で Lambda 関数の要件に最適なポリシーを選択します。その他

の AWS サービスと相互作用していない場合には、[AWSLambdaBasicExecutionRole]を選択できます。ただし、Lambda 関数が Kinesis と相互作用している場合には、[AWSLambdaKinesisExecutionRole] を選択します。

• -region: 関数が存在する Amazon リージョン。

たとえば、Lambda 関数を作成するには、--region パラメータ値を選択するリージョンで置き換え、--profile を IAM プロファイルで置き換えて、次のコマンドを実行します。

Note

Lambda 関数の要件の詳細については、「CreateFunction (p. 425)」を参照してください。

dotnet new lambda.EmptyFunction --name MyFunction --iam-profile default --region region

この場合、次のようなディレクトリ構造が作成されるはずです。

<dir>myfunction /src/myfunction /test/myfunction

src/myfunction ディレクトリで次のファイルを調べます。

• aws-lambda-tools-defaults.json: これは、Lambda 関数をデプロイするときに指定するコマンドラインオプションの場所です。以下に例を示します。

"profile":"iam profile"", "region" : "region", "configuration" : "Release", "framework" : "netcoreapp2.0", "function-runtime":"dotnetcore2.0", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "MyFunction::MyFunction.Function::FunctionHandler"

• Function.cs: Lambda ハンドラ関数コード。これは、デフォルトの Amazon.Lambda.Coreライブラリとデフォルトの LambdaSerializer 属性が含まれる C# テンプレートです。要件とオプションのシリ

91

Page 98: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

アル化に関する詳細は、「Lambda 関数のシリアル化 (p. 94)」を参照してください。また、これにはLambda 関数コードに適用するために編集できるサンプル関数も含まれています。

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;

using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace MyFunction{ public class Function { public string FunctionHandler1(string input, ILambdaContext context) { return input?.ToUpper(); } }}

• MyFunction.csproj: アプリケーションを構成するファイルとアセンブリをリスト表示するMSBuild ファイル。これには、前に説明した Lambda テンプレートを利用可能にする拡張機能のAmazon.Lambda.Tools パッケージが含まれていることに特に注意してください。

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup>

<ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.0.0" /> <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.1.0" /> </ItemGroup>

<ItemGroup> <DotNetCliToolReference Include="Amazon.Lambda.Tools" Version="2.0.0" /> </ItemGroup>

</Project>

• Readme: このファイルを使用して Lambda 関数をドキュメントします。

myfunction/test directory, examine the following files: で

• myFunction.Tests.csproj: 上記で説明したように、これは、テストプロジェクトを構成するファイルとアセンブリをリスト表示する MSBuild ファイルです。また、これには、関数をテストするために必要なすべての Lambda テンプレートを継続的に統合できる Amazon.Lambda.Core ライブラリが含まれていることに注目してください。

<Project Sdk="Microsoft.NET.Sdk"> ...

<PackageReference Include="Amazon.Lambda.Core" Version="2.0.0" />

92

Page 99: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

...

• FunctionTest.cs: src ディレクトリに含まれているのと同様の C# コードテンプレートファイルです。このファイルを編集して、関数の本番稼働コードを写し、本番稼働環境に Lambda 関数をアップロードする前にそれをテストできます。

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;

using Xunit;using Amazon.Lambda.Core;using Amazon.Lambda.TestUtilities;

using MyFunction;

namespace MyFunction.Tests{ public class FunctionTest { [Fact] public void TestToUpperFunction() {

// Invoke the lambda function and confirm the string was upper cased. var function = new Function(); var context = new TestLambdaContext(); var upperCase = function.FunctionHandler("hello world", context);

Assert.Equal("HELLO WORLD", upperCase); } }}

関数のテストに成功したら、パテントディレクトリ example から次のコマンドを実行して構築およびデプロイします。

dotnet restoredotnet lambda deploy-function MyFunction –-function-role role

デプロイ後には、次のコマンドで本番稼働環境における再テストを行い、Lambda 関数ハンドラに異なる値を渡すことができます。

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK"

すべてが正常に行われたと想定すると、以下が表示されます。

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK"Payload:"JUST CHECKING IF EVERYTHING IS OK"

Log Tail:START RequestId: id Version: $LATESTEND RequestId: idREPORT RequestId: id Duration: 0.99 ms Billed Duration: 100 ms Memory Size: 256 MB Max Memory Used: 12 MB

93

Page 100: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

Lambda 関数のシリアル化

Stream オブジェクト以外の入出力タイプを使用するすべての Lambda 関数には、アプリケーションにシリアル化ライブラリを追加する必要があります。これは以下の方法でできます。

• Json.NET を使用します。Lambda は JSON.NET を NuGet パッケージとして使用する JSON シリアライザーの実装を提供します。

• ILambdaSerializer インターフェイスの実装によって独自のシリアル化ライブラリを作成します。これは、Amazon.Lambda.Core ライブラリの一部として入手できます。インターフェイスは 2 つのメソッドを定義します。• T Deserialize<T>(Stream requestStream);

このメソッドを実装して、Invoke API から Lambda 関数ハンドラーに渡されるオブジェクトにリクエストのペイロードを逆シリアル化することができます。

• T Serialize<T>(T response, Stream responseStream);。

このメソッドを実装して、Lambda 関数ハンドラーから返される結果を Invoke API から返されたレスポンスペイロードにシリアル化することができます。

任意のシリアライザーを使用するため、MyProject.csproj ファイルに依存関係として追加します。

... <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.0.0" /> <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.0.1" /> </ItemGroup>

次に、それを AssemblyInfo.cs ファイルに追加します。たとえば、デフォルトの Json.NET シリアライザーを使用している場合は、以下を追加します。

[assembly:LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

Note

メソッドレベルでカスタムシリアル化属性を定義することができます。それにより、アセンブリレベルで指定されたデフォルトのシリアライザーが上書きされます。詳細については、「標準のデータ型の処理 (p. 76)」を参照してください。

AWS Toolkit for Visual Studio

AWS Toolkit for Visual Studio への Lambda プラグインを使用して、.NET ベースの Lambda アプリケーションを構築できます。プラグインは Nuget パッケージの一部として使用可能です。

ステップ 1: プロジェクトを作成、ビルドする

1. Microsoft Visual Studio を起動し、[New project] を選択します。

a. [File] メニューから [New] を選択し、[Project] を選択します。b. [New Project] ウィンドウで、[AWS Lambda Project (.NET Core)] を選択してから [OK] を選択し

ます。c. [Select Blueprint] ウィンドウでは、サンプルアプリケーションのリストから選択するオプション

が表示されます。これは、.NET ベースの Lambda アプリケーションの作成を開始するためのサンプルコードを提供するものです。

d. Lambda アプリケーションを最初から作成するには、[Blank Function] を選択してから [Finish] を選択します。

94

Page 101: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

2. プロジェクトの一部として作成される、aws-lambda-tools-defaults.json ファイルを確認します。このファイルでオプションを設定できます。オプションはデフォルトでは Lambda ツールが読み取ります。Visual Studio で作成されたプロジェクトテンプレートは、これらのフィールドの多くをデフォルト値を使用して設定します。次のフィールドに注意してください。

• プロファイル: Lambda 関数の実行に必要な IAM ロール。まだ実行ロールを作成していない場合は、以下を実行します。

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAM ロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。• [Role Name] では、AWS アカウント内で一意の名前を使用します。• [Select Role Type] で [AWS Service Roles] を選択し、そのロールを引き受けるアクセス権限

をそのサービスに付与するサービスロールを選択します。• [Attach Policy] で、Lambda 関数を実行するのに適したアクセス権限ポリシーを選択します。

• function-handler: function handler が指定されている場所です。これにより、ウィザードで設定する必要はありません。ただし、 関数コードで例例例例例、例例例例、例例例や例例の名前を変更するたびに、aws-lambda-tools-defaults.json file の該当するフィールドを更新する必要があります。

{ "profile":"iam-execution-profile"", "region" : "region", "configuration" : "Release", "framework" : "netcoreapp2.0", "function-runtime":"dotnetcore2.0", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "Assembly::Namespace.Class::Function" }

3. Function.cs ファイルを開きます。Lambda 関数ハンドラーコードを実装するためのテンプレートが提供されます。

4. Lambda 関数を表すコードを記述したら、アプリケーションで [Project] ノードを右クリックし、[Publish to AWS Lambda] を選択することによりアップロードできます。

5. [Upload Lambda Function] (Lambda 関数のアップロード) ウィンドウで、関数の名前を入力するか、以前に発行された関数を選択します。その後、[Next] を選択します。

95

Page 102: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

6. [Advanced Function Details] ウィンドウで、以下を実行します。

• [ロール名:] を指定します (以前に説明した IAM ロール)。• (オプション) Environment で使用する環境変数を指定します。詳細については、「Environment

Variables (p. 391)」を参照してください。• (オプション) Memory (MB) または Timeout (Secs) 設定を指定します。• (オプション) Lambda 関数が VPC 内で実行しているリソースにアクセスする必要がある場合は、

[VPC:] 設定を指定します。詳細については、「Amazon VPC 内のリソースにアクセスできるようにLambda 関数を構成する (p. 141)」を参照してください。

• [Next] を選択してから [Upload] を選択してアプリケーションをデプロイします。

詳細については、「Deploying an AWS Lambda Project with the .NET Core CLI」(.NET Core CLI で AWSLambda プロジェクトをデプロイする) を参照してください。

デプロイパッケージの作成 (Go)Lambda 関数を作成するには、最初に Lambda 関数デプロイパッケージ (コードと依存関係で構成される .zip ファイル) を作成します。

デプロイパッケージを作成した後、それを直接アップロードできます。またはオプションで先に .zip ファイルを Lambda 関数を作成する同じ AWS リージョンの Amazon S3 バケットにアップロードしておき、その後コンソールまたは AWS CLI を使用して Lambda 関数を作成するときにバケット名とオブジェクトキー名を指定できます。

Lambda 関数で作成された Go については、Go ランタイムディレクトリ内の Go 用 Lambda ライブラリをダウンロードし、次のコマンドを入力します。go get github.com/aws/aws-lambda-go

次のコマンドを使用して、CLI を介した Go Lambda 関数の構築、パッケージ、デプロイを実行します。例例例は、Lambda 例例例例の名前と一致する必要があることに注意してください。

GOOS=linux go build lambda_handler.gozip handler.zip ./lambda_handler# --handler is the path to the executable inside the .zipaws lambda create-function \ --region region \ --function-name lambda-handler \ --memory 128 \ --role arn:aws:iam::account-id:role/execution_role \ --runtime go1.x \ --zip-file fileb://path-to-your-zip-file/handler.zip \ --handler lambda-handler

Note

Windows または macOS などの非 Linux 環境を使用している場合は、 ハンドラ関数コードをコンパイルするときに 「Linux」用の GOOS (Go オペレーティングシステム) 環境変数を設定して、ハンドラ関数が Lambda 実行コンテキストと互換性があることを確認してください。

Windows におけるデプロイパッケージの作成AWS Lambda で動作する .zip を Windows で作成するには、build-lambda-zip ツールのインストールが推奨されます。

Note

上記を実行していない場合には、git をインストールし、続いてお使いの Windows %PATH% 環境変数に git 実行可能ファイルを追加します。

96

Page 103: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

ツールのダウンロードには、次のコマンドを実行します。

go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip

GOPATH でこのツールを使用します。Go のデフォルト版インストールがある場合、このツールは通常%USERPROFILE%\Go\bin にあります。それ以外の場合は、Go ランタイムをインストールした場所に移動し、次の操作を行います。

cmd.exe で次を実行します。

set GOOS=linuxgo build -o main main.go%USERPROFILE%\Go\bin\build-lambda-zip.exe -o main.zip main

Powershell で、次を実行します。

$env:GOOS = "linux"go build -o main main.go~\Go\Bin\build-lambda-zip.exe -o main.zip main

デプロイパッケージの作成 (Java)デプロイパッケージは、.zip ファイルまたはスタンドアロン jar とすることができ、ユーザーが選択できます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。

ここでは、Maven を使用してスタンドアロン jar を作成する例と、Gradle を使用して .zip ファイルを作成する例を示します。詳細については、次のトピックを参照してください。

トピック• IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)• Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)• .zip デプロイパッケージの作成 (Java) (p. 102)• Eclipse IDE および AWS SDK プラグインを使用した Lambda 関数の作成 (Java) (p. 104)

IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java)このセクションでは、コマンドラインで Maven を使用してデプロイパッケージに Java コードをパッケージ化する方法を示します。

トピック• 開始する前に (p. 97)• プロジェクト構造の概要 (p. 98)• ステップ 1: プロジェクトを作成する (p. 98)• ステップ 2: プロジェクトをビルドする (デプロイパッケージを作成する) (p. 99)

開始する前に

Maven コマンドラインビルドツールをインストールする必要があります。詳細については、「Maven」を参照してください。Linux を使用している場合は、パッケージマネージャーを確認します。

sudo apt-get install mvn

Homebrew を使用している場合

97

Page 104: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

brew install maven

プロジェクト構造の概要

プロジェクトを設定すると、次のフォルダー構造が作成されます。

project-dir/pom.xml         project-dir/src/main/java/ (your code goes here)

コードは /java フォルダーにあります。たとえば、パッケージ名が example で、このパッケージにHello.java クラスがある場合、構造は以下のようになります。

project-dir/src/main/java/example/Hello.java

プロジェクトを作成すると、結果的に生じる .jar ファイル (デプロイパッケージ) は project-dir/target サブディレクトリにあります。

ステップ 1: プロジェクトを作成する

このセクションの手順に従って Java プロジェクトを作成します。

1. プロジェクトディレクトリ (project-dir) を作成します。2. project-dir ディレクトリで、次のものを作成します。

• プロジェクトオブジェクトモデルファイルの pom.xml。Maven でプロジェクトをビルドするために、次のプロジェクト情報と設定の詳細を追加します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>doc-examples</groupId> <artifactId>lambda-java-example</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>lambda-java-example</name>

<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.1.0</version> </dependency> </dependencies>

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal>

98

Page 105: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

</goals> </execution> </executions> </plugin> </plugins> </build></project>

Note

• 「dependencies」セクションで、groupId (com.amazonaws) は Maven 中央レポジトリの Maven アーティファクト用の Amazon AWS グループ ID です。artifactId (aws-lambda-java-core) は、RequestHandler、RequestStreamHandler の定義、およびJava アプリケーションで使用する Context AWS Lambda インターフェイスを提供するAWS Lambda のコアライブラリです。ビルド時に、Maven はこれらの依存関係を解決します。

• プラグインセクションでは、Apache maven-shade-plugin は、Maven がビルドプロセス中にダウンロードして使用するプラグインです。このプラグインは、デプロイパッケージであるスタンドアロン .jar (.zip ファイル) を作成するために、jar のパッケージ化に使用されます。

• このガイドの他のチュートリアル トピックに従っている場合、特定のチュートリアルでは依存関係の追加が必要になることがあります。必ず、それらの依存関係を必要に応じて追加してください。

3. project-dir で、以下の構造を作成します。

project-dir/src/main/java

4. /java サブディレクトリで、Java ファイルとフォルダー構造 (ある場合) を追加します。たとえば、Java パッケージ名が example で、ソースコードが Hello.java の場合、ディレクトリ構造は以下のようになります。

project-dir/src/main/java/example/Hello.java

ステップ 2: プロジェクトをビルドする (デプロイパッケージを作成する)

これで、コマンドラインで Maven を使用してプロジェクトをビルドできます。

1. コマンドプロンプトで、ディレクトリをプロジェクトディレクトリ (project-dir) に変更します。2. 次の mvn コマンドを実行して、プロジェクトをビルドします。

$ mvn package

結果として生じる .jar は、project-dir/target/lambda-java-example-1.0-SNAPSHOT.jarとして保存されます。.jar 名は、 ファイルで artifactId および version ファイルを連結して作成されます。pom.xml

ビルドにより、結果として生じるこの .jar が作成され、pom.xml の情報を使用して必要な変換が行われます。これは、すべての依存関係を含むスタンドアロン .jar (.zip ファイル) です。これは、Lambda関数を作成するために AWS Lambda にアップロードできるデプロイパッケージです。

Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java)

このセクションでは、Eclipse IDE および Eclipse 用 Maven プラグインを使用してデプロイパッケージにJava コードをパッケージ化する方法について説明します。

99

Page 106: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

トピック• 開始する前に (p. 100)• ステップ 1: プロジェクトを作成、ビルドする (p. 100)

開始する前に

Eclipse 用 Maven プラグインをインストールします。

1. Eclipse を起動します。Eclipse の [Help] メニューから、[Install New Software] を選択します。2. [Install] ウィンドウで、[Work with:] ボックスに「http://download.eclipse.org/technology/

m2e/releases」と入力し、[Add] を選択します。3. 手順に従ってセットアップを完了します。

ステップ 1: プロジェクトを作成、ビルドする

このステップでは、Eclipse を開始し、Maven プロジェクトを作成します。必要な依存関係を追加し、プロジェクトをビルドします。ビルドでは、デプロイパッケージである .jar を作成します。

1. Eclipse で新しい Maven プロジェクトを作成します。

a. [File] メニューから [New] を選択し、[Project] を選択します。b. [New Project] ウィンドウで、[Maven Project] プロジェクトを選択します。c. [New Maven Project] ウィンドウで、[Create a simple project] を選択し、その他のデフォルトの選

択はそのままにします。d. [New Maven Project] ウィンドウおよび [Configure project] ウィンドウで、次の Artifact 情報を入

力します。

• [Group Id]: doc-examples• [Artifact Id]: lambda-java-example• [Version]: 0.0.1-SNAPSHOT• [Packaging]: jar• [Name]: lambda-java-example

2. ファイルに aws-lambda-java-core 依存関係を追加します。pom.xml

これは、RequestHandler、RequestStreamHandler、および Context インターフェイスの定義を提供します。これにより、AWS Lambda で使用できるコードをコンパイルすることができます。

a. pom.xml ファイルのコンテキスト (右クリック) メニューを開き、[Maven]、[Add Dependency]の順に選択します。

b. [Add Dependency] ウィンドウで、次の値を入力します。

[Group Id]: com.amazonaws

[Artifact Id]: aws-lambda-java-core

バージョン: 1.1.0

Note

このガイドの他のチュートリアル トピックに従っている場合、特定のチュートリアルでは依存関係の追加が必要になることがあります。必ず、それらの依存関係を必要に応じて追加してください。

3. Java クラスをプロジェクトに追加します。100

Page 107: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

a. プロジェクトで src/main/java サブディレクトリのコンテキスト (右クリック) メニューを開き、[New]、[Class] の順に選択します。

b. [New Java Class] ウィンドウで、次の値を入力します。

• [Package]: example• [Name]: Hello

Note

このガイドの他のチュートリアルに従っている場合、特定のチュートリアルでは、別のパッケージ名またはクラス名が推奨されることがあります。

c. Java コードを追加します。このガイドの他のチュートリアルに従っている場合は、提供されたコードを追加します。

4. プロジェクトをビルドします。

[Package Explorer] でプロジェクトのコンテキスト (右クリック) メニューを開き、[Run As] を選択してから、[Maven Build ...] を選択します。[Edit Configuration] ウィンドウで、[Goals] ボックスに「package」と入力します。

Note

結果的に生じる .jar、lambda-java-example-0.0.1-SNAPSHOT.jar は、デプロイパッケージとして使用できる最終的なスタンドアロン .jar ではありません。次のステップでは、Apache maven-shade-plugin を追加してスタンドアロン .jar を作成します。詳細については、Apache Maven Shade プラグインを参照してください。

5. maven-shade-plugin プラグインを追加し、再ビルドします。

maven-shade プラグインはパッケージの目標 (顧客コード .jar を作成) によって生成されたアーティファクト (jars) を取ります。また、コンパイルされた顧客コードを含むスタンドアロン .jar および解決された依存関係を pom.xml から作成しています。

a. pom.xml ファイルのコンテキスト (右クリック) メニューを開き、[Maven]、[Add Plugin] の順に選択します。

b. [Add Plugin] ウィンドウで、次の値を入力します。

• [Group Id]: org.apache.maven.plugins• [Artifact Id]: maven-shade-plugin• バージョン: 2.3

c. ここで再度ビルドします。

今回は、以前のように jar を作成し、maven-shade-plugin を使用して依存関係をプルして、スタンドアロン .jar を作成します。

i. プロジェクトのコンテキスト (右クリック) メニューを開き、[Run As] を選択してから、[Maven build ...] を選択します。

ii. [Edit Configuration] ウィンドウで、[Goals] ボックスに「package shade:shade」と入力します。

iii. Run を選択します。

結果的に生じるスタンドアロン .jar (デプロイパッケージ) は、/target サブディレクトリにあります。

/target サブディレクトリのコンテキスト (右クリック) メニューを開き、[Show In]、[System Explorer]、の順に選択すると、lambda-java-example-0.0.1-SNAPSHOT.jarが表示されます。

101

Page 108: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

.zip デプロイパッケージの作成 (Java)このセクションでは、デプロイパッケージとして .zip ファイルを作成する例を示します。この zip を作成するには、任意のビルドおよびパッケージ化ツールを使用できます。使用するツールにかかわらず、結果的に生じる .zip ファイルには次の構造が必要です。

• ルートレベルでコンパイルされたすべてのファイルおよびリソースファイル。• /lib ディレクトリでコードを実行するために必要なすべての jar。

Note

デプロイパッケージとしてスタンドアロン .jar (圧縮ファイル) をビルドすることもできます。Maven を使用したスタンドアロン .jar の作成例については、「デプロイパッケージの作成(Java) (p. 97)」を参照してください。

次の例では、Gradle のビルドおよびデプロイツールを使用して .zip を作成します。Important

Gradle バージョン 2.0 以降が必要です。

開始する前に

Gradle をダウンロードする必要があります。手順については、gradle のウェブサイト、https://gradle.org/を参照してください。

例 1: Gradle と Maven セントラルリポジトリを使用した .zip の作成

このウォークスルーの終了時には、以下の構造のコンテンツを持つプロジェクトディレクトリ (project-dir) が作成されます。

project-dir/build.gradle project-dir/src/main/java/

/java フォルダーにはコードが含まれます。たとえば、パッケージ名が example で、このパッケージにHello.java クラスがある場合、構造は次のようになります。

project-dir/src/main/java/example/Hello.java

プロジェクトを作成した後に結果的に生じる .zip ファイル (デプロイパッケージ) は、project-dir/build/distributions サブディレクトリにあります。

1. プロジェクトディレクトリ (project-dir) を作成します。2. project-dir に build.gradle ファイルを作成し、以下のコンテンツを追加します。

apply plugin: 'java'

repositories { mavenCentral()}

dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.1.0', 'com.amazonaws:aws-lambda-java-events:1.1.0' )}

task buildZip(type: Zip) { from compileJava

102

Page 109: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

from processResources into('lib') { from configurations.runtime } }

build.dependsOn buildZip

Note

• リポジトリセクションは Maven セントラルリポジトリを参照します。作成時には、Maven中央レポジトリから依存関係 (2 つの AWS Lambda ライブラリ) を取得します。

• buildZip タスクは、デプロイパッケージの .zip ファイルを作成する方法を示しています。

たとえば、結果として生じる .zip ファイルを解凍する場合、ルートレベルでコンパイルされたクラスファイルとリソースファイルがすべて見つかります。また、コードを実行するために必要な jar とともに、/lib ディレクトリも見つかります。

• このガイドの他のチュートリアル トピックに従っている場合、特定のチュートリアルでは依存関係の追加が必要になることがあります。必ず、それらの依存関係を必要に応じて追加してください。

3. project-dir で、以下の構造を作成します。

project-dir/src/main/java/

4. /java サブディレクトリで、Java ファイルとフォルダー構造 (ある場合) を追加します。たとえば、Java パッケージ名が example で、ソースコードが Hello.java の場合、ディレクトリ構造は次のようになります。

project-dir/src/main/java/example/Hello.java

5. 次の gradle コマンドを実行して、.zip ファイルにプロジェクトをビルドおよびパッケージ化します。

project-dir> gradle build

6. project-dir/build/distributions サブディレクトリで、結果的に生じる project-dir.zipファイルを確認します。

7. これでデプロイパッケージの .zip ファイルを AWS Lambda にアップロードして Lambda 関数を作成し、サンプルイベントデータを使ってこれを手動で呼び出してテストできます。手順については、(オプション) Java で Lambda 関数を作成する (p. 57)

例 2: ローカル jar を使用した Gradle による .zip の作成

Maven セントラルリポジトリを使用しない選択もできます。代わりに、すべての依存関係をプロジェクトフォルダーに含めます。この場合、プロジェクトフォルダー (project-dir) は次の構造になります。

project-dir/jars/ (all jars go here)        project-dir/build.gradle         project-dir/src/main/java/ (your code goes here)

したがって、Java コードに example パッケージと Hello.java クラスがある場合、コードは次のサブディレクトリにあります。

project-dir/src/main/java/example/Hello.java

build.gradle ファイルは次のようになります。

103

Page 110: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

apply plugin: 'java'

dependencies { compile fileTree(dir: 'jars', include: '*.jar')}

task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtime } }

build.dependsOn buildZip

依存関係は、すべての必要な jar を含むサブディレクトリとして project-dir/jars を識別するfileTree を指定することに注意してください。

ここで、パッケージをビルドします。次の gradle コマンドを実行して、.zip ファイルにプロジェクトをビルドおよびパッケージ化します。

project-dir> gradle build

Eclipse IDE および AWS SDK プラグインを使用した Lambda 関数の作成 (Java)AWS SDK Eclipse ツールキットには、デプロイパッケージを作成し、それをアップロードして Lambda関数を作成するための Eclipse プラグインが用意されています。開発環境として Eclipse IDE を使用できる場合、このプラグインにより Java コードの記述、デプロイパッケージの作成とアップロード、およびLambda 関数の作成を行うことができます。詳細情報については、AWS Toolkit for Eclipse 入門ガイド を参照してください。Lambda 関数の記述用のツールキットの使用例については、「Using AWS Lambdawith the AWS Toolkit for Eclipse」を参照してください。

デプロイパッケージの作成 (Python)Lambda 関数を作成するには、最初に Lambda 関数デプロイパッケージ (コードと依存関係で構成される .zip ファイル) を作成します。zip パッケージでセキュリティのアクセス権限を適切に設定する必要があります。詳しくは AWS Lambda に対する認証とアクセスコントロール (p. 353) ポリシーを参照してください。

デプロイパッケージは自分で作成するか、または Lambda コンソールで作成できます。コンソールでコードを直接記述すると、コンソールによってデプロイパッケージが作成およびアップロードされ、Lambda関数が作成されます。コンソールを使用して Lambda 関数を作成できるかどうかを判断するには、以下の点に注意してください。

• シンプルなシナリオ – カスタムコードで AWS SDK ライブラリのみが必要な場合は、AWS Lambda コンソールのインラインエディターを使用できます。コンソールを使用して、コードの編集および AWSLambda へのアップロードを行うことができます。コンソールは、コードとそれに関連する設定情報を、Lambda サービスが実行可能なデプロイパッケージに圧縮します。

サンプルイベントデータを使って手動で呼び出すことにより、コンソールでコードをテストすることもできます。

Note

Lambda サービスによって、AWS SDK for Python が事前インストールされています。• 高度なシナリオ – 画像処理のグラフィックスライブラリなど他のリソースを使用するコードを作成する

場合や、コンソールではなく AWS CLI を使用する場合は、最初に Lambda 関数デプロイパッケージを作成した後、コンソールまたは CLI を使用してパッケージをアップロードする必要があります。

104

Page 111: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデプロイパッケージの作成

Note

デプロイパッケージを作成した後、それを直接アップロードできます。またはオプションで先に .zip ファイルを Lambda 関数を作成する同じ AWS リージョンの Amazon S3 バケットにアップロードしておき、その後コンソールまたは AWS CLI を使用して Lambda 関数を作成するときにバケット名とオブジェクトキー名を指定できます。

デプロイパッケージの作成手順 (コンソール外) の例を以下に示します。Note

Lambda 関数で純粋な Python モジュールを使用する場合、この手順は Python および pip の標準的なインストールのほとんどで動作します。ネイティブ依存関係があるモジュールが含まれる場合、または Homebrew を使用して OS X に Python をインストールした場合は、次のセクションで説明する Virtualenv を使用してデプロイパッケージを作成する場合の手順を参照してください。詳細については、「Virtualenv で作成した Python 環境を使用してデプロイパッケージを作成する (p. 105)」および Virtualenv のウェブサイトを参照してください。

pip を使用して、依存関係/ライブラリをインストールします。pip のインストールについては、「Installation」を参照してください。

1. ディレクトリを作成します (たとえば、project-dir)。2. Python ソースファイル (.py ファイル) をすべてこのディレクトリのルートレベルに保存します。3. pip を使用してライブラリをインストールします。これらのライブラリも、ディレクトリのルートレ

ベルにインストールします。

pip install module-name -t /path/to/project-dir

たとえば、次のコマンドは requests HTTP ライブラリを project-dir ディレクトリにインストールします。

pip install requests -t /path/to/project-dir

Mac OS X を使用しており、Homebrew (Homebrewを参照) を使用して Python をインストールした場合は、前述のコマンドは動作しません。簡単な回避策は、setup.cfg に以下の内容の /path/to/project-dir ファイルを追加することです。

[install]prefix=

4. project-dir ディレクトリの内容を ZIP 圧縮します。これがデプロイパッケージです。Important

ディレクトリではなく、ディレクトリの中身を圧縮します。ZIP ファイルの内容は、Lambda関数の現在の作業ディレクトリとして利用できます (例: /project-dir/codefile.py/lib/yourlibraries)。

Note

AWS Lambda には、Python 向けの AWS SDK (Boto 3) が含まれます。デプロイパッケージに含める必要はありません。ただし、デフォルトで含まれるバージョン以外の Boto3 のバージョンを使用する場合は、それをデプロイパッケージに含めることができます。

Virtualenv で作成した Python 環境を使用してデプロイパッケージを作成するこのセクションでは、Virtualenv ツールで作成した Python 環境を使用している場合のデプロイパッケージの作成方法を説明します。次の例を考えます。

105

Page 112: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

• Virtualenv ツールを使用して以下の隔離された Python 環境を作成し、環境をアクティブ化します。

virtualenv path/to/my/virtual-env

Windows、OS X、Linux で、次のようにして環境をアクティブ化できます。• Windows では、activate.bat を使用してアクティブ化します。

path\to\my\virtual-env\Scripts\activate.bat

• OS X および Linux では、activate スクリプトをソースにします。

source path/to/my/virtual-env/bin/activate

• また、アクティブ化された環境にリクエストパッケージをインストールするには、以下を実行します。 :

pip install requests

次に、デプロイパッケージを作成するには、以下の作業を行います。

1. 最初に、AWS Lambda にアップロードにする Python コードを含む .zip ファイルを作成します。2. 前述のアクティブ化された仮想環境から .zip ファイルにライブラリを追加します。つまり、次のディ

レクトリの内容を .zip ファイルに追加します (ディレクトリそのものではなく、ディレクトリの内容を追加することに重ねて注意してください)。

Windows では、次のディレクトリです。

%VIRTUAL_ENV%\Lib\site-packages

OS X、Linux では、次のディレクトリです。

$VIRTUAL_ENV/lib/python3.6/site-packages

Note

仮想環境の site-packages にパッケージが見つからない場合は、dist-packages ディレクトリにある場合があります。

Python デプロイパッケージの作成例については、「Python (p. 193)」を参照してください。

SAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

Note

この機能は、パブリックベータの一部として提供されており、随時変更される場合があります。

AWS SAM はサーバーレスアプリケーションを迅速かつ簡単にデプロイする方法です。これにより、シンプルなテンプレートを記述して関数およびイベントソース (Amazon API Gateway、Amazon S3、Kinesisなど) を定義できます。

SAM Local は、AWS SAM に基づく AWS CLI ツールであり、サーバーレスアプリケーションを Lambdaランタイムにアップロードする前にローカルで開発、テスト、および分析するための環境を提供します。SAM Local では、Linux、Mac、または Microsoft Windows を問わず、AWS ランタイム環境をシミュ

106

Page 113: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

レートするローカルテスト環境を作成できます。これにより、パフォーマンスなどの問題に対処しやすくなります。SAM Local を使用すると、アプリケーションパッケージを AWS Lambda ランタイムに再デプロイする必要がないため、Lambda 関数コードをより高速に反復開発できます。詳細については、「SAMLocal によるシンプルなアプリケーションの構築 (p. 110)」を参照してください。

SAM Local は、AWS SAM と連携するため、SAM テンプレートで定義された関数を直接呼び出すことも、API Gateway エンドポイント経由で呼び出すこともできます。SAM Local の機能を使用して、独自のテスト環境でサーバーレスアプリケーションのパフォーマンスを分析し、必要に応じて更新できます。以下の例では、SAM Local を使用するその他の利点をサンプルオペレーションコードで示します。たとえば、次の操作を実行できます。

• サンプルの関数ペイロード (Amazon S3 イベントなど) を生成する。

$ sam local generate-event s3 --bucket bucket-name --key key-name > event_file.json

• Lambda 関数を使用してサンプルの関数ペイロードをローカルでテストする。

$ sam local invoke function-name -e event_file.json

• ローカルの API Gateway を生成して HTTP リクエストおよびレスポンスの機能をテストする。ホットリロード機能を使用することで、関数を再起動したり AWS ランタイムにリロードしたりせずにテストおよび反復実行できます。

$ sam local start-api

SAM Local によって、SAM テンプレート内に API イベントソースが定義されている関数があれば自動的に検出され、定義された HTTP パスにマウントされます。次の例では、Ratings 関数が GET リクエストによって ratings.py:handler() を /ratings にマウントします。

Ratings: Type: AWS::Serverless::Function Properties: Handler: ratings.handler Runtime: python3.6 Events: Api: Type: Api Properties: Path: /ratings Method: get

デフォルトでは、SAM Local は Proxy との統合を使用して、Lambda 関数からのレスポンスにstatusCode、headers、body のいずれかが含まれるようにします。以下に例を示します。

// Example of a Proxy Integration responseexports.handler = (event, context, callback) => { callback(null, { statusCode: 200, headers: { "x-custom-header" : "my custom header value" }, body: "hello world" });}

Lambda 関数が有効な プロキシ統合レスポンスを返さない場合、関数にアクセスすると HTTP 500(Internal Server Error) レスポンスが返されます。また、SAM Local は次のエラーログメッセージを表示するため、問題の診断に役立ちます。

107

Page 114: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

ERROR: Function ExampleFunction returned an invalid response (must include one of: body, headers or statusCode in the response object)

• メモリの最大使用量や Lambda 関数呼び出しのタイムアウト制限などのラインタイム制約を遵守していることを確認する。

• AWS Lambda ランタイムログ、および Lambda 関数コード (console.log など) で指定されたカスタマイズされたログ出力を検査する。SAM Local では、この出力が自動的に表示されます。例を以下に示します。

START RequestId: 2137da9a-c79c-1d43-5716-406b4e6b5c0a Version: $LATEST 2017-05-18T13:18:57.852Z 2137da9a-c79c-1d43-5716-406b4e6b5c0a Error: any error information END RequestId: 2137da9a-c79c-1d43-5716-406b4e6b5c0a REPORT RequestId: 2137da9a-c79c-1d43-5716-406b4e6b5c0a Duration: 12.78 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 29 MB

• AWS CLI で確定したセキュリティ認証情報を受け入れる。これにより、サーバーレスアプリケーションを構成している AWS のサービスを Lambda 関数でリモートから呼び出すことができます。AWS CLI をまだインストールしていない場合は、「AWS コマンドラインインターフェイスのインストール」を参照してください。

AWS CLI および SDK と同様に、SAM Local は次の順序で認証情報を検索します。• 環境変数 (AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)• AWS 認証情報ファイル (Linux、MacOS、Unix の ~/.aws/credentials、または Windows の C:\Users\USERNAME \.aws\credentials)

• インスタンスプロファイル認証情報 (割り当てられたインスタンスロールで Amazon EC2 を実行している場合)

ランタイムのサポートSAM Local は以下の AWS ランタイムをサポートします。

• node.js 4.3• node.js 6.10• python 2.7• python 3.6• java8• go 1.x

SAM Local をまだインストールしていない場合は、「SAM Local のインストール (p. 7)」を参照してください。

SAM Local の使用開始SAM Local は、以下の CLI オペレーションで構成されています。

• start-api: すべての Lambda 関数をホストするローカル HTTP サーバーを作成します。ブラウザまたはCLI を使用してアクセスすると、このオペレーションは Docker コンテナをローカルで起動して関数を呼び出します。AWS::Serverless::Function リソースの CodeUri プロパティを読み取り、Lambda関数コードが含まれているファイルシステムのパスを見つけます。このパスは、プロジェクトのルートディレクトリ (Node.js や Python などの解釈された言語の場合)、コンパイル済みアーティファクトを保存するビルドディレクトリ、または .jar ファイル (Java の場合) です。

108

Page 115: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

解釈された言語を使用する場合、ローカルな変更は同じ Docker コンテナ内で使用可能になります。このアプローチでは、再デプロイすることなく、Lambda 関数の再呼び出しが可能です。複雑なパッキングサポートを必要とするコンパイル済み言語またはプロジェクトでは、独自のビルドソリューションを実行し、必要なビルドの依存関係ファイルがあるディレクトリを AWS SAM で参照することをお勧めします。

• invoke: ローカル Lambda 関数を一度呼び出し、呼び出しの完了後に終了します。

# Invoking function with event file$ sam local invoke "Ratings" -e event.json

# Invoking function with event via stdin$ echo '{"message": "Hey, are you there?" }' | sam local invoke "Ratings"

# For more options$ sam local invoke --help

• generate-event: 疑似サーバーレスイベントを生成します。これらを使用して、AmazonS3、Kinesis、DynamoDB などの非同期イベントに応答する関数をローカルで開発およびテストできます。generate-event オペレーションで使用できるコマンドオプションを以下に示します。

sam local generate-eventNAME: sam local generate-event - Generates Lambda events (e.g. for S3/Kinesis etc) that can be piped to 'sam local invoke'

USAGE: sam local generate-event command [command options] [arguments...]

COMMANDS: s3 Generates a sample Amazon S3 event sns Generates a sample Amazon SNS event kinesis Generates a sample Amazon Kinesis event dynamodb Generates a sample Amazon DynamoDB event api Generates a sample Amazon API Gateway event schedule Generates a sample scheduled event

OPTIONS: --help, -h show help

• validate: 正式な AWS Serverless Application Model 仕様に照らしてテンプレートを検証します。次に例を示します。

$ sam validateERROR: Resource "HelloWorld", property "Runtime": Invalid value node. Valid values are "nodejs4.3", "nodejs6.10", "nodejs8.10", "java8", "python2.7","python3.6"(line: 11; col: 6)

# Let's fix that error...$ sed -i 's/node/nodejs6.10/g' template.yaml

$ sam validateValid!

• package および deploy: sam package および sam deploy は、AWS CloudFormation の package コマンドおよび deploy コマンドを暗黙で呼び出します。SAM アプリケーションのパッケージングおよびデプロイメントの詳細については、「パッケージ化とデプロイ (p. 317)」を参照してください。

SAM Local で package コマンドおよび deploy コマンドを使用する方法は以下のとおりです。

# Package SAM template

109

Page 116: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

$ sam package --template-file sam.yaml --s3-bucket mybucket --output-template-file packaged.yaml

# Deploy packaged SAM template$ sam deploy --template-file ./packaged.yaml --stack-name mystack --capabilities CAPABILITY_IAM

SAM Local によるシンプルなアプリケーションの構築製品リストの作成、読み取り、更新、および削除を行うシンプルな RESTful API オペレーションを構築するとします。この場合、まず次のディレクトリ構造を作成します。

dir/products.js

dir/template.yaml

template.yaml ファイルは、Lambda 関数を記述する AWS SAM テンプレートです。この関数 1 つで、すべての API リクエストを処理します。

Note

デフォルトでは、start-api コマンドおよび invoke コマンドは template.yaml ファイルを作業ディレクトリで探します。別のディレクトリの template.yaml ファイルを参照する場合は、これらのオペレーションに -t パラメータまたは --template パラメータを追加して、このファイルへの絶対パスまたは相対パスを渡します。

template.yaml ファイルに以下の内容をコピーして貼り付けます。

AWSTemplateFormatVersion : '2010-09-09'Transform: AWS::Serverless-2016-10-31Description: My first serverless application.

Resources:

Products: Type: AWS::Serverless::Function Properties: Handler: products.handler Runtime: nodejs6.10 Events: ListProducts: Type: Api Properties: Path: /products Method: get CreateProduct: Type: Api Properties: Path: /products Method: post Product: Type: Api Properties: Path: /products/{product} Method: any

前の例では、以下の RESTful API エンドポイントを設定します。

• /products への PUT リクエストで新しい製品を作成します。• /products への GET リクエストですべての製品を一覧表示します。• /products/{product} への GET、PUT、または DELETE リクエストで製品の読み取り、更新、または削除

を行います。

110

Page 117: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

次に、以下のコードをコピーして products.js ファイル内に貼り付けます。

'use strict';

exports.handler = (event, context, callback) => {

let id = (event.pathParameters || {}).product || false; switch(event.httpMethod){

case "GET":

if(id) { callback(null, {body: "This is a READ operation on product ID " + id}); return; }

callback(null, {body: "This is a LIST operation, return all products"}); break;

case "POST": callback(null, {body: "This is a CREATE operation"}); break;

case "PUT": callback(null, {body: "This is an UPDATE operation on product ID " + id}); break;

case "DELETE": callback(null, {body:"This is a DELETE operation on product ID " + id}); break;

default: // Send HTTP 501: Not Implemented console.log("Error: unsupported HTTP method (" + event.httpMethod + ")"); callback(null, { statusCode: 501 })

}

}

start-api コマンドを呼び出して API オペレーションのローカルコピーを起動します。

$ sam local start-api

2017/05/18 14:03:01 Successfully parsed template.yaml (AWS::Serverless-2016-10-31)2017/05/18 14:03:01 Found 1 AWS::Serverless::Function2017/05/18 14:03:01 Mounting products.handler (nodejs6.10) at /products [POST]2017/05/18 14:03:01 Mounting products.handler (nodejs6.10) at /products/{product} [OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT]2017/05/18 14:03:01 Mounting products.handler (nodejs6.10) at /products [GET]2017/05/18 14:03:01 Listening on http://localhost:3000

You can now browse to the above endpoints to invoke your functions.You do not need to restart/reload while working on your functions,changes will be reflected instantly/automatically. You only need to restartif you update your AWS SAM template.

次に、ブラウザまたは CLI を使用して API エンドポイントをローカルでテストできます。

$ curl http://localhost:3000/products "This is a LIST operation, return all products"

$ curl -XDELETE http://localhost:3000/products/1

111

Page 118: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする

"This is a DELETE operation on product ID 1"

その他のサンプルを確認するには、aws sam local/samples を参照してください。

ローカルなログ記録

invoke コマンドおよび start-api コマンドを使用して、Lambda 関数の呼び出しのログをファイルにパイプできます。このアプローチは、SAM Local に対して自動テストを実行し、分析用のログを取得する場合に便利です。次に例を示します。

$ sam local invoke --log-file ./output.log

環境変数ファイルの使用

Lambda 関数で Environment Variables (p. 391) を使用すると、SAM Local は invoke コマンドとstart-api コマンドの両方に --env-vars 引数を渡します。この引数では、関数に定義されている環境変数の値がある JSON ファイルを使用できます。JSON ファイルの構造は次のようになります。

{ "MyFunction1": { "TABLE_NAME": "localtable", "BUCKET_NAME": "testBucket" }, "MyFunction2": { "TABLE_NAME": "localtable", "STAGE": "dev" },}

次に、以下のコマンドを使用して JSON ファイルにアクセスします。

$ sam local start-api --env-vars env.json

シェル環境の使用

シェル環境で定義された変数は、Lambda 関数の変数にマッピングされると、Docker コンテナに渡されます。シェル変数は関数からグローバルにアクセスできます。たとえば、2 つの関数として MyFunction1 および MyFunction2 があり、どちらにも TABLE_NAME という変数があるとします。この場合、シェル環境を通じて提供される TABLE_NAME の値は両方の関数で使用できます。

次のコマンドは、両方の関数で TABLE_NAME の値を myTable に設定します。

$ TABLE_NAME=mytable sam local start-api

Note

柔軟性を増すために、シェル変数と組み合わせて環境変数を保持する外部 JSON ファイルを使用できます。変数が両方の場所に定義されている場合、外部ファイルの変数によってシェルバージョンが上書きされます。以下は優先順位 (最高から最低) です。

• 環境変数ファイル• シェル環境• SAM テンプレート内のハードコードされた値

112

Page 119: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

SAM Local でのデバッグ

sam local invoke および sam local start-api は、いずれも関数のローカルデバッグをサポートします。デバッグサポートを有効にして SAM Local を実行するには、コマンドラインで --debug-portまたは -d を指定します。

# Invoke a function locally in debug mode on port 5858 $ sam local invoke -d 5858 function logical id

# Start local API Gateway in debug mode on port 5858$ sam local start-api -d 5858

Note

sam local start-api を使用する場合、ローカル API Gateway はすべての Lambda 関数を公開します。ただし、指定できるデバッグポートは 1 つのみであるため、一度に 1 つの関数のみデバッグできます。

Python で記述された関数のデバッグ

Node.js や Java とは異なり、Python では Lambda 関数コードでリモートデバッグを有効にする必要があります。Python ランタイム (2.7 または 3.6) のいずれかを使用する関数に対して (上述の --debug-port オプションまたは -d オプションを使用して) デバッグを有効にすると、SAM Local はそのポートを通じてホストマシンから Lambda コンテナへのマッピングを行います。リモートデバッグを有効にするには、remote-pdb などの Python パッケージを使用します。

Important

ホストの設定時に、デバッガーはコードでリスンするため、127.0.0.1 ではなく 0.0.0.0 を必ず使用します。

AWS Lambda コンソールエディタを使用した関数の作成AWS Lambda コンソールのコードエディタを使用すると、Lambda 関数コードを記述し、テストして、実行結果を表示できます。

コードエディタには、メニューバー、ウィンドウ、およびエディタペインがあります。

113

Page 120: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

メニューバーを使用して、一般的なコマンドを実行します。詳細については、「メニューバーの使用 (p. 133)」を参照してください。

ウィンドウを使用して、ファイル、フォルダ、その他のコマンドを処理します。詳細については、「ファイルとフォルダの操作 (p. 115)」および「コマンドの操作 (p. 135)」を参照してください。

エディタペインを使用して、コードを記述します。詳細については、「コードの操作 (p. 122)」を参照してください。

114

Page 121: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

ファイルとフォルダの操作コードエディタの [Environment] ウィンドウを使用して、関数のファイルを作成したり、開いたり、管理したりできます。

[Environment] ウィンドウを表示または非表示にするには、[Environment] ボタンを選択します。[Environment] ボタンが非表示になっている場合は、メニューバーで [Window]、[Environment] の順に選択します。

115

Page 122: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

116

Page 123: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

117

Page 124: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

1 つのファイルを開き、その内容をエディタペインに表示するには、[Environment] ウィンドウでファイルをダブルクリックします。

複数のファイルを開き、その内容をエディタペインで表示するには、[Environment] ウィンドウでそれらのファイルを選択します。選択範囲を右クリックし、[Open] を選択します。

新しいファイルを作成するには、以下のいずれかの操作を行います。

• [Environment] ウィンドウで、新しいファイルを移動する先のフォルダを右クリックし、[New File] を選択します。ファイルの名前と拡張子を入力し、Enter キーを押します。

• メニューバーで [File]、[New File] の順に選択します。ファイルを保存する準備ができたら、メニューバーで [File]、[Save] の順に選択するか、[File]、[Save As] の順に選択します。その後、[Save As] ダイアログボックスで、ファイルの名前を付け、保存場所を選択します。

• エディタペインのタブボタンバーで、[+] ボタンを選択してから、[New File] を選択します。ファイルを保存する準備ができたら、メニューバーで [File]、[Save] の順に選択するか、[File]、[Save As] の順に選択します。その後、[Save As] ダイアログボックスで、ファイルの名前を付け、保存場所を選択します。

118

Page 125: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

新しフォルダを作成するには、[Environment] ウィンドウで、新しいフォルダを移動する先のフォルダを右クリックし、[New Folder] を選択します。フォルダの名前を入力し、Enter キーを押します。

ファイルを保存するには、ファイルが開いてその内容がエディタペインに表示された状態で、メニューバーで [File]、[Save] の順に選択します。

ファイルまたはフォルダの名前を変更するには、[Environment] ウィンドウでファイルまたはフォルダを右クリックします。置換後の名前を入力し、Enter キーを押します。

119

Page 126: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

ファイルまたはフォルダを削除するには、[Environment] ウィンドウでファイルまたはフォルダを選択します。選択範囲を右クリックし、[Delete] を選択します。その後、[Yes] (単一選択の場合) または [Yes to All]を選択して、削除を確定します。

ファイルまたはフォルダを切り取り、コピー、貼り付け、または複製するには、[Environment] ウィンドウでファイルまたはフォルダを選択します。選択範囲を右クリックし、[Cut]、[Copy]、[Paste]、[Duplicate]をそれぞれ選択します。

フォルダを折りたたむには、[Environment] ウィンドウで歯車アイコンを選択してから、[Collapse AllFolders] を選択します。

120

Page 127: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

隠しファイルを表示または非表示にするには、[Environment] ウィンドウで歯車アイコンを選択してから、[Show Hidden Files] を選択します。

[Commands] ウィンドウを使用しても、ファイルを作成したり、開いたり、管理したりできます。詳細については、「コマンドの操作 (p. 135)」を参照してください。

121

Page 128: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

コードの操作コードエディタのエディタペインを使用して、コードを表示したり記述したりします。

タブボタンの操作

タブボタンバーを使用して、ファイルを選択、表示、作成します。

122

Page 129: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

開いているファイルの内容を表示するには、以下のいずれかの操作を行います。

• ファイルのタブを選択します。• タブボタンバーでドロップダウンメニューボタンを選択してから、ファイルの名前を選択します。

123

Page 130: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

124

Page 131: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

開いているファイルを閉じるには、以下のいずれかの操作を行います。

• ファイルのタブで [X] アイコンを選択します。• ファイルのタブを選択します。その後、タブボタンバーでドロップダウンメニューボタンを選択してか

ら、[Close Pane] を選択します。

複数の開いているファイルを閉じるには、タブボタンのバーでドロップダウンメニューを選択し、必要に応じて [Close All Tabs in All Panes] または [Close All But Current Tab] を選択します。

新しいファイルを作成するには、タブボタンバーで [+] ボタンを選択してから、[New File] を選択します。ファイルを保存する準備ができたら、メニューバーで [File]、[Save] の順に選択するか、[File]、[Save As]の順に選択します。その後、[Save As] ダイアログボックスで、ファイルの名前を付け、保存場所を選択します。

ステータスバーの操作

ステータスバーを使用して、アクティブなファイルの行にすばやく移動し、コードの表示方法を変更します。

125

Page 132: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

126

Page 133: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

アクティブなファイルの行にすばやく移動するには、行セレクターを選択し、移動する先の行の番号を入力して、Enter キーを押します。

アクティブなファイルのコードカラースキームを変更するには、コードカラースキームセレクターを選択してから、新しいコードカラースキームを選択します。

127

Page 134: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

128

Page 135: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

アクティブなファイルで、ソフトタブを使用するかスペースを使用するかを変更したり、タブサイズを変更したり、スペースに変換するかタブに変換するかを変更したりするには、スペースおよびタブセレクターを選択してから、新しい設定を選択します。

129

Page 136: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

130

Page 137: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

すべてのファイルで、編集上の文字や余白の表示/非表示、かっこや引用符の自動補完、行の折り返し、フォントサイズの変更を行うには、歯車アイコンを選択してから、新しい設定を選択します。

131

Page 138: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

132

Page 139: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

メニューバーの使用メニューバーを使用して、一般的なコマンドを実行できます。

メニューバーを非表示にするには、メニューバーで上矢印を選択します。

非表示になっているメニューバーを表示するには、メニューバーで下矢印を選択します。

133

Page 140: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

コマンドのリストについては、『AWS Cloud9 ユーザーガイド』の「メニューコマンドリファレンス」を参照してください。そのリファレンスに示しているコマンドの一部はコードエディタで使用できません。

[Commands] ウィンドウを使用しても、コマンドを実行できます。詳細については、「コマンドの操作 (p. 135)」を参照してください。

全画面表示モードでの作業コードエディタを全画面表示にして、コードで作業するための領域を広げることができます。

コードエディタをウェブブラウザウィンドウの端まで広げるには、メニューバーの [Toggle fullscreen] ボタンを選択します。

コードエディタを元のサイズに戻すには、もう一度 [Toggle fullscreen] ボタンを選択します。

134

Page 141: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

全画面表示モードでは、メニューバーに [Save] と [Test] という追加のメニューが表示されます。[Save] を選択すると、関数コードが保存されます。[Test] または [Configure Events] を選択すると、関数のテストイベントを作成または編集できます。

設定の操作表示されるコーディングのヒントや警告、コードの折りたたみ動作、コードの自動補完動作など、コードエディタのさまざまな設定を変更できます。

コードエディタの設定を変更するには、メニューバーで [Preferences] 歯車アイコンを選択します。

設定のリストについては、『AWS Cloud9 ユーザーガイド』の以下のリファレンスを参照してください。

• 変更可能なプロジェクト設定• 使用可能なユーザー設定

それらのリファレンスで示している設定の一部はコードエディタで使用できません。

コマンドの操作[Commands] ウィンドウを使用して、メニューバーにあるようなさまざまなコマンドを [Environment]ウィンドウのエディタペインで実行できます。

[Commands] ウィンドウを表示または非表示にするには、[Commands] ボタンを選択します。[Commands]ボタンが非表示になっている場合は、メニューバーで [Window]、[Commands] の順に選択します。

135

Page 142: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

136

Page 143: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

コマンドを実行するには、[Commands] ウィンドウでそのコマンドを選択します。

コマンドを検索するには、検索ボックスにコマンドの名前の一部またはすべてを入力します。

137

Page 144: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda コンソールエディタを使用した関数の作成

138

Page 145: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数の設定

コマンドのリストについては、『AWS Cloud9 ユーザーガイド』の「コマンドリファレンス」を参照してください。そのリファレンスに示しているコマンドの一部はコードエディタで使用できません。

そのほか、このセクションで以下のトピックも参照してください。

• Lambda 関数の設定 (p. 139)• Lambda 関数からのリソースへのアクセス (p. 140)• AWS Lambda 実行モデル (p. 152)

Lambda 関数の設定Lambda 関数は、コードと関連する依存関係で構成されます。さらに、Lambda 関数に関連付けられた設定情報があります。Lambda 関数を作成する際は、まず、設定情報を指定します。Lambda では、設定データの一部を更新するための API が用意されています。Lambda 関数の設定情報には、次のようなキー要素が含まれています。

• 必要なコンピューティングリソース – Lambda 関数に割り当てるメモリ容量のみを指定します。AWSLambda は M3 タイプなど、汎用 Amazon EC2 インスタンスタイプと同じ割合を使用して、メモリに比例した CPU 能力を割り当てます。たとえば、256 MB メモリを Lambda 関数に割り当てる場合、128MB のみを割り当てた場合よりも 2 倍の CPU 共有が割り当てられます。

設定を更新して、128 MB から 3008 MB まで 64 MB 単位の増設メモリをリクエストできます。関連する制限の詳細については、「AWS Lambda の制限 (p. 407)」を参照してください。

Lambda 関数に必要なメモリ容量を変更するには、以下を実行します。1. AWS マネジメントコンソールにサインインし、AWS Lambda コンソールに移動します。2. メモリサイズを変更する関数を選択します。3. [Configuration] タブをクリックして [Advanced settings] を展開します。4. [Memory (MB)] リストで、必要な容量を選択します。

 

オプションで、次の AWS CLI コマンドを使用して関数のメモリ容量を更新できます (有効な 64 MB の倍数を使用)。

$ aws lambda update-function-configuration \ --function-name your function name \ --region region where your function resides \ --memory-size memory amount \ --profile adminuser

AWS CLI のセットアップと使用の詳細については、「AWS Command Line Interface のセットアップ(AWS CLI) (p. 6)」を参照してください。

 • 最大実行時間 (タイムアウト) – 料金は Lambda 関数の実行に使用された AWS リソースに対して課金さ

れます。Lambda 関数が無制限に実行されないように、タイムアウトを設定します。指定されたタイムアウトに達すると、AWS Lambda は Lambda 関数の実行を終了します。この値を予想される実行時間に基づいて設定することをお勧めします。デフォルト値は 3 秒です。

Note

Invoke オペレーションを呼び出すことで、または任意のランタイムで AWS SDK を使用することで、Lambda 関数を同期的に呼び出すことができます。Lambda 関数が長期間実行されることが予想される場合は、関数の実行が完了する前にクライアントがタイムアウトになること

139

Page 146: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのリソースへのアクセス

があります。これを回避するには、クライアントのタイムアウトまたは SDK の設定を更新します。詳細については、「Invoke (p. 463)」を参照してください。

 • IAM ロール (実行ロール) – これは、AWS Lambda ユーザーに代わってが Lambda 関数を実行する際に

引き受けるロールです。詳細については、「AWS Lambda アクセス権限モデル (p. 374)」を参照してください。

 • ハンドラ名 - ハンドラメソッドは Lambda 関数のコードおよび Lambda 関数の一部として含まれる任意

のイベントソースの依存関係を実行するエントリポイントです。

Lambda 関数からのリソースへのアクセスLambda では、お客様の関数ロジックにいずれの制限も適用されません。関数ロジックのコードを記述できれば、そのコードを Lambda 関数内で実行できます。関数の一部として、他の API を呼び出したり、データベースなどの他の AWS サービスにアクセスしたりすることが必要になる場合があります。

AWS サービスへのアクセスその他の AWS サービスにアクセスするには、AWS SDK (Node.js、Java、Python、C#) あるいは Go を使用できます。また、AWS Lambda は、関数に関連付けられる IAM ロールに対して SDK が必要とする証明書を自動的に設定するため、追加の手順を実行する必要はありません。たとえば、以下に示しているのは、Python SDK を使用して S3 オブジェクトにアクセスするサンプルコードです。

import boto3import botocore

BUCKET_NAME = 'my-bucket' # replace with your bucket nameKEY = 'my_image_in_s3.jpg' # replace with your object key

s3 = boto3.resource('s3')

try: s3.Bucket(BUCKET_NAME).download_file(KEY, 'my_local_image.jpg')except botocore.exceptions.ClientError as e: if e.response['Error']['Code'] == "404": print("The object does not exist.") else: raise

Note

便利なように、AWS Lambda には実行環境の一部としての AWS SDK のバージョンが含まれているため、自分で含める必要はありません。含まれている SDK のバージョンについては、「Lambda 実行環境と利用できるライブラリ (p. 404)」を参照してください。本番稼働用のアプリケーションに使用する AWS SDK の独自のコピーを含めて、依存関係を制御できるようにすることをお勧めします。

AWS 以外のサービスへのアクセスLambda 関数の一部として、任意のサービスにアクセスするための SDK を含めることができます。たとえば、Twilio アカウントの情報にアクセスするための SDK for Twilio を含めることができます。認証情報を暗号化した後、Environment Variables (p. 391) を使用して SDK の認証情報を保存できます。

140

Page 147: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドプライベートサービスまたはリソースへのアクセス

プライベートサービスまたはリソースへのアクセスデフォルトでは、お客様のサービスや API に AWS Lambda がパブリックインターネット経由でアクセスできます。ただし、API やサービスがこのように公開されていない場合があります。通常、これらのリソースは、パブリックインターネット経由でアクセスできないように、Amazon Virtual Private Cloud(Amazon VPC) 内に作成します。これらのリソースは、Amazon Redshift データウェアハウス、AmazonElastiCache クラスター、Amazon RDS インスタンスなどの AWS サービスリソースです。独自の EC2インスタンスで実行する独自のサービスを作成することもできます。デフォルトでは、Lambda 関数からVPC 内のリソースにアクセスすることはできません。

AWS Lambda はデフォルトでは VPC 内で安全に関数コードを実行します。ただし、Lambda 関数からプライベート VPC 内のリソースにアクセスできるようにするには、VPC サブネット ID やセキュリティグループ ID など、追加の VPC 固有設定情報を指定する必要があります。AWS Lambda はこの情報を、関数がプライベート VPC 内の他のリソースに安全に接続できる Elastic Network Interface (ENI) のセットアップに使用します。

Important

AWS Lambda は専有テナント VPC 内のリソースへの接続はサポートしていません。詳細については、専用 VPCを参照してください

VPC 内のリソースにアクセスできるように Lambda 関数を設定する方法については、「Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する (p. 141)」を参照してください。

Amazon VPC 内のリソースにアクセスできるようにLambda 関数を構成する通常、パブリックインターネットを通じてアクセスできないように、リソースは Amazon Virtual PrivateCloud (Amazon VPC) 内に作成します。作成できるリソースには、Amazon Redshift データウェアハウス、Amazon ElastiCache クラスター、Amazon RDS インスタンスなどの AWS サービスリソースがあります。独自の EC2 インスタンスで実行する独自のサービスを作成することもできます。デフォルトでは、Lambda 関数から VPC 内のリソースにアクセスすることができません。

AWS Lambda はデフォルトでは VPC 内で安全に関数コードを実行します。ただし、Lambda 関数からプライベート VPC 内のリソースにアクセスできるようにするには、VPC サブネット ID やセキュリティグループ ID など、追加の VPC 固有設定情報を指定する必要があります。AWS Lambda はこの情報を、関数がプライベート VPC 内の他のリソースに安全に接続できる Elastic Network Interface (ENI) のセットアップに使用します。

Important

AWS Lambda は専有テナント VPC 内のリソースへの接続はサポートしていません。詳細については、専用 VPCを参照してください

Amazon VPC へのアクセス用に Lambda 関数を設定するVPC 情報は、VpcConfig パラメータを使用して Lambda 関数設定に追加します。Lambda 関数の作成時に追加することも (「CreateFunction (p. 425)」を参照してください)、既存の Lambda 関数設定に追加することもできます (「UpdateFunctionConfiguration (p. 515)」を参照してください)。AWS CLI の例を次に示します。

• Lambda 関数の作成時に VPC 情報を指定できるよう、CLI コマンド create-function では --vpc-config パラメータを指定します。--runtime パラメータは python3.6 を指定することに注意してください。python2.7 を使用することもできます。

$ aws lambda create-function \

141

Page 148: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

--function-name ExampleFunction \--runtime python3.6 \--role execution-role-arn \--zip-file fileb://path/app.zip \--handler app.handler \--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=comma-separated-security-group-ids \--memory-size 1024

Note

Lambda 関数の実行ロールには、ENI を作成、記述、削除するためのアクセス許可が必要です。AWS Lambda では、アクセス権限ポリシーAWSLambdaVPCAccessExecutionRole が提供されています。このポリシーでは、ロールの作成時に使用できる、必要な EC2 アクション (ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface) 用のアクセス許可が定義されます。ポリシーは IAM コンソールで確認できます。Lambda 関数の実行直後に、このロールを削除しないでください。Lambda 関数の実行と ENI の削除の間には遅延時間があります。関数の実行直後にロールを削除した場合、ENI の削除はお客様の責任になります。

• CLI コマンド update-function-configuration では、既存の Lambda 関数設定に VPC 情報を追加するための --vpc-config パラメータを指定します。

$ aws lambda update-function-configuration \--function-name ExampleFunction \--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=security-group-ids

Lambda 関数設定から VPC 関連情報を削除するには、UpdateFunctionConfiguration API を使用して、次の CLI コマンド例のように、サブネット ID とセキュリティグループ ID の空のリストを指定します。

$ aws lambda update-function-configuration \--function-name ExampleFunction \--vpc-config SubnetIds=[],SecurityGroupIds=[]

次に示す追加の考慮事項に注意してください。

• Lambda 関数に VPC 設定を追加した場合、関数でアクセスできるのは、その VPC 内のリソースのみになります。Lambda 関数から VPC リソースとパブリックインターネットの両方にアクセスする必要がある場合は、VPC 内に NAT (Network Address Translation) インスタンスが必要になります。

 • Lambda 関数が VPC 内で動作するように構成されている場合、追加の ENI の使用を開始するペナル

ティが発生します。これは、ネットワークリソースに接続する際にアドレス解決が遅延する場合があることを意味します。

Lambda 関数でのインターネットアクセスAWS Lambda は、指定された VPC 情報を使用して、Lambda 関数から VPC リソースにアクセスするための ENI をセットアップします。各 ENI には、指定されたサブネットの IP アドレス範囲からプライベートIP アドレスが割り当てられますが、パブリック IP アドレスは割り当てられません。そのため、Lambda 関数でインターネットアクセスが必要である場合 (VPC エンドポイントのない AWS サービスにアクセスする場合など) は、VPC 内で NAT インスタンスを設定することも、Amazon VPC NAT ゲートウェイを使用することもできます。詳細については、Amazon VPC ユーザーガイドの「NAT ゲートウェイ」を参照してください。VPC に添付されたインターネットゲートウェイを使用することはできません。これには ENI にパブリック IP アドレスがある必要があります。

142

Page 149: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

Important

Lambda 関数でインターネットアクセスが必要な場合は、パブリックサブネットまたはインターネットに接続していないプライベートサブネットに添付しないでください。代わりに、NAT インスタンスまたは Amazon VPC NAT ゲートウェイを介して、インターネットにアクセスしているプライベートサブネットにのみ添付してください。

VPC 対応の Lambda 関数をセットアップするためのガイドラインLambda 関数は、処理するイベント数に基づいて自動的にスケーリングされます。このスケーリング動作をサポートする VPC 対応の Lambda 関数をセットアップするための一般的なガイドラインを次に示します。

• Lambda 関数で VPC にアクセスする場合は、Lambda 関数でのスケーリング要件をサポートできる充分な ENI キャパシティーが VPC にあることを確認します。次の式を使用すると、ENI キャパシティーを概算できます。

Projected peak concurrent executions * (Memory in GB / 3GB)

各パラメーターの意味は次のとおりです。• Projected peak concurrent execution – この値を決定するには、 同時実行数の管理 (p. 387) の情報を

使用します。• Memory – Lambda 関数用に設定したメモリの容量。

 • 指定するサブネットには、ENI の数に見合う数の使用可能な IP アドレスがある必要があります。

 

また、Lambda 関数設定内のアベイラビリティーゾーンごとに 1 つ以上のサブネットを指定することをお勧めします。アベイラビリティーゾーンごとにサブネットを指定しておくと、1 つのアベイラビリティゾーンで障害が発生した場合や IP アドレスが枯渇した場合も、別のアベイラビリティゾーンでLambda 関数を実行できます。

Note

VPC に充分な数の ENI またはサブネット IP がない場合は、リクエスト数が増えても Lambda 関数を拡張できず、関数の失敗数が増えます。現在 AWS Lambda では、ENI または IP アドレスの不足によって発生したエラーは CloudWatch Logs に記録されません。対応する CloudWatch Logsのないエラーが増えている場合は、Lambda 関数を同期的に実行してエラー応答を取得します (たとえば、AWS Lambda コンソールで Lambda 関数をテストすると、コンソールで Lambda 関数が同期的に呼び出され、エラーが表示されます)。

チュートリアル: Amazon VPC 内のリソースにアクセスできるように Lambda 関数を設定するこのセクションでは、詳細なチュートリアルで、Lambda 関数を作成し、Amazon VPC 内のリソース(Amazon ElastiCache クラスターや Amazon RDS データベースインスタンスなど) にアクセスできるように設定します。

トピック• チュートリアル: Amazon VPC で Amazon ElastiCache にアクセスできるように Lambda 関数を設定す

る (p. 144)

143

Page 150: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

• チュートリアル: Amazon VPC の Amazon RDS にアクセスできるように Lambda 関数を設定する (p. 148)

チュートリアル: Amazon VPC で Amazon ElastiCache にアクセスできるようにLambda 関数を設定する

このチュートリアルでは、以下の作業を行います。

• us-east-1 リージョンのデフォルト Amazon Virtual Private Cloud (Amazon VPC) に Amazon ElastiCacheクラスターを作成します。Amazon ElastiCache の詳細については、「Amazon ElastiCache」を参照してください。

• ElastiCache クラスターにアクセスするための Lambda 関数を作成します。Lambda 関数を作成する際には、Lambda 関数で VPC 内のリソースにアクセスできるように、Amazon VPC 内のサブネット ID とVPC セキュリティグループを指定します。このチュートリアルでは、説明のために、この Lambda 関数で UUID の生成、キャッシュへの書き込み、キャッシュからの取得を行います。

• Lambda 関数を手動で呼び出し、この関数が VPC 内の ElastiCache クラスターにアクセスしたことを確認します。

Important

このチュートリアルでは、アカウント内で us-east-1 リージョンのデフォルト Amazon VPC を使用します。Amazon VPC の詳細については、Amazon VPC ユーザーガイドの「Amazon VPC の使用を開始する方法」を参照してください。

次のステップ

ステップ 1: ElastiCache クラスターを作成する (p. 144)

ステップ 1: ElastiCache クラスターを作成する

このステップでは、アカウント内で us-east-1 リージョンのデフォルト Amazon VPC に ElastiCache クラスターを作成します。

1. 次の AWS CLI コマンドを実行して、アカウント内で us-east-1 リージョンのデフォルト VPC にMemcached クラスターを作成します。

aws elasticache create-cache-cluster \ --cache-cluster-id ClusterForLambdaTest \ --cache-node-type cache.m3.medium \ --engine memcached \ --security-group-ids your-default-vpc-security-group \ --num-cache-nodes 1

デフォルトの VPC セキュリティグループは、VPC コンソールで [Security Groups] から参照できます。チュートリアルの Lambda 関数ではこのクラスターに対して項目の追加や取得を行います。

Amazon ElastiCache コンソールを使用してキャッシュクラスターを起動することもできます。手順については、Amazon ElastiCache ユーザーガイドの「Amazon ElastiCache の使用開始」を参照してください。

2. 起動したキャッシュクラスターの設定エンドポイントをメモします。この情報は Amazon ElastiCacheコンソールから取得できます。次のセクションでは、Lambda 関数コードでこの値を指定します。

次のステップ

ステップ 2: Lambda 関数を作成する (p. 145)

144

Page 151: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

ステップ 2: Lambda 関数を作成する

このステップでは、次の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、このロールを指定

する必要があります。これにより、Lambda がロールを引き受け、ユーザーに代わって関数を実行することができます。

このロールのアクセス権限ポリシーは、Elastic Network Interface (ENI) をセットアップする権限を AWSLambda に許可します。これにより Lambda 関数は VPC 内のリソースにアクセスできるようになります。この例では、Lambda 関数は VPC 内の ElastiCache クラスターにアクセスします。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 145)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 146)• ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする) (p. 147)

ステップ 2.1: デプロイパッケージを作成するNote

現時点では、Lambda 関数のコード例は Python のみで示されています。

Python

次の例の Python コードでは、ElastiCache クラスターに対して項目の読み取り/書き込みを行います。

1. テキストエディターを開き、次のコードをコピーします。

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_functionimport timeimport uuidimport sysimport socketimport elasticache_auto_discoveryfrom pymemcache.client.hash import HashClient

#elasticache settingselasticache_config_endpoint = "your-elasticache-cluster-endpoint:port"nodes = elasticache_auto_discovery.discover(elasticache_config_endpoint)nodes = map(lambda x: (x[1], int(x[2])), nodes)memcache_client = HashClient(nodes)

def handler(event, context): """ This function puts into memcache and get from it. Memcache is hosted using elasticache """

#Create a random UUID... this will the sample element we add to the cache. uuid_inserted = uuid.uuid4().hex

145

Page 152: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

#Put the UUID to the cache. memcache_client.set('uuid', uuid_inserted) #Get item (UUID) from the cache. uuid_obtained = memcache_client.get('uuid') if uuid_obtained.decode("utf-8") == uuid_inserted: # this print should go to the CloudWatch Logs and Lambda console. print ("Success: Fetched value %s from memcache" %(uuid_inserted)) else: raise Exception("Value is not the same as we put :(. Expected %s got %s" %(uuid_inserted, uuid_obtained))

return "Fetched value from memcache: " + uuid_obtained("utf-8"

2. app.py という名前でファイルを保存します。3. pip を使用して、次に示すライブラリ依存関係をインストールします。

• pymemcache – Lambda 関数コードはこのライブラリを使用して HashClient オブジェクトを作成し、memcache に対して項目の設定および取得を行います (「pymemcache」を参照してください)。

• elasticache-auto-discovery – Lambda 関数はこのライブラリを使用して、AmazonElastiCache クラスター内のノードを取得します (「elasticache-auto-discovery」を参照してください)。

4. これらのファイルをすべて app.zip という名前のファイルに ZIP 圧縮し、デプロイパッケージを作成します。手順については、「デプロイパッケージの作成 (Python) (p. 104)」を参照してください。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 146)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このステップでは、次に示す定義済みのロールタイプとアクセス権限ポリシーを使用して AWS Identityand Access Management (IAM) ロールを作成します。

• AWS Lambda (AWS サービスロール) – このロールでは、ロールを引き受けるアクセス許可が AWSLambda に付与されます。

• AWSLambdaVPCAccessExecutionRole (アクセス権限ポリシー) – ロールにアタッチするアクセス権限ポリシーです。このポリシーでは、AWS Lambda が ENI を管理するために必要とする、EC2 アクション用のアクセス許可が付与されます。この AWS 管理ポリシーは、IAM コンソールで確認できます。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (lambda-vpc-execution-role など) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で [AWSLambdaVPCAccessExecutionRole] を選択します。このチュートリアルのLambda 関数では、このポリシーでのアクセス権限で十分です。

146

Page 153: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になります。

次のステップ

ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする) (p. 147)

ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI コマンド create-function を使用して Lambda 関数 (AccessMemCache)を作成します。

コマンドプロンプトで、adminuser プロファイルを使用して、次の Lambda CLI コマンド create-function を実行します。

次の create-function コマンドは、.zip ファイルのパスと実行ロールの ARN について実際の値を指定して更新する必要があります。--runtime のパラメータ値には、コードの記述に使用した言語に応じて、python3.6、python2.7、nodejs、java8 のいずれかを指定します。

Note

現時点では、Lambda 関数のコード例は Python のみで示されています。

$ aws lambda create-function \--function-name AccessMemCache \--region us-east-1 \--zip-file fileb://path-to/app.zip \--role execution-role-arn \--handler app.handler \--runtime python3.6 \--timeout 30 \--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=default-security-group-id \--memory-size 1024

VPC のサブネット ID およびデフォルトのセキュリティグループ ID は、VPC コンソールで確認できます。

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

また、AWS Lambda コンソールを使用して Lambda 関数を作成することもできます。関数を作成する際には、Lambda 用の VPC を選択し、表示されたフィールドでサブネットとセキュリティグループを選択します。

次のステップ

ステップ 3: Lambda 関数をテストする (手動で呼び出す) (p. 147)

ステップ 3: Lambda 関数をテストする (手動で呼び出す)

このステップでは、invoke コマンドを使用して Lambda 関数を手動で呼び出します。実行されたLambda 関数は UUID を生成し、Lambda コードで指定された ElastiCache クラスターに、その UUID を書き込みます。次に、Lambda 関数はキャッシュから項目を取得します。

147

Page 154: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

1. AWS Lambda の invoke コマンドを使用して Lambda 関数 (AccessMemCache) を呼び出します。

$ aws lambda invoke \--function-name AccessMemCache  \--region us-east-1 \--profile adminuser \output.txt

2. Lambda 関数が正常に実行されたことを次のように確認します。

• output.txt ファイルを確認します。• AWS Lambda コンソールで結果を確認します。• CloudWatch Logs で結果を確認します。

次のステップ

VPC 内の ElastiCache クラスターにアクセスする Lambda 関数を作成したので、イベントへの応答としてこの関数を呼び出すことができます。イベントソースの設定と例については、「ユースケース (p. 182)」を参照してください。

チュートリアル: Amazon VPC の Amazon RDS にアクセスできるように Lambda関数を設定する

このチュートリアルでは、以下の作業を行います。

• デフォルトの Amazon VPC で、Amazon RDS MySQL データベースエンジンのインスタンスを起動します。この MySQL インスタンスで、サンプルテーブル (Employee) を含むデータベース (ExampleDB) を作成します。Amazon RDS の詳細については、「Amazon RDS」を参照してください。

• ExampleDB データベースにアクセスし、テーブル (Employee) を作成して、少数のレコードを追加し、テーブルからレコードを取得する Lambda 関数を作成します。

• Lambda 関数を手動で呼び出し、クエリの結果を確認します。これは、VPC の RDS MySQL インスタンスに Lambda 関数がアクセスできたことを確認する方法です。

Important

このチュートリアルでは、アカウント内で us-east-1 リージョンのデフォルト Amazon VPC を使用します。Amazon VPC の詳細については、Amazon VPC ユーザーガイドの「Amazon VPC の使用を開始する方法」を参照してください。

次のステップ

ステップ 1: Amazon RDS MySQL インスタンスと ExampleDB データベースを作成する (p. 148)

ステップ 1: Amazon RDS MySQL インスタンスと ExampleDB データベースを作成する

このチュートリアルでは、サンプルの Lambda 関数でテーブル (Employee) を作成し、少数のレコードを作成して、そのレコードを取得します。Lambda 関数で作成されるテーブルのスキーマは次のとおりです。

Employee(EmpID, Name)

EmpID はプライマリキーです。ここで、このテーブルに少数のレコードを追加する必要があります。

まず、デフォルトの VPC で ExampleDB データベースを指定して RDS MySQL インスタンスを起動します。デフォルトの VPC で既に RDS MySQL インスタンスが実行中であれば、この手順をスキップしてください。

148

Page 155: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

Important

このチュートリアルでは、us-east-1 リージョンのデフォルト VPC 内で起動された RDS MySQLDB エンジンを使用します。

RDS MySQL インスタンスは、次のいずれかの方法を使用して起動できます。

• Amazon Relational Database Service ユーザーガイドの「MySQL DB インスタンスを作成して MySQLDB インスタンス上のデータベースに接続する」に記載されている説明に従います。

• 次の AWS CLI コマンドを使用します。

$ aws rds create-db-instance \ --db-instance-identifier MySQLForLambdaTest \ --db-instance-class db.t2.micro \ --engine MySQL \ --allocated-storage 5 \ --no-publicly-accessible \ --db-name ExampleDB \ --master-username username \ --master-user-password password \ --backup-retention-period 3

データベース名、ユーザー名、およびパスワードをメモします。DB インスタンスのホストアドレス (エンドポイント) も必要です。この情報は、RDS コンソールから取得できます (場合によっては、インスタンスのステータスが使用可能になるか Endpoint 値がコンソールに表示されるまで、待つ必要があります)。

次のステップ

ステップ 2: Lambda 関数を作成する (p. 149)

ステップ 2: Lambda 関数を作成する

このステップでは、次の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。• Lambda 関数の作成時に指定する IAM ロール (実行ロール) を作成します。これは、Lambda 関数の実行

時に AWS Lambda が引き受けるロールです。

このロールに関連付けられているアクセス権限ポリシーは、Elastic Network Interface (ENI) をセットアップする権限を AWS Lambda に許可します。これにより Lambda 関数は VPC 内のリソースにアクセスできるようになります。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 149)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 151)• ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする) (p. 151)

ステップ 2.1: デプロイパッケージを作成する

Note

現時点では、Lambda 関数のコード例は Python のみで示されています。

149

Page 156: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

Python

次の例の Python コードでは、VPC に作成した MySQL RDSインスタンスの Employee テーブルに対してSELECT クエリを実行します。コードでは ExampleDB データベースにテーブルを作成し、サンプルレコードを追加して、これらのレコードを取得します。

1. テキストエディターを開き、次のコードをコピーします。

import sysimport loggingimport rds_configimport pymysql#rds settingsrds_host = "rds-instance-endpoint"name = rds_config.db_usernamepassword = rds_config.db_passworddb_name = rds_config.db_name

logger = logging.getLogger()logger.setLevel(logging.INFO)

try: conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)except: logger.error("ERROR: Unexpected error: Could not connect to MySql instance.") sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")def handler(event, context): """ This function fetches content from mysql RDS instance """

item_count = 0

with conn.cursor() as cur: cur.execute("create table Employee3 ( EmpID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))") cur.execute('insert into Employee3 (EmpID, Name) values(1, "Joe")') cur.execute('insert into Employee3 (EmpID, Name) values(2, "Bob")') cur.execute('insert into Employee3 (EmpID, Name) values(3, "Mary")') conn.commit() cur.execute("select * from Employee3") for row in cur: item_count += 1 logger.info(row) #print(row)

return "Added %d items from RDS MySQL table" %(item_count)

Note

パフォーマンス向上のために、ここに示されているように pymysql.connect() はハンドラー外で実行することをお勧めします。

2. app.py という名前でファイルを保存します。3. pip を使用して、次に示すライブラリ依存関係をインストールします。

• pymysql – Lambda 関数のコードでは、MySQL インスタンスにアクセスするためにこのライブラリが使用されます (「PyMySQL」を参照してください)。

150

Page 157: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVPC サポート

4. 次の情報が含まれる設定ファイルを作成し、rds_config.py という名前で保存します。

#config file containing credentials for rds mysql instancedb_username = "username"db_password = "password"db_name = "databasename"

5. これらのファイルをすべて app.zip という名前のファイルに ZIP 圧縮し、デプロイパッケージを作成します。手順については、「デプロイパッケージの作成 (Python) (p. 104)」を参照してください。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 151)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このステップでは、以下に示す定義済みのロールタイプとアクセス権限ポリシーを使用して、Lambda 関数用の実行ロール (IAM ロール) を作成します。

• AWS Lambda (AWS サービスロール) – このロールでは、ロールを引き受けるアクセス許可が AWSLambda に付与されます。

• AWSLambdaVPCAccessExecutionRole (アクセス権限ポリシー) – このロールでは、EC2 アクションでENI を作成するためのアクセス許可が AWS Lambda に付与されます。また、Lambda 関数は VPC リソースと CloudWatch Logs アクションにアクセスしてログを書き込むことができます。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (lambda-vpc-execution-role など) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で [AWSLambdaVPCAccessExecutionRole] を選択します。このチュートリアルのLambda 関数では、このポリシーでのアクセス権限で十分です。

3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になります。

次のステップ

ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする) (p. 151)

ステップ 2.3: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI コマンド create-function を使用して Lambda 関数 (ReadMySqlTable)を作成します。

コマンドプロンプトで、adminuser プロファイルを使用して、次の Lambda CLI コマンド create-function を実行します。

151

Page 158: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda 実行モデル

次の create-function コマンドは、.zip ファイルのパスと実行ロールの ARN について実際の値を指定して更新する必要があります。--runtime のパラメーター値には、コードの記述に使用した言語に応じて、python2.7、nodejs、java8 のいずれかを指定します。

Note

現時点では、Lambda 関数のコード例は Python のみで示されています。--runtime パラメータには、python3.6 または python2.7 のいずれかを指定できます。

$ aws lambda create-function \--region us-east-1 \--function-name CreateTableAddRecordsAndRead \--zip-file fileb://file-path/app.zip \--role execution-role-arn \--handler app.handler \--runtime python3.6 \--vpc-config SubnetIds=comma-separated-subnet-ids,SecurityGroupIds=default-vpc-security-group-id \--profile adminuser

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

Lambda 関数は、AWS Lambda コンソールを使用して作成することもできます (前述の CLI コマンドで示したパラメータ値を使用します)。

次のステップ

ステップ 3: Lambda 関数をテストする (手動で呼び出す) (p. 152)

ステップ 3: Lambda 関数をテストする (手動で呼び出す)

このステップでは、invoke コマンドを使用して Lambda 関数を手動で呼び出します。Lambda 関数が実行されると、RDS MySQL インスタンスの Employee テーブルに対して SELECT クエリが実行され、結果が出力されます (結果は CloudWatch Logs に送られます)。

1. AWS Lambda の invoke コマンドを使用して Lambda 関数 (ReadMySqlTable) を呼び出します。

$ aws lambda invoke \--function-name CreateTableAddRecordsAndRead \--region us-east-1 \--profile adminuser \output.txt

2. Lambda 関数が正常に実行されたことを次のように確認します。

• output.txt ファイルを確認します。• AWS Lambda コンソールで結果を確認します。• CloudWatch Logs で結果を確認します。

AWS Lambda 実行モデルAWS Lambda がユーザーに代わって Lambda 関数を実行する場合、Lambda 関数の実行に必要なリソースのプロビジョニングと管理を処理します。Lambda 関数を作成する際に、Lambda 関数に許可するメモリ

152

Page 159: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda 実行モデル

容量や最大実行時間などの設定情報を指定します。Lambda 関数が呼び出されると、AWS Lambda は指定する構成設定に基づいて実行コンテキストを起動します。実行コンテキストとは、データベース接続あるいは HTTP エンドポイントなど、Lambda 関数コードのすべての外部依存関係を初期化する一時的なランタイム環境です。これにより、次に説明するように、「コールドスタート」やこれらの外部依存関係を初期化する必要がなくなるため、後続の呼び出しパフォーマンスが向上します。

Note

このセクションの内容は情報のみです。AWS Lambda は実行コンテキストの作成と削除を管理するため、実行コンテキストを管理するための AWS Lambda API はありません。

実行コンテキストの設定には時間がかかります。また、「ブートストラップ」が必要なため、Lambda 関数を呼び出すたびに若干のレイテンシーが発生します。通常、この遅延は Lambda 関数を初めて呼び出したとき、または更新されたときに発生します。Lambda 関数を連続して呼び出す場合、AWS Lambda はできる限り実行コンテキストを再利用します。

Lambda 関数が実行されると、AWS Lambda は別の Lambda 関数呼び出しに備えて、実行コンテキストを一定期間維持します。実際には、サービスは Lambda 関数の完了後実行コンテキストをフリーズさせ、再び Lambda 関数が呼び出された際に AWS Lambda がコンテキストを再利用する場合は、コンテキストを解凍して再利用します。実行コンテキストを再利用するこのアプローチには、次のような影響があります。

• Lambda 関数内の宣言 (handler コード以外、「プログラミングモデル (p. 19)」を参照) は、関数が再度呼び出された際に追加で最適化されない限り、初期化状態を維持します。たとえば、Lambda 関数がデータベース接続を確立する場合、連続した呼び出しでは接続を再確立する代わりに元の接続が使用されます。接続を作成する前に接続が存在するかどうかを確認するロジックをコードに追加することをお勧めします。

 • 各実行コンテキストには、/tmp ディレクトリに 500 MB の追加ディスク領域があります。ディレクト

リのコンテンツは、実行コンテキストが停止された際に維持され、複数の呼び出しに使用できる一時的なキャッシュを提供します。キャッシュに保存したデータが存在するかどうかを確認するための追加コードを追加できます。デプロイ制限の詳細については、「AWS Lambda の制限 (p. 407)」を参照してください。

 • Lambda 関数で開始され、関数の終了時に完了しなかったバックグラウンド処理やコールバック

は、AWS Lambda が実行コンテキストを再利用する場合に再開されます。コードのバックグラウンド処理またはコールバック (Node.js の場合) はコード終了までに完了させてください。

Note

Lambda 関数コードを記述するときは、AWS Lambda によって後続の関数の呼び出しに実行コンテキストが自動的に再利用されると想定しないでください。他の要因で AWS Lambda によって新しい実行コンテキストが作成される場合があるため、データベース接続の失敗など予期しない結果になることがあります。前に説明したように、Lambda 関数コードに実行コンテキストの有無を確認するロジックを追加します。

153

Page 160: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

Lambda 関数の呼び出しAWS Lambda でアプリケーション (サーバーレスアプリケーションを含む) を構築する場合のコアコンポーネントは、Lambda 関数とイベントソースです。イベントソースは AWS サービスまたはイベントを発行するカスタムアプリケーションであり、Lambda 関数はイベントを処理するカスタムコードです。説明のため、以下のシナリオを想定してください。

• ファイル処理 – 写真共有アプリケーションがあるとします。ユーザーはこのアプリケーションを使用して写真をアップロードし、アプリケーションはユーザーの写真を Amazon S3 バケットに保存します。そこで、アプリケーションは各ユーザーの写真のサムネイルバージョンを作成し、ユーザーのプロフィールページに表示します。このシナリオで、サムネイルを自動的に作成する Lambda 関数を作成することができます。Amazon S3 はサポートされている AWS イベントソースの 1 つであり、オブジェクト作成イベントを発行して Lambda 関数を呼び出すことができます。Lambda 関数コードは S3 バケットから写真オブジェクトを読み込み、サムネイルバージョンを作成して、それを別の S3 バケットに保存できます。

• データと分析 – 分析アプリケーションを構築して、raw データを DynamoDB テーブルに保存するとします。テーブル内の項目を書き込み、更新、または削除した場合、DynamoDB ストリームは項目の更新イベントをテーブルに関連付けられたストリームに発行できます。この場合、イベントデータは、項目キー、イベント名 (挿入、更新、削除など)、その他関連する詳細情報を提供します。raw データを集約することでカスタムメトリクスを生成する Lambda 関数を記述できます。

• ウェブサイト – ウェブサイトを作成して Lambda でバックエンドロジックをホストするとします。Amazon API Gateway を HTTP エンドポイントとして使用して、HTTP 経由で Lambda 関数を呼び出します。これで、ウェブクライアントが API を呼び出し、API Gateway がリクエストを Lambda にルーティングできます。

• モバイルアプリケーション – イベントを処理するカスタムモバイルアプリケーションがあるとします。カスタムアプリケーションによって発行されるイベントを処理するための Lambda 関数を作成できます。たとえば、このシナリオの場合、カスタムモバイルアプリケーション内のクリックを処理するLambda 関数を設定できます。

それぞれのイベントソースは、イベントデータに特定の形式を使用します。詳細については、「イベントソースによって公開されたサンプルイベント (p. 170)」を参照してください。Lambda 関数が呼び出される際、イベントを Lambda 関数のパラメーターとして受信します。

AWS Lambda では、イベントソースとして、多くの AWS サービスをサポートしています。詳細については、「サポートされているイベントソース (p. 163)」を参照してください。これらのイベントソースをLambda 関数をトリガーするように設定する場合、Lambda 関数はイベントが発生すると自動的に呼び出されます。イベントソースマッピングを定義して、追跡して Lambda 関数を呼び出すイベントを識別できます。

サポート対象の AWS サービスに加えて、ユーザーアプリケーションでイベントを生成することもできます。つまり、カスタムイベントソースを構築できます。カスタムイベントソースは AWS Lambda「Invoke (p. 463)」オペレーションを使用して Lambda 関数を呼び出します。クライアント、モバイル、ウェブアプリケーションなどのユーザーアプリケーションは、AWS SDK または AWS Mobile SDK forAndroid などの AWS Mobile SDK を使用してイベントを発行し、Lambda 関数をオンデマンドで呼び出すことができます。

以下に、イベントソースの入門例およびエンドツーエンドエクスペリエンスの動作を説明します。

154

Page 161: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド例 1

例 1: Amazon S3 プッシュイベントと Lambda 関数の呼び出し

Amazon S3 は、PUT、POST、COPY、および DELETE オブジェクトイベントなど異なる種類のイベントをバケットに発行できます。バケットの通知機能を使用して、特定のタイプのイベントが発生した場合にLambda 関数を呼び出すように Amazon S3 に指示するイベントソースマッピングを設定できます。

図は、以下のシーケンスを示します。

1. ユーザーはバケット内にオブジェクトを作成します。2. Amazon S3 がオブジェクト作成イベントを検出します。3. Amazon S3 が、実行ロールによって付与されたアクセス権限を使用して Lambda 関数を呼び出しま

す。実行ロールの詳細については、「AWS Lambda に対する認証とアクセスコントロール (p. 353)」を参照してください。Amazon S3 は、バケット通知設定に保存されたイベントソースマッピングに基づいて呼び出す Lambda 関数を確認します。

4. AWS Lambda はイベントをパラメーターとして指定して、Lambda 関数を実行します。

次の点に注意してください。

• イベントソースマッピングはイベントソースのサービス (このシナリオでは Amazon S3) 内に維持されます。これは、ストリームベースのソース (Kinesis や DynamoDB ストリーム) を除くすべてのサポートされている AWS イベントソースに当てはまります。次の例では、ストリームベースのイベントソースを説明しています。

• イベントソース (Amazon S3) が Lambda 関数を呼び出します (プッシュモデルといいます)。これも、ストリームベースのイベントソースを除くすべてのサポート対象の AWS サービスに当てはまります。

• イベントソース (Amazon S3) が Lambda 関数を呼び出すには、Lambda 関数に添付されたアクセス権限ポリシーを使用してアクセス権限を付与する必要があります。

例 2: AWS Lambda での Kinesis ストリームからのイベント取り出しと Lambda 関数呼び出し

ストリームベースのイベントソースの場合、AWS Lambda がストリームをポーリングし、ストリームでレコードが検出されると Lambda 関数が呼び出されます。これらストリームソースは、そのイベントソース

155

Page 162: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド呼び出しタイプ

マッピング情報が Lambda に保存される点が特別です。AWS Lambda はこのようなイベントソースマッピングを作成、管理するための API を提供します。

次の図は、カスタムアプリケーションが Kinesis ストリームにどのようにレコードを書き込むか示しています。

図は、以下のシーケンスを示します。

1. カスタムアプリケーションは Kinesis ストリームにレコードを書き込みます。2. AWS Lambda は継続してストリームをポーリングし、ストリームで新しいレコードを検出すると

Lambda 関数を呼び出します。AWS Lambda は、Lambda に作成されたイベントソースマッピングに基づいて、ポーリングするストリームおよび呼び出す Lambda 関数を識別します。

3. Lambda 関数は、受信イベントに伴って呼び出されます。

次の点に注意してください。

• ストリームベースのイベントソースを使用する場合、以下が該当します。• AWS Lambda でイベントソースマッピングを作成します。• AWS Lambda が Lambda 関数を呼び出します (プルモデルといいます)。

• AWS Lambda では、Lambda 関数の呼び出しにアクセス権限は必要ありません。そのため、Lambda 関数に添付されたアクセス権限ポリシーに権限を追加する必要はありません。

• Lambda ロールにはストリームから読み取るためのアクセス権限が必要です。

呼び出しタイプAWS Lambda では Lambda 関数の同期呼び出しおよび非同期呼び出しがサポートされています。呼び出しタイプを制御できるのは、自分で Lambda 関数を呼び出すときのみです (オンデマンド呼び出しといいます)。以下はオンデマンド呼び出しの例です。

• カスタムアプリケーションが Lambda 関数を呼び出します。

 • テストの目的で、手動で Lambda 関数を呼び出します (たとえば、AWS CLI を使用して)。

いずれの場合も、「Invoke (p. 463)」オペレーションを使用して Lambda 関数を呼び出します。呼び出しタイプは同期または非同期を指定できます。

ただし、イベントソースとして AWS サービスを使用する場合、呼び出しタイプはこれらのサービスごとに事前に定義されています。これらのイベントタイプが Lambda 関数を呼び出すときに、使用する呼

156

Page 163: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドイベントソースマッピング

び出しタイプを制御することはできません。たとえば、Amazon S3 は常に非同期で Lambda 関数を呼び出し、Amazon Cognito は常に同期で Lambda 関数を呼び出します。ストリームベース AWS サービス(Amazon Kinesis Streams や Amazon DynamoDB Streams) の場合は、AWS Lambda がストリームをポーリングし、Lambda 関数を同期的に呼び出します。

イベントソースマッピングAWS Lambda では、Lambda 関数およびイベントソースは AWS Lambda の主な構成要素です。 イベントソースはイベントを発行するエンティティであり、Lambda 関数はそのイベントを処理するカスタムコードです。サポートされているイベントソースとは、AWS Lambda で使用できるように事前設定されたAWS サービスのことです。設定はイベントソースマッピングといい、イベントソースを Lambda 関数にマッピングします。これにより、イベントが発生した場合に Lambda 関数の自動呼び出しが可能になります。

各イベントソースマッピングは、発行するイベントのタイプおよびイベント発生時に呼び出す Lambda 関数を識別します。その後、特定の Lambda 関数がイベント情報をパラメーターとして受信し、Lambda 関数コードがイベントを処理できるようになります。

イベントソースに関して以下の点に注意してください。これらのイベントソースは、以下のいずれかです。

• AWS サービス – AWS Lambda で使用するように事前設定できる、サポートされている AWS サービスがあります。これらのサービスを、常用 AWS サービスまたはストリームベースのサービスとしてグループ化できます。Amazon Kinesis Data Streams および Amazon DynamoDB Streams はストリームベースのイベントソースであり、そのほかの AWS サービスはストリームベースのイベントソースを使用しません。イベントソースマッピングを維持する場合、および Lambda 関数の呼び出し方法は、ストリームベースのイベントソースを使用しているかどうかによって異なります。

• カスタムアプリケーション – イベントの発行や Lambda 関数の呼び出しに、カスタムアプリケーションを使用できます。

イベントマッピング情報をどこに維持するか迷うことがあるかもしれません。AWS Lambda 内のイベントソース内に維持すればいいのでしょうか?次のセクションでは、これらイベントソースのカテゴリごとにイベントソースマッピングについて説明します。このセクションでは、Lambda 関数の呼び出し方法およびLambda 関数の呼び出しを許可するアクセス権限の管理についても説明します。

トピック• AWS サービス向けのイベントソースマッピング (p. 157)• AWS ストリームベースのサービス向けのイベントソースマッピング (p. 158)• カスタムアプリケーションのイベントソースマッピング (p. 159)

AWS サービス向けのイベントソースマッピングストリームベースの AWS サービス (Amazon Kinesis Data Streams および DynamoDB ストリーム) を除いて、サポート対象の AWS サービスはイベントを発行し、また Lambda 関数を呼び出すことができます(プッシュモデルといいます)。プッシュモデルは、以下に注意してください。

• イベントソースマッピングは、イベントソース内に保持されます。イベントソース内の関連 API サポートを使用して、イベントソースマッピングを作成および管理できます。たとえば、Amazon S3 はバケット通知設定 API を提供します。この API を使用して、発行するバケットイベントと呼び出す Lambda 関数を識別するイベントソースマッピングを設定できます。

• イベントソースは Lambda 関数を呼び出すため、リソースベースのポリシー (Lambda 関数ポリシーといいます) を使用してイベントソースに必要なアクセス権限を付与する必要があります。詳細については、「AWS Lambda アクセス権限モデル (p. 374)」を参照してください。

157

Page 164: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドイベントソースマッピング

以下の例では、このモデルの仕組みを示しています。

Example - Amazon S3 がイベントをプッシュし Lambda 関数の呼び出す

オブジェクト作成バケットイベントごとに、AWS Lambda 関数を呼び出すとします。バケットの通知設定に必要なイベントソースマッピングを追加します。

図はフローを示しています。

1. ユーザーはバケット内にオブジェクトを作成します。2. Amazon S3 がオブジェクト作成イベントを検出します。3. Amazon S3 がバケット通知設定に記述されたイベントソースマッピングに従って Lambda 関数を呼び

出します。4. AWS Lambda が Lambda 関数に添付されたアクセス権限ポリシーを検証して、その Amazon S3 に必

要なアクセス権限があることを確認します。アクセス権限ポリシーの詳細については、「AWS Lambdaに対する認証とアクセスコントロール (p. 353)」を参照してください。

5. AWS Lambda で添付されたアクセス権限ポリシーが確認されると、Lambda 関数が実行されます。Lambda 関数はパラメーターとしてイベントを受け取ることに留意してください。

AWS ストリームベースのサービス向けのイベントソースマッピングAmazon Kinesis Data Streams ストリームと DynamoDB ストリームは、AWS Lambda で使用するようにあらかじめ設定できるストリームベースのサービスです。必要なイベントソースをマッピングすると、AWS Lambda はストリームをポーリングして、Lambda 関数を呼び出します (プルモデルといいます)。プルモデルは、以下に注意してください。

• イベントソースマッピングは、AWS Lambda 内に維持されます。AWS Lambda はイベントソースマッピングを作成、管理するための関連 API を提供します。詳細については、「CreateEventSourceMapping (p. 420)」を参照してください。

• AWS Lambda に、ストリームをポーリングして、レコードを読み取るアクセス権限が必要となります。これらのアクセス権限は、Lambda 関数の作成時に指定したロールに関連付けられたアクセス権限ポリシーを使用して、実行ロールを経由して付与します。AWS Lambda には、Lambda 関数を呼び出すためのアクセス権限は必要ありません。

以下の例では、このモデルの仕組みを示しています。

158

Page 165: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドイベントソースマッピング

Example – AWS Lambda での Kinesis ストリームからのイベント取り出しと Lambda 関数呼び出し

次の図は、Kinesis ストリームにレコードを書き込むカスタムアプリケーションおよび AWS Lambda がストリームをポーリングする方法を示します。AWS Lambda がストリームで新規レコードを検出すると、Lambda 関数を呼び出します。

Kinesis ストリームにレコードを書き込むカスタムアプリケーションがあるとします。ストリームで新しいレコードが検出されると、Lambda 関数が呼び出されるようにします。Lambda 関数と必要なイベントソースマッピングを AWS Lambda に作成します。

図は、以下のシーケンスを示します。

1. カスタムアプリケーションは Kinesis ストリームにレコードを作成します。2. AWS Lambda は継続してストリームをポーリングし、ストリームで新しいレコードを検出すると

Lambda 関数を呼び出します。AWS Lambda は、AWS Lambda に作成されたイベントソースマッピングに基づいて、ポーリングするストリームおよび呼び出す Lambda 関数を識別します。

3. 添付されたアクセス権限ポリシー (AWS Lambda にストリームのポーリングを許可するもの) が検証されると、AWS Lambda は Lambda 関数を実行します。アクセス権限ポリシーの詳細については、「AWS Lambda に対する認証とアクセスコントロール (p. 353)」を参照してください。

例では Kinesis ストリーミングを使用しますが、DynamoDB ストリームを使用するときも同様です。

カスタムアプリケーションのイベントソースマッピングイベントを発行して処理するカスタムアプリケーションがある場合は、これらのイベントを処理するLambda 関数を作成できます。この場合、事前設定は必要ありません。つまり、イベントソースマッピングをセットアップする必要はありません。代わりに、イベントソースは AWS Lambda の Invoke API を使用します。アプリケーションおよび Lambda 関数が異なる AWS アカウントによって所有されている場合、Lambda 関数を所有する AWS アカウントは Lambda 関数に関連付けられるアクセス権限ポリシーでクロスアカウント権限を許可する必要があります。

以下の例では、このしくみを示しています。

Example – カスタムアプリケーションがイベントを発行し Lambda 関数を呼び出す

次の図は、アカウントでカスタムアプリケーションが Lambda 関数を呼び出す方法を示しています。この例では、カスタムアプリケーションは Lambda 関数を所有するアカウントと同じアカウント認証情報を使用しているため、関数を呼び出すためにアクセス権限を追加する必要はありません。

159

Page 166: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド再試行動作について

次の例では、ユーザーアプリケーションおよび Lambda 関数は、さまざまな AWS アカウントによって所有されています。この場合、Lambda 関数を所有する AWS アカウントは、Lambda 関数に関連付けられたアクセス権限ポリシーに、クロスアカウントアクセス権限がある必要があります。詳細については、「AWS Lambda アクセス権限モデル (p. 374)」を参照してください。

再試行動作についてLambda 関数は、次のいずれかが原因で失敗する場合があります。

• 関数がエンドポイントに到達する前にタイムアウトになった。

 • 関数が入力データを正しく解析できなかった。

 • 関数にメモリ不足エラーまたは他タイムアウトなどのリソース制約が発生した。

このようなエラーが発生する場合、関数は例外をスローします。例外の処理方法は、Lambda 関数の呼び出し方法によります。

• ストリームベースではないイベントソース – これらのイベントソースの一部は Lambda 関数を同期的に呼び出すようにセットアップされています。それ以外は非同期呼び出しです。したがって、例外は次のように処理されます。

160

Page 167: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドスケーリング動作について

 • 同期呼び出し – 呼び出し元アプリケーションが 429 エラーを受け取り、再試行が必要となります。

サポートされているイベントソースおよびそれらが使用する呼び出しタイプのリストについては、サポートされているイベントソースを参照してください。これらのイベントソースは、追加の再試行数が統合に組み込まれている場合もあります。

AWS SDK を使用して Lambda 関数を直接呼び出した場合、クライアントではエラーが表示され、再試行を選択できます。

 • 非同期呼び出し – 非同期イベントは Lambda 関数の呼び出しに使用される前にキューされます。AWS

Lambda がイベントを完全に処理できない場合、呼び出しが 2 回自動的に再試行されます (再試行間には遅延があります)。関数にデッドレターキュー (DLQ) を指定した場合、障害イベントは指定されたAmazon SQS キューまたは Amazon SNS トピックに送信されます。要求されず、またデフォルト設定でデッドレターキュー (DLQ) を指定しない場合、そのイベントは破棄されます。詳細については、「デッドレターキュー (p. 398)」を参照してください。

 • ストリームベースのイベントソース – ストリームベースのイベントソース (Amazon Kinesis Data

Streams および DynamoDB ストリーム) の場合、AWS Lambda はストリームをポーリングして Lambda関数を呼び出します。そのため、Lambda 関数が失敗した場合、AWS Lambda はデータの有効期限(Amazon Kinesis Data Streams の場合 7 日間) が切れるまで、レコードのエラーが発生したバッチを試みます。例外はブロックとして扱われ、失敗したレコードのバッチの有効期限が切れるか処理が成功するまで、AWS Lambda ではストリームから新しいレコードの読み込みが行われません。こうすることで、確実に AWS Lambda で順番にストリームイベントが処理されます。

呼び出しモードの詳細については、「イベントソースマッピング (p. 157)」を参照してください。

スケーリング動作について同時実行数とは、ある時点に関数コードが実行されている件数を指します。同時実行数を見積もることはできますが、Lambda 関数がストリームベースのイベントソースからのイベントを処理しているかによって、同時実行数は異なります。

• Kinesis または DynamoDB ストリームを処理する Lambda 関数のストリームベースのイベントソース。この場合、各シャードが同時実行の単位です。ストリームに 100 個の実行中シャードがある場合は、最大で 100 個の Lambda 関数呼び出しが同時に実行されています。これは、Lambda が各シャードのイベントを順番に処理するためです。

• ストリームベースでないイベントソース - ストリームベースでないイベントソースからのイベントを処理する Lambda 関数を作成する場合 (たとえば、Lambda が Amazon S3 や API Gateway などの他のソースからのすべてのイベントを処理できる場合)、発行される各イベントが同時実行の単位です (アカウントの上限まで)。したがって、イベントソースが発行するイベント (またはリクエスト) の数が、同時実行数に影響します。以下の数式を使用して、Lambda 関数の同時呼び出し数を見積もることができます。

events (or requests) per second * function duration

たとえば、Amazon S3 イベントを処理する Lambda 関数について考えてみます。Lambda 関数が平均 3秒、Amazon S3 が 1 秒あたり 10 個のイベントを発行するとします。したがって、Lambda 関数の同時実行数は 30 です。

161

Page 168: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド同時実行リクエスト率

リクエスト料金リクエスト率とは、Lambda 関数が呼び出される率のことです。ストリームベースのサービスを除くすべてのサービスの場合は、リクエスト率はイベントソースがイベントを生成する率です。ストリームベースのサービスの場合は、AWS Lambda は次のようにリクエスト率を計算します。

request rate = number of concurrent executions / function duration

たとえば、5 つのアクティブなシャードがストリームにあり (つまり、5 つの Lambda 関数が同時に実行されていて)、Lambda 関数に 2 秒かかる場合、リクエスト率は 2.5 リクエスト/秒です。

スケーリングAWS Lambda は、アカウントの「アカウントレベルの同時実行数の制限 (p. 387)」に従って、トラフィックの増加に応じて容量を動的にスケールします。任意のトラフィックのバーストを処理するために、Lambda はそれが実行されるリージョンに応じてあらかじめ決められた量で同時実行関数を即時に増やします。

次の表に示すように、デフォルト値の [Immediate Concurrency Increase] がトラフィックの急増に対応するために十分ではない場合、Lambda は関数の同時実行数を 1 分あたり 500 ずつ、アカウントの安全制限に到達するか、関数の同時実行数が増加した負荷を正常に処理するのに十分な数になるまで増やし続けます。

Note

Lambda は Amazon EC2 に依存して VPC 対応の Lambda 関数の Elastic Network Interface を提供するため、これらの関数にもスケーリングの際に Amazon EC2 のレート制限が適用されます。Amazon EC2 のレート制限により、VPC 対応の関数では 1 分間に 500 件を超える同時呼び出しを追加できないため、前のセクションの「同時実行数の制限の引き上げをリクエストするには」の手順に従って制限の引き上げをリクエストしてください。このレートを超える場合 (同時実行数の引き上げ枠をすぐに使い切るアプリケーションの場合)は、アプリケーションでクライアント側の再試行およびバックオフを通じて Amazon EC2 スロットリング (502 EC2ThrottledException) を処理します。詳細については、「AWS でのエラーの再試行とエクスポネンシャルバックオフ」を参照してください。

以下の表には、リージョンごとの即時同時実行増加の概要が記載されています。

リージョン 即時同時実行増加 (関数実行)

アジアパシフィック (東京) 1,000

アジアパシフィック (ソウル) 500

アジアパシフィック (ムンバイ) 500

アジアパシフィック (シンガポール) 500

アジアパシフィック (シドニー) 500

中国 (北京) 500

カナダ (中部) 500

欧州 (フランクフルト) 1,000

欧州 (ロンドン) 500

162

Page 169: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサポートされているイベントソース

リージョン 即時同時実行増加 (関数実行)

欧州 (アイルランド) 3000

EU (パリ) 500

AWS GovCloud (US) 500

米国東部 (オハイオ) 500

米国西部 (北カリフォルニア) 500

米国西部 (オレゴン) 3000

米国東部(バージニア北部) 3000

南米 (サンパウロ) 500

AWS GovCloud (US) 500

関数の同時実行を表示および管理する方法については、「同時実行数の管理 (p. 387)」を参照してください。

サポートされているイベントソースこのトピックでは、AWS Lambda 関数のイベントソースとして設定できるサポート対象の AWS サービスを示します。イベントソースマッピングをあらかじめ設定した後、イベントソースがイベントを検出すると Lambda 関数が自動的に呼び出されます。呼び出しモードの詳細については、「イベントソースマッピング (p. 157)」を参照してください。

このトピックにリストされているすべてのイベントソースは、以下の点に注意してください。

• イベントソースはストリームベースのサービス (Amazon Kinesis Data Streams および AmazonDynamoDB Streams) を除いて、イベントソースマッピングを維持します。ストリームベースのサービスの場合は、AWS Lambda がイベントソースマッピングを維持します。AWS Lambda はイベントソースマッピングを作成、管理するための「CreateEventSourceMapping (p. 420)」オペレーションを提供します。詳細については、「イベントソースマッピング (p. 157)」を参照してください。

 • これらのイベントソースが Lambda 関数の呼び出し時に使用する呼び出しタイプも、あらかじめ設定さ

れています。たとえば、Amazon S3 は常に非同期で Lambda 関数を呼び出し、Amazon Cognito は同期で Lambda 関数を呼び出します。呼び出しタイプを制御できる唯一の場合は、「Invoke (p. 463)」オペレーションを使用して自分で Lambda 関数を呼び出す場合です (たとえば、カスタムアプリケーションからオンデマンドで Lambda 関数を呼び出すなど)。

 • AWS イベントを処理するには、関数の作成に使用したプログラミング言語に応じて、Lambda 関数に

追加のライブラリを含める必要がある場合があります。Node.js または Python で記述された関数に追加のライブラリは必要ありません。C# の場合は、AWS Lambda for .NET Core を含める必要があります。Java の場合は、aws-lambda-java-libs を含める必要があります。

Important

含める各パッケージは変更せずに使用する必要があります。依存関係を削除したり、競合する依存関係を追加したり、パッケージからクラスを選択して含めたりすると、予期しない動作が発生する場合があります。

163

Page 170: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon S3

Lambda 関数をオンデマンドで呼び出すこともできます。詳細については、「その他のイベントソース: オンデマンドで Lambda 関数を呼び出す (p. 170)」を参照してください。

これらのイベントソースによって発行されたイベントの例については、「イベントソースによって公開されたサンプルイベント (p. 170)」を参照してください。

トピック• Amazon S3 (p. 164)• Amazon DynamoDB (p. 164)• Amazon Kinesis Data Streams (p. 165)• Amazon Simple Notification Service (p. 165)• Amazon Simple Email Service (p. 166)• Amazon Cognito (p. 166)• AWS CloudFormation (p. 166)• Amazon CloudWatch Logs (p. 167)• Amazon CloudWatch Events (p. 167)• AWS CodeCommit (p. 167)• スケジュールされたイベント (Amazon CloudWatch Events を使用) (p. 168)• AWS Config (p. 168)• Amazon Alexa (p. 168)• Amazon Lex (p. 169)• Amazon API Gateway (p. 169)• AWS IoT ボタン (p. 169)• Amazon CloudFront (p. 170)• Amazon Kinesis Data Firehose (p. 170)• その他のイベントソース: オンデマンドで Lambda 関数を呼び出す (p. 170)• イベントソースによって公開されたサンプルイベント (p. 170)

Amazon S3Lambda 関数を作成して、オブジェクト作成イベントやオブジェクト削除イベントなど S3 バケットのイベントを処理できます。たとえば、ユーザーがバケットに写真をアップロードする場合に、Amazon S3 でLambda 関数を呼び出してイメージを読み取り、写真のサムネイルを作成するとします。

イベントソースマッピングを設定し、Amazon S3 で発行され Lambda 関数を呼び出すバケットイベントを識別するには、Amazon S3 のバケットの通知設定の機能を使用できます。

Amazon S3 のイベントの例については、イベントメッセージの構造、「Amazon S3 入力のイベント例 (p. 176)」および「Amazon S3 削除のイベント例 (p. 177)」を参照してください。ユースケース例については、「AWS Lambda を Amazon S3 に使用する (p. 182)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon S3 では Lambda 関数を非同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon DynamoDBAmazon DynamoDB テーブルに対して、Lambda 関数をトリガーとして使用できます。トリガーは、DynamoDB テーブルに対して行われた更新に応じて行うカスタムアクションです。トリガーを作成す

164

Page 171: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon Kinesis Data Streams

るには、まずテーブルに対して Amazon DynamoDB Streams を有効にします。AWS Lambda はストリームをポーリングし、Lambda 関数がストリームに発行された更新を処理します。

これは、ストリームベースのイベントソースです。ストリームベースのサービスの場合、AWS Lambda にイベントソースマッピングを作成し、ポーリングするストリームおよび呼び出す Lambda 関数を識別します。

DynamoDB イベントの例については、「ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す) (p. 218)」および「Amazon DynamoDB 更新のイベント例 (p. 174)」を参照してください。一般的な形式については、『Amazon DynamoDB API Reference』の「GetRecord」を参照してください。ユースケース例については、「Amazon DynamoDB で AWS Lambda を使用する (p. 211)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。DynamoDB は、ストリームベースのイベントソースです。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon Kinesis Data Streamsストリームを自動的にポーリングして、ウェブサイトクリックストリーム、金融取引、ソーシャルメディアフィード、IT ログ、ロケーション追跡イベントなどの新規レコードを処理するように、AWS Lambda を設定できます。この場合、AWS Lambda は新しいレコードを検出するために定期的 (1 秒に 1 回) にストリームをポーリングします。

ストリームベースのサービスの場合、AWS Lambda にイベントソースマッピングを作成し、ポーリングするストリームおよび呼び出す Lambda 関数を識別します。

イベントの例については、「ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 206)」および「Amazon Kinesis Data Streams のイベント例 (p. 176)」を参照してください。ユースケース例については、「Kinesis で AWS Lambda を使用する (p. 200)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon Kinesis Data Streamsは、ストリームベースのイベントソースです。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon Simple Notification ServiceAmazon Simple Notification Service 通知を処理する Lambda 関数を記述できます。Amazon SNS トピックに対してメッセージが発行された場合に、サービスがメッセージのペイロードをパラメーターとして渡すことで Lambda 関数を呼び出すことができます。その後、Lambda 関数コードがイベントを処理します。たとえば、別の Amazon SNS トピックにメッセージを発行したり、別の AWS サービスにメッセージを送信したりできます。

また、Amazon CloudWatch アラームや Amazon SNS を使用する別の AWS サービスに応答して Lambda関数をトリガーすることもできます。

Amazon SNS のイベントソースマッピングはトピックのサブスクリプション設定を使用して設定します。詳細については、『Amazon Simple Notification Service 開発者ガイド』の「Amazon SNS 通知を使用したLambda 関数の呼び出し」を参照してください。

イベントの例については、付録: メッセージおよび JSON の形式および「Amazon SNS のイベント例 (p. 173)」を参照してください。ユースケース例については、「さまざまなアカウントから AWSLambda を Amazon SNS で使用 (p. 239)」を参照してください。

Lambda 関数がサブスクライブされているトピックに対してユーザーが SNS Publish API を呼び出すと、Amazon SNS は Lambda を呼び出して関数を非同期的に呼び出します。Lambda からは配信ステー

165

Page 172: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon Simple Email Service

タスが返されます。Lambda の呼び出しでエラーが発生した場合、Amazon SNS は Lambda 関数の呼び出しを最大 3 回まで再試行します。3 回試行しても正常に Lambda 関数を呼び出すことができなかった場合、Amazon SNS から CloudWatch に配信ステータス失敗メッセージが送信されます。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon SNS では Lambda 関数を非同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon Simple Email ServiceAmazon Simple Email Service (Amazon SES) は、コスト効率が高い E メールサービスです。AmazonSES を使用すると、E メールの送信に加えて、メッセージの受信にもサービスを使用できます。AmazonSES の詳細については、Amazon Simple Email Serviceを参照してくださいAmazon SESを使用してメッセージを受信する場合、メッセージが到着すると Lambda 関数を呼び出すように Amazon SESを設定できます。設定すると、受信 E メールイベント (実際には Amazon SNS イベントの Amazon SES メッセージ)をパラメータとして渡すことで、サービスによって Lambda 関数を呼び出すことができます。シナリオの例はAmazon SES による E メール受信のユースケースの検討を参照してください。

Amazon SES のルール設定を使用してイベントソースマッピングを設定します。以下のトピックでは、Amazon Simple Email Service 開発者ガイドの追加情報を提供しています。

• サンプルイベントについては、Lambda アクションおよび「Amazon SES E メール受信のイベント例 (p. 171)」を参照してください。

• Lambda 関数の例については、Lambda 関数の例を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon SES では Lambda 関数を非同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon CognitoAmazon Cognito イベント機能を使用して、Amazon Cognito のイベントに応答して Lambda 関数を実行できます。たとえば、データセットが同期されるたびに発行される同期トリガーイベントに対して Lambda関数を呼び出すことができます。詳細および例の解説については、モバイル開発ブログのAmazon Cognitoイベントの概要: 同期トリガーを参照してください。

Amazon Cognito のイベントサブスクリプション設定を使用してイベントソースマッピングを設定します。イベントソースマッピングとイベント例については、Amazon Cognito 開発者ガイドのAmazonCognito イベントを参照してください。別のイベント例については、「Amazon Cognito Sync トリガーのイベント例 (p. 175)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon Cognito は Lambda関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

AWS CloudFormationAWS CloudFormation スタックをデプロイする作業の一環として、Lambda 関数をカスタムコマンドを実行するためのカスタムリソースとして指定できます。Lambda 関数をカスタムリソースと関連付けることで、AWS CloudFormation スタックを作成、更新、または削除した際に Lambda 関数が呼び出されます。

スタック定義を使用して AWS CloudFormation にイベントソースマッピングを設定します。詳細については、『AWS CloudFormation ユーザーガイド』の「AWS Lambda-backed カスタムリソース」を参照してください。

166

Page 173: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon CloudWatch Logs

イベント例については、「AWS CloudFormation リクエスト作成のイベント例 (p. 171)」を参照してください。このイベントは、実際には Amazon SNS イベントの AWS CloudFormation メッセージであることに注意してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。AWS CloudFormation ではLambda 関数を同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon CloudWatch LogsAWS Lambda 関数を使用して、CloudWatch Logs サブスクリプションを使用した Amazon CloudWatchLogs のカスタム分析を実行できます。CloudWatch Logs サブスクリプションを使用して CloudWatchLogs からのログイベントのリアルタイムフィードにアクセスし、AWS Lambda 関数に配信して、カスタム処理、分析、他のシステムへのロードを行うことができます。CloudWatch Logs の詳細については、ログファイルのモニタリングを参照してください。

ログサブスクリプション設定を使用して、Amazon CloudWatch Logs のイベントソースマッピングを維持します。詳細については、Amazon CloudWatch ユーザーガイドのサブスクリプションを使用したログデータのリアルタイム処理 (例 2: AWS Lambda)を参照してください。

イベント例については、「Amazon CloudWatch Logs のイベント例 (p. 173)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon CloudWatch Logs はLambda 関数を非同期的に呼び出します (Lambda 関数の呼び出しはログへの書き込みオペレーションを妨げません)。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon CloudWatch EventsAmazon CloudWatch Events は、AWS リソースの状態変化への対応に役立ちます。リソースの状態が変化すると、自動的にイベントがイベントストリームに送信されます。選択したイベントをストリーム内で照合し、AWS Lambda 関数にルーティングしてアクションを実行するためのルールを作成できます。たとえば、AWS Lambda 関数を自動的に呼び出し、EC2 インスタンスまたは AutoScaling グループの状態を記録することができます。

ルールターゲット定義を使用して、Amazon CloudWatch イベントのイベントソースマッピングを維持します。詳細については、Amazon CloudWatch Events API リファレンスの PutTargets オペレーションを参照してください。

イベント例については、Amazon CloudWatch ユーザーガイドのサポートされるイベントタイプを参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon CloudWatch イベントは Lambda 関数を非同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

AWS CodeCommitAWS CodeCommit リポジトリのトリガーを作成して、リポジトリのイベントから Lambda 関数を呼び出すことができます。たとえば、ブランチまたはタグが作成されたときや既存のブランチに対してプッシュが行われたときに、Lambda 関数を呼び出すことができます。詳細については、「Manage Triggers for anAWS CodeCommit Repository」を参照してください。

リポジトリトリガーを使用して AWS CodeCommit にイベントソースマッピングを維持します。詳細については、PutRepositoryTriggers オペレーションを参照してください。

167

Page 174: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドスケジュールされたイベント

(Amazon CloudWatch Events を使用)

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。AWS CodeCommit はLambda 関数を非同期的に呼び出します。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

スケジュールされたイベント (Amazon CloudWatchEvents を使用)Amazon CloudWatch イベントのイベントスケジュール機能を使用し、スケジュールに基づいて定期的にコードが呼び出されるように AWS Lambda をセットアップすることもできます。スケジュールを設定するには、固定料金 (時間、日、または週の数) を指定、または cron 式を指定できます (AmazonCloudWatch ユーザーガイドのルールのスケジュール式の構文を参照してください)。

ルールターゲット定義を使用して、Amazon CloudWatch イベントのイベントソースマッピングを維持します。詳細については、Amazon CloudWatch Events API リファレンスの PutTargets オペレーションを参照してください。

ユースケース例については、「スケジュールされたイベントでの AWS Lambda の使用 (p. 275)」を参照してください。

イベント例については、「スケジュールされたイベントのイベント例 (p. 173)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon CloudWatch イベントは Lambda 関数を非同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

AWS ConfigAWS Lambda 関数を使用して、AWS リソースの設定が独自の設定ルールに従っているかどうかを評価できます。リソースが作成、削除、変更されると、AWS Config がこれらの変更を記録し、Lambda 関数に情報を送信します。Lambda 関数は変更を評価し、結果を AWS Config に報告します。その後、AWS Configを使用してリソース全体のコンプライアンスを評価できます。どのリソースが不適合であり、どの設定属性が不適合の原因であるかを知ることができます。

ルールターゲット定義を使用して、AWS Config のイベントソースマッピングを維持します。詳細については、AWS Config API リファレンスの PutConfigRule オペレーションを参照してください。

詳細については、AWS Config ルールを使用したリソースの評価を参照してください。カスタムルールの設定については、AWS Config のカスタムルールの開発を参照してください。Lambda 関数の例については、AWS Config ルール向けの AWS Lambda 関数の例 (Node.js)を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。AWS Config は Lambda 関数を非同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon AlexaLambda 関数を使用して Amazon Echo の音声アシスタントである Alexa に新しいスキルを与えるサービスをビルドできます。Alexa Skills Kit は、Lambda 関数として実行している独自のサービスを使用して、新しいスキルを作成するための API、ツール、およびドキュメントを提供します。Amazon Echo ユーザーは、Alexa に質問やリクエストを行うことで、これらの新しいスキルにアクセスできます。詳細については、以下のトピックを参照してください。

• Alexa スキルキットの使用開始。• alexa-skills-kit-sdk-for-nodejs• alexa-skills-kit-java

168

Page 175: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon Lex

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon Echo は Lambda 関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon LexAmazon Lex は、音声とテキストを使用してアプリケーションに会話型インターフェイスを構築するための AWS のサービスです。Amazon Lex は AWS Lambda との事前に構築された統合を提供し、AmazonLex ボットでコードフックとして使用するための Lambda 関数を作成することができます。インテント設定では、初期化/検証、受理、またはその両方を実行するため Lambda 関数を識別できます。

詳細については、Lambda 関数の使用を参照してください。ユースケース例については、演習 1: 設計図を使用して Amazon Lex ボットを作成するを参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon Lex は Lambda 関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon API GatewayLambda 関数を HTTPS 経由で呼び出すことができます。Amazon API Gateway を使用してカスタムREST API エンドポイントを定義することで、これを行うことができます。特定の Lambda 関数に、GETや PUT などの個別の API オペレーションをマッピングします。API エンドポイントに HTTPS リクエストを送信するときに、Amazon API Gateway サービスが、対応する Lambda 関数を呼び出します。

詳細については、Lambda 関数を同時に呼び出すを参照してください。ユースケース例については、「Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) (p. 245)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Amazon API Gateway はLambda 関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

また、Lambda 関数を、このトピックにリストされているサポートされている AWS イベントソースのいずれかにデータを発行する他の AWS サービスとともに使用できます。たとえば、次のようにすることができます。

• Amazon S3 バケットへのすべての API アクセスイベントが記録されるため、CloudTrail の更新に応じてLambda 関数をトリガーします。

• Amazon SNS トピックに対してアラームイベントが発行されるため、CloudWatch アラームに応じてLambda 関数をトリガーします。

AWS IoT ボタンAWS IoT ボタンは、Amazon Dash Button ハードウェアをベースにしたプログラミング可能なボタンです。このシンプルな Wi-Fi デバイスは設定が簡単で、開発者が AWS Lambda やその他多くの AWS のサービスを、デバイス固有のコードを作成せずに開始できるように設計されています。

クラウド内のボタンのロジックをコーディングして、アイテムのカウントまたは追跡、呼び出しまたはアラート、何かの開始または停止、サービスのオーダー、またはフィードバックを提供するようにボタンのクリックを設定できます。例えばボタンをクリックして、車のロック解除や始動、ガレージのオープン、タクシーの配車、配偶者やカスタマーサービスの代表者の呼び出し、家庭の日用品、薬品または製品の使用量のトラッキング、または家電のリモートコントロールを行えます。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。AWS IoT は Lambda 関数を非同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

169

Page 176: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon CloudFront

Amazon CloudFrontLambda@Edge では、CloudFront イベントに応答して AWS リージョンと Amazon CloudFront エッジロケーションで Lambda 関数を実行でき、サーバーのプロビジョニングや管理は不要です。Lambda 関数を使用して、次の時点で CloudFront リクエストとレスポンスを変更できます。

• CloudFront がビューワーからリクエストを受信した後 (ビューワーリクエスト)• CloudFront がリクエストをオリジンサーバーに転送する前 (オリジンリクエスト)• CloudFront がオリジンからレスポンスを受信した後 (オリジンレスポンス)• CloudFront がビューワーにレスポンスを転送する前 (ビューワーレスポンス)

詳細については、「AWS Lambda@Edge (p. 288)」を参照してください。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。CloudFront は Lambda 関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

Amazon Kinesis Data FirehoseAmazon Kinesis Data Firehose は、ストリーミングデータを AWS にロードする最も簡単な方法です。ストリーミングデータをキャプチャし、変換し、Kinesis Data Analytics や Amazon S3 などのサービスに自動的にロードすることができるため、現在既に使用している既存のビジネスインテリジェンスツールとダッシュボードによってほぼリアルタイムの分析を行うことが可能になります。Lambda 関数を作成して、データがダウンストリームに送信される前に、カスタマイズされた処理を追加でリクエストできます。

指定のイベントソースのエラー処理は、Lambda の起動方法で決まります。Kinesis Data Firehose はLambda 関数を同期的に呼び出すように設定されています。エラーの再試行方法の詳細については、「再試行動作について (p. 160)」を参照してください。

その他のイベントソース: オンデマンドで Lambda 関数を呼び出すイベントソースを使用して Lambda 関数を呼び出すほかに、オンデマンドでも Lambda 関数を呼び出すことができます。この場合、イベントソースマッピングを事前設定する必要はありません。ただし、カスタムアプリケーションに Lambda 関数を呼び出すために必要な権限があることを確認してください。

たとえば、ユーザーアプリケーションでイベントを生成できます (独自のカスタムイベントソースを構築します)。クライアント、モバイル、ウェブアプリケーションなどのユーザーアプリケーションは、AWS SDK または AWS Mobile SDK for Android などの AWS Mobile SDK を使用してイベントを発行し、Lambda 関数を呼び出すことができます。

詳細については、「Tools for Amazon Web Services」を参照してください。チュートリアルの例については、「Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) (p. 245)」を参照してください。

イベントソースによって公開されたサンプルイベント以下は、サポートされている AWS サービスによって発行されるイベント例のリストです。サポートされる AWS イベントソースについては、「サポートされているイベントソース (p. 163)」を参照してください。

イベント例

170

Page 177: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

• AWS CloudFormation リクエスト作成のイベント例 (p. 171)• Amazon SES E メール受信のイベント例 (p. 171)• スケジュールされたイベントのイベント例 (p. 173)• Amazon CloudWatch Logs のイベント例 (p. 173)• Amazon SNS のイベント例 (p. 173)• Amazon DynamoDB 更新のイベント例 (p. 174)• Amazon Cognito Sync トリガーのイベント例 (p. 175)• Amazon Kinesis Data Streams のイベント例 (p. 176)• Amazon S3 入力のイベント例 (p. 176)• Amazon S3 削除のイベント例 (p. 177)• Amazon Lex のイベント例 (p. 177)• API Gateway プロキシリクエストイベント (p. 178)• API Gateway プロキシレスポンスイベント (p. 179)• CloudFront イベント (p. 179)• AWS Config イベント (p. 180)• AWS IoT ボタンイベント (p. 180)• Kinesis Data Firehose イベント (p. 180)

AWS CloudFormation リクエスト作成のイベント例

{ "StackId": "arn:aws:cloudformation:us-west-2:EXAMPLE/stack-name/guid", "ResponseURL": "http://pre-signed-S3-url-for-response", "ResourceProperties": { "StackName": "stack-name", "List": [ "1", "2", "3" ] }, "RequestType": "Create", "ResourceType": "Custom::TestResource", "RequestId": "unique id for this create request", "LogicalResourceId": "MyTestResource"}

Amazon SES E メール受信のイベント例

{ "Records": [ { "eventVersion": "1.0", "ses": { "mail": { "commonHeaders": { "from": [ "Jane Doe <[email protected]>" ], "to": [ "[email protected]" ], "returnPath": "[email protected]", "messageId": "<0123456789example.com>", "date": "Wed, 7 Oct 2015 12:34:56 -0700",

171

Page 178: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"subject": "Test Subject" }, "source": "[email protected]", "timestamp": "1970-01-01T00:00:00.000Z", "destination": [ "[email protected]" ], "headers": [ { "name": "Return-Path", "value": "<[email protected]>" }, { "name": "Received", "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)" }, { "name": "DKIM-Signature", "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV" }, { "name": "MIME-Version", "value": "1.0" }, { "name": "From", "value": "Jane Doe <[email protected]>" }, { "name": "Date", "value": "Wed, 7 Oct 2015 12:34:56 -0700" }, { "name": "Message-ID", "value": "<0123456789example.com>" }, { "name": "Subject", "value": "Test Subject" }, { "name": "To", "value": "[email protected]" }, { "name": "Content-Type", "value": "text/plain; charset=UTF-8" } ], "headersTruncated": false, "messageId": "o3vrnil0e2ic28tr" }, "receipt": { "recipients": [ "[email protected]" ], "timestamp": "1970-01-01T00:00:00.000Z", "spamVerdict": { "status": "PASS" }, "dkimVerdict": {

172

Page 179: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"status": "PASS" }, "processingTimeMillis": 574, "action": { "type": "Lambda", "invocationType": "Event", "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:Example" }, "spfVerdict": { "status": "PASS" }, "virusVerdict": { "status": "PASS" } } }, "eventSource": "aws:ses" } ]}

スケジュールされたイベントのイベント例

{ "account": "123456789012", "region": "us-east-1", "detail": {}, "detail-type": "Scheduled Event", "source": "aws.events", "time": "1970-01-01T00:00:00Z", "id": "cdc73f9d-aea9-11e3-9d5a-835b769c0d9c", "resources": [ "arn:aws:events:us-east-1:123456789012:rule/my-schedule" ]}

Amazon CloudWatch Logs のイベント例

{ "awslogs": { "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA==" } }

Amazon SNS のイベント例

{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": eventsubscriptionarn, "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "1970-01-01T00:00:00.000Z", "Signature": "EXAMPLE", "SigningCertUrl": "EXAMPLE", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!",

173

Page 180: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "EXAMPLE", "TopicArn": topicarn, "Subject": "TestInvoke" } } ]}

Amazon DynamoDB 更新のイベント例

{ "Records": [ { "eventID": "1", "eventVersion": "1.0", "dynamodb": { "Keys": { "Id": { "N": "101" } }, "NewImage": { "Message": { "S": "New item!" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES", "SequenceNumber": "111", "SizeBytes": 26 }, "awsRegion": "us-west-2", "eventName": "INSERT", "eventSourceARN": eventsourcearn, "eventSource": "aws:dynamodb" }, { "eventID": "2", "eventVersion": "1.0", "dynamodb": { "OldImage": { "Message": { "S": "New item!" }, "Id": { "N": "101" } }, "SequenceNumber": "222", "Keys": { "Id": { "N": "101"

174

Page 181: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

} }, "SizeBytes": 59, "NewImage": { "Message": { "S": "This item has changed" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES" }, "awsRegion": "us-west-2", "eventName": "MODIFY", "eventSourceARN": sourcearn, "eventSource": "aws:dynamodb" }, { "eventID": "3", "eventVersion": "1.0", "dynamodb": { "Keys": { "Id": { "N": "101" } }, "SizeBytes": 38, "SequenceNumber": "333", "OldImage": { "Message": { "S": "This item has changed" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES" }, "awsRegion": "us-west-2", "eventName": "REMOVE", "eventSourceARN": sourcearn, "eventSource": "aws:dynamodb" } ]}

Amazon Cognito Sync トリガーのイベント例

{ "datasetName": "datasetName", "eventType": "SyncTrigger", "region": "us-east-1", "identityId": "identityId", "datasetRecords": { "SampleKey2": { "newValue": "newValue2", "oldValue": "oldValue2", "op": "replace" }, "SampleKey1": { "newValue": "newValue1", "oldValue": "oldValue1",

175

Page 182: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"op": "replace" } }, "identityPoolId": "identityPoolId", "version": 2}

Amazon Kinesis Data Streams のイベント例

"Records": [ { "eventID": "shardId-000000000000:49545115243490985018280067714973144582180062593244200961", "eventVersion": "1.0", "kinesis": { "partitionKey": "partitionKey-3", "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=", "kinesisSchemaVersion": "1.0", "sequenceNumber": "49545115243490985018280067714973144582180062593244200961" }, "invokeIdentityArn": identityarn, "eventName": "aws:kinesis:record", "eventSourceARN": eventsourcearn, "eventSource": "aws:kinesis", "awsRegion": "us-east-1" } ]}

Amazon S3 入力のイベント例

{ "Records": [ { "eventVersion": "2.0", "eventTime": "1970-01-01T00:00:00.000Z", "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "s3": { "configurationId": "testConfigRule", "object": { "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901", "key": "HappyFace.jpg", "size": 1024 }, "bucket": { "arn": bucketarn, "name": "sourcebucket", "ownerIdentity": { "principalId": "EXAMPLE" } }, "s3SchemaVersion": "1.0" }, "responseElements": { "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",

176

Page 183: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"x-amz-request-id": "EXAMPLE123456789" }, "awsRegion": "us-east-1", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "eventSource": "aws:s3" } ]}

Amazon S3 削除のイベント例

{ "Records": [ { "eventVersion": "2.0", "eventTime": "1970-01-01T00:00:00.000Z", "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "s3": { "configurationId": "testConfigRule", "object": { "sequencer": "0A1B2C3D4E5F678901", "key": "HappyFace.jpg" }, "bucket": { "arn": bucketarn, "name": "sourcebucket", "ownerIdentity": { "principalId": "EXAMPLE" } }, "s3SchemaVersion": "1.0" }, "responseElements": { "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH", "x-amz-request-id": "EXAMPLE123456789" }, "awsRegion": "us-east-1", "eventName": "ObjectRemoved:Delete", "userIdentity": { "principalId": "EXAMPLE" }, "eventSource": "aws:s3" } ]}

Amazon Lex のイベント例

{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook or DialogCodeHook", "userId": "user-id specified in the POST request to Amazon Lex.", "sessionAttributes": { "key1": "value1",

177

Page 184: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"key2": "value2", }, "bot": { "name": "bot-name", "alias": "bot-alias", "version": "bot-version" }, "outputDialogMode": "Text or Voice, based on ContentType request header in runtime API request", "currentIntent": { "name": "intent-name", "slots": { "slot-name": "value", "slot-name": "value", "slot-name": "value" }, "confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)" }}

API Gateway プロキシリクエストイベント

{ "path": "/test/hello", "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, lzma, sdch, br", "Accept-Language": "en-US,en;q=0.8", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-Country": "US", "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)", "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", "X-Forwarded-For": "192.168.100.1, 192.168.1.1", "X-Forwarded-Port": "443", "X-Forwarded-Proto": "https" }, "pathParameters": { "proxy": "hello" }, "requestContext": { "accountId": "123456789012", "resourceId": "us4z18", "stage": "test", "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9", "identity": { "cognitoIdentityPoolId": "", "accountId": "", "cognitoIdentityId": "", "caller": "", "apiKey": "", "sourceIp": "192.168.100.1", "cognitoAuthenticationType": "", "cognitoAuthenticationProvider": "", "userArn": "",

178

Page 185: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "user": "" }, "resourcePath": "/{proxy+}", "httpMethod": "GET", "apiId": "wt6mne2s9k" }, "resource": "/{proxy+}", "httpMethod": "GET", "queryStringParameters": { "name": "me" }, "stageVariables": { "stageVarName": "stageVarValue" }}

API Gateway プロキシレスポンスイベント

{ "statusCode": 200, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, lzma, sdch, br", "Accept-Language": "en-US,en;q=0.8", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-Country": "US", "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)", "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", "X-Forwarded-For": "192.168.100.1, 192.168.1.1", "X-Forwarded-Port": "443", "X-Forwarded-Proto": "https" }, "body": "Hello World"}

CloudFront イベント

{ "Records": [ { "cf": { "config": { "distributionId": "EDFDVBD6EXAMPLE" }, "request": { "clientIp": "2001:0db8:85a3:0:0:8a2e:0370:7334", "method": "GET", "uri": "/picture.jpg", "headers": { "host": [ {

179

Page 186: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"key": "Host", "value": "d111111abcdef8.cloudfront.net" } ], "user-agent": [ { "key": "User-Agent", "value": "curl/7.51.0" } ] } } } } ]}

AWS Config イベント

{ "invokingEvent": "{\"configurationItem\":{\"configurationItemCaptureTime\":\"2016-02-17T01:36:34.043Z\",\"awsAccountId\":\"000000000000\",\"configurationItemStatus\":\"OK\",\"resourceId\":\"i-00000000\",\"ARN\":\"arn:aws:ec2:us-east-1:000000000000:instance/i-00000000\",\"awsRegion\":\"us-east-1\",\"availabilityZone\":\"us-east-1a\",\"resourceType\":\"AWS::EC2::Instance\",\"tags\":{\"Foo\":\"Bar\"},\"relationships\":[{\"resourceId\":\"eipalloc-00000000\",\"resourceType\":\"AWS::EC2::EIP\",\"name\":\"Is attached to ElasticIp\"}],\"configuration\":{\"foo\":\"bar\"}},\"messageType\":\"ConfigurationItemChangeNotification\"}", "ruleParameters": "{\"myParameterKey\":\"myParameterValue\"}", "resultToken": "myResultToken", "eventLeftScope": false, "executionRoleArn": "arn:aws:iam::012345678912:role/config-role", "configRuleArn": "arn:aws:config:us-east-1:012345678912:config-rule/config-rule-0123456", "configRuleName": "change-triggered-config-rule", "configRuleId": "config-rule-0123456", "accountId": "012345678912", "version": "1.0"}

AWS IoT ボタンイベント

{ "serialNumber": "ABCDEFG12345", "clickType": "SINGLE", "batteryVoltage": "2000 mV"}

Kinesis Data Firehose イベント

{ "invocationId": "invoked123", "deliveryStreamArn": "aws:lambda:events", "region": "us-west-2", "records": [ { "data": "SGVsbG8gV29ybGQ=", "recordId": "record1",

180

Page 187: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサンプルイベントデータ

"approximateArrivalTimestamp": 1510772160000, "kinesisRecordMetadata": { "shardId": "shardId-000000000000", "partitionKey": "4d1ad2b9-24f8-4b9d-a088-76e9947c317a", "approximateArrivalTimestamp": "2012-04-23T18:25:43.511Z", "sequenceNumber": "49546986683135544286507457936321625675700192471156785154", "subsequenceNumber": "" } }, { "data": "SGVsbG8gV29ybGQ=", "recordId": "record2", "approximateArrivalTimestamp": 151077216000, "kinesisRecordMetadata": { "shardId": "shardId-000000000001", "partitionKey": "4d1ad2b9-24f8-4b9d-a088-76e9947c318a", "approximateArrivalTimestamp": "2012-04-23T19:25:43.511Z", "sequenceNumber": "49546986683135544286507457936321625675700192471156785155", "subsequenceNumber": "" } } ]}

181

Page 188: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon S3

AWS Lambda の使用方法の例AWS Lambda のユースケースは次のカテゴリに分類できます。

• AWS サービスをイベントソースとした AWS Lambda の使用 – イベントソースにより、Lambda 関数を呼び出すイベントが発行されます。Amazon S3 などの AWS サービスがこれに該当します。詳細およびチュートリアルについては、以下のトピックを参照してください。

AWS Lambda を Amazon S3 に使用する (p. 182)

Kinesis で AWS Lambda を使用する (p. 200)

Amazon DynamoDB で AWS Lambda を使用する (p. 211)

AWS CloudTrail で AWS Lambda を使用する (p. 224)

さまざまなアカウントから AWS Lambda を Amazon SNS で使用 (p. 239)• オンデマンドでの HTTPS 経由の Lambda 関数呼び出し (Amazon API Gateway) – イベントソースに

よる Lambda 関数呼び出しに加えて、HTTPS 経由で Lambda 関数を呼び出すこともできます。APIGateway を使用してカスタム REST API とエンドポイントを定義することで、これを行うことができます。詳細およびチュートリアルについては、「Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) (p. 245)」を参照してください。

• オンデマンドでの Lambda 関数呼び出し (カスタムアプリケーションを使用した独自のイベントソースのビルド) – クライアント、モバイル、またはウェブアプリケーションなどのユーザーアプリケーションが、AWS SDK または AWS Mobile SDK (AWS Mobile SDK for Android など) を使用して、イベントを発行して Lambda 関数を呼び出すことができます。詳細およびチュートリアルについては、「ご利用開始にあたって (p. 3)」および「モバイルアプリケーションのバックエンドとしての AWS Lambda の使用(カスタムイベントソース: Android) (p. 262)」を参照してください。

• 予定されているイベント – AWS Lambda コンソールを使用して、スケジュールに基づいて定期的にコードを呼び出すように AWS Lambda をセットアップすることもできます。固定の間隔を指定する (時間、日、曜日の数字) ことも、Cron 式を指定することもできます。詳細およびチュートリアルについては、「スケジュールされたイベントでの AWS Lambda の使用 (p. 275)」を参照してください。

加えて、Lambda ステートマシンも使用できます。詳細については、「ステートマシンを使用する」を参照してください。

AWS Lambda を Amazon S3 に使用するAmazon S3 は AWS Lambda にイベントを発行し (オブジェクトがバケット内に作成されたときなど)、パラメータとしてイベントデータを渡すことで Lambda 関数を呼び出すことができます。この統合により、Amazon S3 イベントを処理する Lambda 関数を記述できます。Amazon S3 で、Amazon S3 によって発行されるイベントのタイプと、呼び出す Lambda 関数を識別するバケット通知設定を追加します。

Amazon S3 と AWS Lambda 統合のしくみについては、以下の点に注意してください。

• ストリームベースではない (非同期の) モデル - これは、Amazon S3 がバケットをモニタリングし、パラメーターとしてイベントデータを渡すことで Lambda 関数を呼び出すモデルです (「イベントソースマッピング (p. 157)」を参照)。プッシュモデルでは、バケットの通知設定を使用して Amazon S3内にイベントソースマッピングを保持します。設定で、Amazon S3 がモニタリングするイベントのタイプと、Amazon S3 が呼び出す AWS Lambda 関数を指定します。詳細については、Amazon SimpleStorage Service 開発者ガイドのAmazon S3 イベント通知の設定を参照してください。

182

Page 189: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon S3

• 非同期呼び出し – AWS Lambda は、Event 呼び出しタイプ (非同期呼び出し) を使用して Lambda 関数を呼び出します。呼び出しタイプの詳細については、「呼び出しタイプ (p. 156)」を参照してください。

• イベント構造 - Lambda 関数が受け取るイベントは、単一のオブジェクトのものであり、バケット名、オブジェクトキー名などの情報を渡します。

エンドツーエンドのエクスペリエンスを設定するときは、以下の 2 タイプのアクセス権限ポリシーを使用します。

• Lambda 関数のアクセス権限 - Lambda 関数の呼び出し元にかかわらず、AWS Lambda は、Lambda 関数の作成時に指定された IAM ロール (実行ロール) を引き受けることで、その関数を実行します。このロールに関連付けられたアクセス権限ポリシーを使用して、Lambda 関数に必要なアクセス権限を付与します。たとえば、Lambda 関数にオブジェクトの読み取りが必要である場合は、アクセス権限ポリシーで、関連する Amazon S3 アクションのためのアクセス権限を付与します。詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

• Amazon S3 が Lambda 関数を呼び出すためのアクセス権限 - アクセス権限が付与されていない場合、Amazon S3 は Lambda 関数を呼び出すことはできません。Lambda 関数に関連付けられるアクセス権限ポリシーを使用して、このアクセス権限を付与します。

以下の図はフローをまとめたものです。

1. ユーザーが S3 バケットにオブジェクトをアップロードします (オブジェクト作成イベント)。2. Amazon S3 がオブジェクト作成イベントを検出します。3. Amazon S3 は、バケットの通知設定で指定されている Lambda 関数を呼び出します。4. AWS Lambda は、Lambda 関数の作成時に指定された実行ロールを引き受けることで、Lambda 関数を

実行します。5. Lambda 関数が実行されます。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: Amazon S3 での AWSLambda の使用 (p. 184)」を参照してください。

183

Page 190: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

チュートリアル: Amazon S3 での AWS Lambda の使用バケットにアップロードされる各画像 (.jpg および .png オブジェクト) のサムネイルを作成するとします。オブジェクトの作成時に Amazon S3 が呼び出すことができる Lambda 関数 (CreateThumbnail) を作成できます。その後、Lambda 関数は source バケットから画像オブジェクトを読み取り、ターゲットバケット (このチュートリアルでは sourceresized バケット) にサムネイル画像を作成できます。

Important

次のチュートリアルでは、ソース用に 1 つとターゲット用に 1 つの 2 つのバケットを使用していることを前提とします。ソースとターゲットに同じバケットを使用する場合、ソースバケットにアップロードされた各サムネイルは、別のオブジェクト作成イベントをトリガーし、これによりLambda 関数が再び呼び出されて不要な再帰が行われます。ただし、例例例バケット内にフォルダを作成してターゲットに一意のエンドポイントを作成することもできます。これを選択する場合には、次のサンプルに更新してください。

実装の要約次の図はアプリケーションフローを示しています。

1. ユーザーが Amazon S3 のソースバケットにオブジェクトをアップロードします (オブジェクト作成イベント)。

2. Amazon S3 がオブジェクト作成イベントを検出します。3. Amazon S3 は、Lambda 関数を呼び出してそのパラメータとしてイベントデータを渡すこと

で、s3:ObjectCreated:* イベントを AWS Lambda に発行します。4. AWS Lambda は、Lambda 関数の作成時に指定された実行ロールを引き受けることで、Lambda 関数を

実行します。5. 受け取ったイベントデータから、Lambda 関数はソースバケット名とオブジェクトキー名を知ることが

できます。Lambda 関数がオブジェクトを読み取り、グラフィックスライブラリを使用してサムネイルを作成し、それをターゲットバケットに保存します。

このチュートリアルを完了すると、アカウントで以下の Amazon S3、Lambda、および IAM リソースが作成されます。

184

Page 191: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Lambda の場合

• Lambda 関数。• Lambda 関数に関連付けられたアクセス権限ポリシー - このアクセス権限ポリシーを使用して、Lambda

関数を呼び出すためのアクセス権限を Amazon S3 に付与します。また、特定の AWS アカウントによって所有される特定のバケットからオブジェクト作成イベントに対してのみ、Amazon S3 が Lambda 関数を呼び出せるように、アクセス権限を制限します。

Note

AWS アカウントでバケットと他のいくつかの AWS アカウントを削除し、後に同じ名前のバケットを作成することが可能です。他の条件により、Amazon S3 が特定の AWS アカウントによって所有される特定のバケットからオブジェクト作成イベントを検出した場合のみ、AmazonS3 が Lambda 関数を呼び出すようにできます。

IAM の場合

• 管理者ユーザー - adminuser と呼ばれます。AWS アカウントのルート認証情報の使用はお勧めできません。このチュートリアルでは、代わりに adminuser の認証情報を使用してステップを実行します。

Note

adminuser プロファイルをまだ作成していない場合は、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

• IAM ロール (実行ロール) - このロールに関連付けられたアクセス権限ポリシーを使用して、Lambda 関数に必要なアクセス権限を付与します。

Amazon S3 の場合

• source と sourceresized という名前の 2 つのバケット。source はプレースホルダー名であり、実際のバケット名に置き換える必要があります。たとえば、ソースとして example という名前のバケットがある場合、ターゲットバケットとして exampleresized を作成します。

• ソースバケットの通知設定 - Amazon S3 が AWS Lambda に発行し、Lambda 関数が呼び出すイベントのタイプ (オブジェクト作成イベント) を識別する通知設定を、ソースバケットに追加します。Amazon

185

Page 192: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

S3 通知機能の詳細については、『Amazon Simple Storage Service 開発者ガイド』の「バケットイベントの通知の設定」を参照してください。

これで、チュートリアルを開始する準備ができました。最初の準備の後、チュートリアルは 2 つのメインセクションに分割される点に注意してください。

• 最初に、必要なセットアップ手順を完了して Lambda 関数を作成し、Amazon S3 サンプルイベントデータを使用してその関数を手動で呼び出します。この中間テストにより、関数が機能することが確認されます。

• 次に、オブジェクト作成イベントを検出したときに、Amazon S3 が Lambda 関数を呼び出すことができるように、ソースバケットに通知設定を追加します。

次のステップステップ 1: 準備 (p. 186)

ステップ 1: 準備このセクションでは、以下の作業を行います。

• AWS アカウントにサインアップし、AWS CLI を設定します。• 2 つのバケット (source と sourceresized) を作成し、ソースバケットにサンプルの .jpg オブジェク

ト (HappyFace.jpg) を格納します。詳細については、以下の手順を参照してください。

ステップ 1.1: AWS にサインアップし、AWS CLI を設定する

次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

• AWS CLI をインストールしてセットアップした。手順については、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

ステップ 1.2: バケットを作成しサンプルオブジェクトをアップロードする

バケットを作成し、オブジェクトをアップロードするための手順を行います。

Important

ソースバケットと Lambda 関数の両方が同じ AWS リージョンに存在する必要があります。さらに、Lambda 関数に使用されるコード例でも、同じリージョンに両方のバケットがあるとします。このチュートリアルでは、us-west-2 リージョンを使用します。

1. IAM ユーザーのサインイン URL を使用して、Amazon S3 コンソールに adminuser としてサインインします。

2. バケットを 2 つ作成します。ターゲットバケット名は、source とその後に resized を連結したものになる必要があります。ここで、source は、ソースに使用するバケットの名前です。たとえば、mybucket と mybucketresized です。

詳細な手順については、『Amazon Simple Storage Service 入門ガイド』の「バケットの作成」を参照してください。

3. ソースバケットで、.jpg オブジェクトの HappyFace.jpg をアップロードします。

186

Page 193: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Lambda 関数を手動で呼び出すときは、Amazon S3 に接続する前に、ソースバケットと新しく作成されるオブジェクト (HappyFace.jpg) を指定するサンプルイベントデータをその関数に渡します。そのため、最初にこのサンプルオブジェクトを作成する必要があります。

次のステップ

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用) (p. 187)

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用)このセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。

Note

他の Lambda 関数の呼び出しなど、関数内で他の AWS サービスを使用するその他の例については、「AWS SDK for JavaScript」を参照してください。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

• デプロイパッケージをアップロードすることで Lambda 関数を作成したら、サンプル Amazon S3 イベントデータを使用してその関数を手動で呼び出すことでテストします。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 187)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 194)• ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 195)

ステップ 2.1: デプロイパッケージを作成する

[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

Node.js

デプロイパッケージは、Lambda 関数のコードと依存関係を含む .zip ファイルです。

1. フォルダ (examplefolder) を作成してから、サブフォルダ (node_modules) を作成します。2. Node.js プラットフォームをインストールします。詳細については、Node.js のウェブサイトを参照し

てください。3. 依存関係をインストールします。コード例では、以下のライブラリを使用します。

• Node.js 内の AWS SDK for JavaScript• gm (node.js の GraphicsMagick)• 非同期ユーティリティモジュール

AWS Lambda ランタイムには Node.js に AWS SDK for JavaScript がすでにあるため、他のライブラリをインストールする必要があります。コマンドプロンプトを開き、examplefolder に移動し、npm コマンドを使用して Node.js の一部であるライブラリをインストールします。

187

Page 194: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

npm install async gm

4. テキストエディターを開き、次のコードをコピーします。

// dependenciesvar async = require('async');var AWS = require('aws-sdk');var gm = require('gm') .subClass({ imageMagick: true }); // Enable ImageMagick integration.var util = require('util');

// constantsvar MAX_WIDTH = 100;var MAX_HEIGHT = 100;

// get reference to S3 client var s3 = new AWS.S3(); exports.handler = function(event, context, callback) { // Read options from the event. console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); var srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters. var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); var dstBucket = srcBucket + "resized"; var dstKey = "resized-" + srcKey;

// Sanity check: validate that source and destination are different buckets. if (srcBucket == dstBucket) { callback("Source and destination buckets are the same."); return; }

// Infer the image type. var typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { callback("Could not determine the image type."); return; } var imageType = typeMatch[1]; if (imageType != "jpg" && imageType != "png") { callback('Unsupported image type: ${imageType}'); return; }

// Download the image from S3, transform, and upload to a different S3 bucket. async.waterfall([ function download(next) { // Download the image from S3 into a buffer. s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function transform(response, next) { gm(response.Body).size(function(err, size) { // Infer the scaling factor to avoid stretching the image unnaturally. var scalingFactor = Math.min( MAX_WIDTH / size.width, MAX_HEIGHT / size.height );

188

Page 195: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

var width = scalingFactor * size.width; var height = scalingFactor * size.height;

// Transform the image buffer in memory. this.resize(width, height) .toBuffer(imageType, function(err, buffer) { if (err) { next(err); } else { next(null, response.ContentType, buffer); } }); }); }, function upload(contentType, data, next) { // Stream the transformed image to a different S3 bucket. s3.putObject({ Bucket: dstBucket, Key: dstKey, Body: data, ContentType: contentType }, next); } ], function (err) { if (err) { console.error( 'Unable to resize ' + srcBucket + '/' + srcKey + ' and upload to ' + dstBucket + '/' + dstKey + ' due to an error: ' + err ); } else { console.log( 'Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey ); }

callback(null, "message"); } );};

Note

コードサンプルは、Node.js ランタイム v6.10 または v4.3 に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

5. 前述のコードを確認し、以下の点に注意します。

• 関数は、パラメータとして受信するイベントデータから、ソースバケット名とオブジェクトのキー名を知ることができます。オブジェクトが .jpg の場合、コードではサムネイルが作成され、ターゲットバケットに保存されます。

• コードでは、ターゲットバケットが存在し、ソースバケット名の後に文字列 resized を連結したものがそのバケット名になっているとします。たとえば、イベントデータで特定されたソースバケットが examplebucket の場合、コードでは examplebucketresized 宛先バケットがあると想定されます。

• 作成されるサムネイルについて、コードでは、文字列 resized- の後にソースオブジェクトキー名を連結したものをそのキー名として生成します。たとえば、ソースオブジェクトキーがsample.jpg の場合、コードではキー resized-sample.jpg があるサムネイルオブジェクトが作成されます。

189

Page 196: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

6. ファイルを CreateThumbnail.js として examplefolder に保存します。この手順を完了すると、以下のようなフォルダー構造になります。

CreateThumbnail.js/node_modules/gm/node_modules/async

7. CreateThumbnail.js ファイルと node_modules フォルダを CreateThumbnail.zip という名前でZIP 圧縮します。

これが Lambda 関数デプロイパッケージです。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 194)

Java

以下に示すのは、受信する Amazon S3 イベントを読み取り、サムネイルを作成する Java コードの例です。この例では、aws-lambda-java-core ライブラリに用意された RequestHandler インターフェイスを実装しています。したがって、Lambda 関数を作成するときは、クラスをハンドラー(example.S3EventProcessorCreateThumbnail) として指定します。インターフェイスを使用したハンドラーの提供の詳細については、「ハンドラー作成用に事前定義されているインターフェイスの利用(Java) (p. 43)」を参照してください。

ハンドラーが入力型として使用する S3Event 型は、受信する Amazon S3 イベントから簡単に情報を読み取るためのメソッドを提供する、aws-lambda-java-events ライブラリの定義済みクラスの 1 つです。このハンドラーは出力として文字列を返します。

package example;

import java.awt.Color;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLDecoder;import java.util.regex.Matcher;import java.util.regex.Pattern;

import javax.imageio.ImageIO;

import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.events.S3Event;import com.amazonaws.services.s3.AmazonS3;import com.amazonaws.services.s3.AmazonS3Client;import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;import com.amazonaws.services.s3.model.GetObjectRequest;import com.amazonaws.services.s3.model.ObjectMetadata;import com.amazonaws.services.s3.model.S3Object;

public class S3EventProcessorCreateThumbnail implements RequestHandler<S3Event, String> { private static final float MAX_WIDTH = 100; private static final float MAX_HEIGHT = 100; private final String JPG_TYPE = (String) "jpg";

190

Page 197: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

private final String JPG_MIME = (String) "image/jpeg"; private final String PNG_TYPE = (String) "png"; private final String PNG_MIME = (String) "image/png";

public String handleRequest(S3Event s3event, Context context) { try { S3EventNotificationRecord record = s3event.getRecords().get(0);

String srcBucket = record.getS3().getBucket().getName(); // Object key may have spaces or unicode non-ASCII characters. String srcKey = record.getS3().getObject().getKey() .replace('+', ' '); srcKey = URLDecoder.decode(srcKey, "UTF-8");

String dstBucket = srcBucket + "resized"; String dstKey = "resized-" + srcKey;

// Sanity check: validate that source and destination are different // buckets. if (srcBucket.equals(dstBucket)) { System.out .println("Destination bucket must not match source bucket."); return ""; }

// Infer the image type. Matcher matcher = Pattern.compile(".*\\.([^\\.]*)").matcher(srcKey); if (!matcher.matches()) { System.out.println("Unable to infer image type for key " + srcKey); return ""; } String imageType = matcher.group(1); if (!(JPG_TYPE.equals(imageType)) && !(PNG_TYPE.equals(imageType))) { System.out.println("Skipping non-image " + srcKey); return ""; }

// Download the image from S3 into a stream AmazonS3 s3Client = new AmazonS3Client(); S3Object s3Object = s3Client.getObject(new GetObjectRequest( srcBucket, srcKey)); InputStream objectData = s3Object.getObjectContent();

// Read the source image BufferedImage srcImage = ImageIO.read(objectData); int srcHeight = srcImage.getHeight(); int srcWidth = srcImage.getWidth(); // Infer the scaling factor to avoid stretching the image // unnaturally float scalingFactor = Math.min(MAX_WIDTH / srcWidth, MAX_HEIGHT / srcHeight); int width = (int) (scalingFactor * srcWidth); int height = (int) (scalingFactor * srcHeight);

BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = resizedImage.createGraphics(); // Fill with white before applying semi-transparent (alpha) images g.setPaint(Color.white); g.fillRect(0, 0, width, height); // Simple bilinear resize // If you want higher quality algorithms, check this link: // https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

191

Page 198: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(srcImage, 0, 0, width, height, null); g.dispose();

// Re-encode image to target format ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(resizedImage, imageType, os); InputStream is = new ByteArrayInputStream(os.toByteArray()); // Set Content-Length and Content-Type ObjectMetadata meta = new ObjectMetadata(); meta.setContentLength(os.size()); if (JPG_TYPE.equals(imageType)) { meta.setContentType(JPG_MIME); } if (PNG_TYPE.equals(imageType)) { meta.setContentType(PNG_MIME); }

// Uploading to S3 destination bucket System.out.println("Writing to: " + dstBucket + "/" + dstKey); s3Client.putObject(dstBucket, dstKey, is, meta); System.out.println("Successfully resized " + srcBucket + "/" + srcKey + " and uploaded to " + dstBucket + "/" + dstKey); return "Ok"; } catch (IOException e) { throw new RuntimeException(e); } }}

Amazon S3 は Event 呼び出しタイプを使用して Lambda 関数を呼び出します。ここで、AWS Lambdaはコードを非同期に実行します。戻り値は重要ではありません。ただし、この場合、戻り値の型の指定を必要とするインターフェイスを実装するため、この例ではハンドラーは戻り値として String を使用します。

前述のコード (S3EventProcessorCreateThumbnail.java という名前のファイル) を使用して、デプロイパッケージを作成します。必ず次の依存関係を追加してください。

• aws-lambda-java-core

• aws-lambda-java-events

これらは、aws-lambda-java-libs に掲載されています。

詳細については、「Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)」を参照してください。

デプロイパッケージは、.zip ファイルまたはスタンドアロン .jar とすることができます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。Maven ビルドツールを使用してスタンドアロン .jar を作成する方法の例については、「IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)」および「Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)」を参照してください。Gradle ビルドツールを使用して .zip ファイルを作成する方法の例については、「.zip デプロイパッケージの作成 (Java) (p. 102)」を参照してください。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 194)

192

Page 199: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Python

このセクションでは、Python 関数の例を作成し、依存関係をインストールします。コードサンプルはPython ランタイムのバージョン 3.6 または 2.7 に準拠しています。このステップでは 3.6 ランタイムを前提としていますが、どちらも使用できます。

1. テキストエディターを開き、次のコードをコピーします。以下のように、このコードはサイズ変更したイメージを同じイメージ名で異なるバケットにアップロードします。

source-bucket/image.png -> source-bucketresized/image.png

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_functionimport boto3import osimport sysimport uuidfrom PIL import Imageimport PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] download_path = '/tmp/{}{}'.format(uuid.uuid4(), key) upload_path = '/tmp/resized-{}'.format(key) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}resized'.format(bucket), key)

2. CreateThumbnail.py という名前でファイルを保存します。3. ソースコードがローカルホストにある場合は、それをコピーします。

scp -i key.pem /path/to/my_code.py ec2-user@public-ip-address:~/CreateThumbnail.py

4. SSH を使用して 64 ビット Amazon Linux インスタンスに接続します。

ssh -i key.pem ec2-user@public-ip-address

5. 次のステップに従って Python 3.6 と virtualenv をインストールします。

1. sudo yum install -y gcc zlib zlib-devel openssl openssl-devel2. wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz3. tar -xzvf Python-3.6.1.tgz4. cd Python-3.6.1 && ./configure && make5. sudo make install6. sudo /usr/local/bin/pip3 install virtualenv

193

Page 200: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

6. pip3 を介してインストールされた仮想環境を選択します。

/usr/local/bin/virtualenv ~/shrink_venv

source ~/shrink_venv/bin/activate

7. 仮想環境にライブラリをインストールします

pip install Pillow

pip install boto3

Note

AWS Lambda には、Python 向けの AWS SDK (Boto 3) が含まれるため、デプロイパッケージに含める必要はありませんが、ローカルテストのためにオプションで含めることはできます。

8. lib および lib64 サイトパッケージの内容を .zip ファイルに追加します。次のステップは、Pythonランタイムバージョン 3.6 を使用していた前提であることに注意してください。バージョン 2.7 を使用していた場合は更新する必要があります。

cd $VIRTUAL_ENV/lib/python3.6/site-packages

zip -r9 ~/CreateThumbnail.zip *

Note

非表示のファイルをすべて含めるには、zip -r9 ~/CreateThumbnail.zip オプションを使用します。

9. .zip ファイルに Python コードを追加します。

cd ~

zip -g CreateThumbnail.zip CreateThumbnail.py

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 194)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このセクションでは、以下に示す定義済みのロールタイプとアクセス権限ポリシーを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

• ロールにアタッチする AWSLambdaExecute アクセス権限ポリシー。• Amazon S3 バケットにオブジェクトを追加するアクセス権限を割り当てるカスタムポリシーを追加しま

す。詳細については、『IAM ユーザーガイド』の「AWS のサービスにアクセス許可を委任するロールの作成」を参照して IAM ロール (実行ロール) を作成してください。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

194

Page 201: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

2. [Create role] を選択します。3. [信頼されたエンティティの種類を選択] で [AWS サービス] を選択し、続いて [Lambda] を選択しま

す。これにより、アカウントで Lambda 関数機能が AWS サービスを呼び出すことが可能になります。

4. [Next: Permissions] (次へ: アクセス権限) を選択します。5. [Filter: Policy type] (フィルタ: ポリシータイプ) で [AWSLambdaExecute] と入力し、[次へ: レビュー]

を選択します。6. [ロール名*] では、AWS アカウント内で一意のロール名 ([lambda-s3-execution-role] など) を入力し、

[ロールの作成] を選択します。7. 作成したサービスロールを開きます。8. [アクセス許可] タブで [インラインポリシーの追加] を選択します。9. [サービス] で [サービスの選択] を選択します。10. [以下のサービスを選択してください] で [S3] を選択します。11. [アクション] で [アクションの選択] を選択します。12. [アクセスレベルグループ] で [書き込み] を展開し、[PutObject] を選択します。13. [リソース] を選択し、[すべて] チェックボックスを選択します。14. [ポリシーの確認] を選択します。15. [名前*] を入力し、[ポリシーの作成] を選択します。ポリシーの仕様を書き留めます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::*/*" } ]}

16. ロールの [概要] で [ロールの ARN] を書き留めます。これは、次のステップで Lambda 関数を作成するときに必要になります。

次のステップ

ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 195)

ステップ 2.3: Lambda 関数を作成し、手動でテストする

このセクションでは、以下の作業を行います。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数を手動で呼び出し、パラメータとしてサンプル Amazon S3 イベントデータを渡すこと

で、この関数をテストします。

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードします。

1. コマンドプロンプトで、--profile として adminuser を使用して、以下の Lambda AWSCLI create-function コマンドを実行します。この設定の詳細については、「AWS CLI の設定」を参照してください。このコマンドは、.zip ファイルのパスと実行ロールの ARN に実

195

Page 202: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

際の値を指定して更新する必要があります。ランタイムパラメータには、デプロイパッケージを作成したときに選択したコードサンプルによって、nodejs8.10、nodejs6.10 またはnodejs4.3、python3.6、python2.7 または java8 のいずれかを選択します。

$ aws lambda create-function \--region region \--function-name CreateThumbnail \--zip-file fileb://file-path/CreateThumbnail.zip \--role role-arn \--handler CreateThumbnail.handler \--runtime runtime \--profile adminuser \--timeout 10 \--memory-size 1024

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

2. 関数の ARN を書き留めます。通知設定を Amazon S3 バケットに追加するときは、以下のセクションでこれが必要になります。

3. (オプション)、前述のコマンドは、関数の設定として 10 秒のタイムアウト値を指定します。アップロードするオブジェクトのサイズに応じて、次の AWS CLI コマンドを使用してタイムアウトの値を増やす必要が生じる場合があります。

$ aws lambda update-function-configuration \ --function-name CreateThumbnail \ --region region \ --timeout timeout-in-seconds \ --profile adminuser

Note

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソール UI で同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

このステップでは、サンプル Amazon S3 イベントデータを使用して、手動で Lambda 関数を呼び出します。AWS マネジメントコンソール または AWS CLI を使用して関数をテストできます。

Lambda 関数をテストする (コンソール)

1. 「開始方法」の手順に従って、Lambda 関数を作成して呼び出します (「Lambda 関数を手動で呼び出し、結果、ログ、メトリクスを確認する (p. 12)」を参照)。テスト用のサンプルイベントとして、[Sample event template] で [S3 Put] を選択します。

2. サムネイルがターゲットバケットに作成されたことを確認し、以下のように AWS Lambda コンソールで Lambda 関数のアクティビティをモニタリングします。

• AWS Lambda コンソールでは、関数の [Cloudwatch Metrics at a glance] セクションで、一部のCloudWatch メトリクスのグラフィカル表現が表示されます。

• 各グラフについて、[logs] リンクをクリックして、CloudWatch Logs ログを直接表示することもできます。

196

Page 203: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Lambda 関数をテストする (AWS CLI)

1. 以下の Amazon S3 サンプルイベントデータを inputFile.txt ファイルに保存します。JSON を実際の sourcebucket 名と .jpg オブジェクトキーで更新する必要があります。

{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"sourcebucket", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::sourcebucket" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ]}

2. 次の Lambda CLI invoke コマンドを実行して関数を呼び出します。コマンドは非同期実行をリクエストします。オプションで、invocation-type パラメータ値として RequestResponse を指定することで、このコマンドを同期的に呼び出すこともできます。

$ aws lambda invoke \--invocation-type Event \--function-name CreateThumbnail \--region region \--payload file://file-path/inputfile.txt \--profile adminuser \outputfile.txt

Note

この関数を呼び出すことができるのは、関数を呼び出すために独自の認証情報を使用しているためです。次のセクションでは、ユーザーに代わってこの関数を呼び出すように AmazonS3 を設定します。そのためには、関数を呼び出すための Amazon S3 アクセス権限を付与す

197

Page 204: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

る Lambda 関数に関連付けられたアクセスポリシーに、アクセス権限を追加する必要があります。

3. サムネイルがターゲットバケットに作成されたことを確認し、以下のように AWS Lambda コンソールで Lambda 関数のアクティビティをモニタリングします。

• AWS Lambda コンソールでは、関数の [Cloudwatch Metrics at a glance] セクションで、一部のCloudWatch メトリクスのグラフィカル表現が表示されます。

• 各グラフについて、[logs] リンクをクリックして、CloudWatch Logs ログを直接表示することもできます。

次のステップ

ステップ 3: イベントソースを追加する (イベントを発行するように Amazon S3 を設定する) (p. 198)

ステップ 3: イベントソースを追加する (イベントを発行するように Amazon S3 を設定する)このステップでは、残りの設定を追加し、Amazon S3 がオブジェクト作成イベントを AWS Lambda に発行し、Lambda 関数を呼び出せるようにします。このステップでは、以下の作業を行います。

• Lambda 関数のアクセスポリシーに、この関数の呼び出しを Amazon S3 に許可するアクセス権限を追加します。

• 通知設定をソースバケットに追加します。通知設定で、以下の項目を指定します。• Amazon S3 がイベントを発行するイベントタイプ。このチュートリアルで

は、s3:ObjectCreated:* イベントタイプを指定し、オブジェクトが作成されたときに Amazon S3がイベントを発行するようにします。

• 呼び出す Lambda 関数。

ステップ 3.1: Lambda 関数のアクセス権限ポリシーにアクセス権限を追加する

1. 以下の Lambda CLI add-permission コマンドを実行して、Amazon S3 サービスプリンシパル(s3.amazonaws.com) に lambda:InvokeFunction アクションを実行するためのアクセス権限を付与します。次の条件を満たす場合にのみ関数を呼び出すアクセス権限が Amazon S3 に付与されることに注意してください。

• オブジェクト作成イベントが、特定のバケットで検出されます。• バケットは、特定の AWS アカウントによって所有されます。バケット所有者がバケットを削除し

た場合、他の一部の AWS アカウントは同じ名前でバケットを作成できます。この状態により、特定の AWS アカウントのみが Lambda 関数を実行できるようになります。

$ aws lambda add-permission \--function-name CreateThumbnail \--region region \--statement-id some-unique-id \--action "lambda:InvokeFunction" \--principal s3.amazonaws.com \--source-arn arn:aws:s3:::sourcebucket \--source-account bucket-owner-account-id \--profile adminuser

2. AWS CLI get-policy コマンドを呼び出すことで、関数のアクセスポリシーを確認します。

$ aws lambda get-policy \--function-name function-name \

198

Page 205: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

--profile adminuser

ステップ 3.2: バケットの通知を設定するオブジェクト作成イベントを Lambda に発行するよう Amazon S3 にリクエストするため、ソースバケットで通知設定を追加します。設定で、次のように指定します。

• イベントタイプ - このチュートリアルでは、ObjectCreated (All) Amazon S3 イベントタイプを選択します。

• Lambda 関数 - これは Amazon S3 が呼び出す Lambda 関数です。

バケットに通知設定を追加する方法については、Amazon Simple Storage Service コンソールユーザーガイドのイベント通知の有効化を参照してください。

ステップ 3.3: セットアップのテストすべて完了しました。これで adminuser は次のように設定をテストできます。

1. Amazon S3 コンソールを使って、.jpg または .png オブジェクトをソースバケットにアップロードします。

2. CreateThumbnail 関数を使用してサムネイルがターゲットバケットに作成されたことを確認します。3. adminuser は CloudWatch Logs を確認することもできます。Lambda 関数のアクティビティは、AWS

Lambda コンソールでモニタリングできます。たとえば、関数が CloudWatch Logs に書き込んだログを含めて、ログを表示するには、コンソールで [logs] リンクを選択します。

ステップ 4: AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

Amazon S3 サムネイルアプリケーションの仕様このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、以前作成した ZIP パッケージの隣に保存します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources:

199

Page 206: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドKinesis

CreateThumbnail: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime Timeout: 60 Policies: AWSLambdaExecute Events: CreateThumbnailEvent: Type: S3 Properties: Bucket: !Ref SrcBucket Events: s3:ObjectCreated:*

SrcBucket: Type: AWS::S3::Bucket

サーバーレスアプリケーションのデプロイ

パッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

Kinesis で AWS Lambda を使用するウェブサイトのクリックストリーム、金融取引、ソーシャルメディアフィード、IT ログ、場所追跡イベントなど、何十万ものソースから送られてくる 1 時間あたり何テラバイトにもなるデータを連続的に取得し格納する Kinesis ストリームを作成できます。詳細については、Kinesisを参照してください。

Lambda 関数をサブスクライブして、Kinesis ストリームからレコードのバッチを自動的に読み取り、ストリームでレコードを検出した場合にそれを処理できます。この場合、AWS Lambda は新しいレコードを検出するために定期的 (1 秒に 1 回) にストリームをポーリングします。

Kinesis と AWS Lambda の連携動作については、以下の点に注意してください。

• ストリームベースモデル – これは、AWS Lambda がストリームをポーリングし、新しいレコードを検出すると、新しいレコードをパラメーターとして渡して Lambda 関数を呼び出すモデル (「イベントソースマッピング (p. 157)」を参照) です。

ストリームベースモデルでは、AWS Lambda にイベントソースマッピングを維持します。イベントソースマッピングには、ストリームから Lambda 関数へのマッピングが記述されています。AWS Lambda では、マッピングの作成に使用できる API (CreateEventSourceMapping (p. 420)) が提供されています。イベントソースマッピングは、AWS Lambda コンソールを使用して作成することもできます。

• 同期呼び出し – AWS Lambda は、ストリームをポーリングし、RequestResponse 呼び出しタイプ (同期呼び出し) を使用して Lambda 関数を呼び出します。呼び出しタイプの詳細については、「呼び出しタイプ (p. 156)」を参照してください。

• イベント構造 – Lambda 関数が受け取るイベントは、AWS Lambda によってストリームから読み取られたレコードの集合です。イベントソースマッピングを設定する際に指定するバッチサイズは、Lambda関数の呼び出しごとに受け取るレコードの最大数です。

Lambda 関数の呼び出し元と関係なく、ユーザーの代わりに常に AWS Lambda が Lambda 関数を実行します。Lambda 関数で AWS リソースにアクセスする必要がある場合は、それらのリソースにアクセスするためのアクセス権限を付与する必要があります。AWS Lambda に、Kinesis ストリームをポーリングするアクセス権限も付与する必要があります。AWS Lambda がストリームをポーリングし、ユーザーの代わりに Lambda 関数を実行するために使用できるアクセス権限をすべて IAM ロール (実行ロール) に付与します。このロールを作成した後、Lambda 関数の作成時にこのロールを有効にします。詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

200

Page 207: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次の図はアプリケーションフローを示しています。

1. カスタムアプリケーションがストリームにレコードを書き込みます。2. AWS Lambda はストリームをポーリングし、ストリームで新しいレコードを検出すると Lambda 関数

を呼び出します。3. AWS Lambda は、Lambda 関数の作成時に指定した実行ロールを引き受けることにより、Lambda 関数

を実行します。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: Kinesis で AWS Lambdaを使用する (p. 201)」を参照してください。

チュートリアル: Kinesis で AWS Lambdaを使用するこのチュートリアルでは、Kinesis ストリームからのイベントを処理する Lambda 関数を作成します。

このチュートリアルは大きく 2 つのセクションに分かれています。

• 最初に、必要な設定を実行して Lambda 関数を作成し、サンプルイベントデータを使用して (Kinesis ストリームは不要)、その関数を手動で呼び出してテストします。

• 次に、Kinesis ストリーム (イベントソース) を作成します。Lambda 関数をストリームに関連付けるイベントソースマッピングを AWS Lambda に追加します。AWS Lambda がストリームのポーリングを開始します。ユーザーは Kinesis API を使用してストリームにテストレコードを追加し、AWS Lambda によって Lambda 関数を実行されていることを確認します。

Important

Lambda 関数と Kinesis ストリームの両方が同じ AWS リージョンに存在する必要があります。このチュートリアルでは、これらのリソースが us-west-2 リージョンで作成されることを前提としています。

このチュートリアルでは、AWS Command Line Interface を使用して、Lambda 関数の作成、ストリームのAWS Lambda作成、ストリームへのレコードの追加、などの操作を実行します。Kinesis ストリームを作成する前に、AWS Lambda コンソールを使用して関数を手動で呼び出します。コンソール UI で、戻り値とログを確認します。

次のステップステップ 1: 準備 (p. 201)

ステップ 1: 準備次の手順を完了していることを確認してください。

201

Page 208: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

• AWS CLI をインストールしてセットアップした。手順については、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

次のステップ

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用) (p. 202)

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用)このセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。Kinesis イベントを処理するために使用する Lambda 関数のサンプルコードが、さまざまな言語で提供されています。いずれかの言語を選択し、該当する手順に従ってデプロイパッケージを作成します。

Note

他の Lambda 関数の呼び出しなど、関数内で他の AWS サービスを使用するその他の例については、「AWS SDK for JavaScript」を参照してください。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

• デプロイパッケージをアップロードして Lambda 関数を作成し、サンプルの Kinesis イベントデータを使用し、その関数を手動で呼び出してテストします。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 202)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)• ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 206)

ステップ 2.1: デプロイパッケージを作成する

[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

Node.js

Kinesis イベントレコードを入力として受け取ってそれを処理する Node.js コードの例を以下に示します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

console.log('Loading function');

exports.handler = function(event, context, callback) { //console.log(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { // Kinesis data is base64 encoded so decode here

202

Page 209: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

var payload = new Buffer(record.kinesis.data, 'base64').toString('ascii'); console.log('Decoded payload:', payload); }); callback(null, "message");};

Note

コードサンプルは、Node.js ランタイム v6.10 または v4.3 に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. ProcessKinesisRecords.js という名前でファイルを保存します。3. ProcessKinesisRecords.js ファイルを ProcessKinesisRecords.zip という名前で ZIP 圧縮

します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)

Java

Kinesis イベントレコードデータを入力として受け取ってそれを処理する Java コードの例を以下に示します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

コードでは、recordHandler はハンドラーです。このハンドラーは、定義済みの KinesisEvent クラスを使用します。このクラスは aws-lambda-java-events ライブラリで定義されています。

package example;

import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.events.KinesisEvent;import com.amazonaws.services.lambda.runtime.events.KinesisEvent.KinesisEventRecord;

public class ProcessKinesisEvents implements RequestHandler<KinesisEvent, Void>{@Overridepublic Void handleRequest(KinesisEvent event, Context context){for(KinesisEventRecord rec : event.getRecords()) {System.out.println(new String(rec.getKinesis().getData().array()));}return null;}}

ハンドラーが例外をスローせずに正常に戻った場合、Lambda はレコードの入力バッチが正しく処理されたと見なし、ストリーム内の新しいレコードの読み取りを開始します。ハンドラーによって例外がスローされる場合、Lambda はレコードの入力バッチが処理されていないと見なし、レコードの同じバッチで関数を再度呼び出します。

前述のコード (ProcessKinesisEvents.java という名前のファイル) を使用して、デプロイパッケージを作成します。必ず次の依存関係を追加してください。

• aws-lambda-java-core

• aws-lambda-java-events

詳細については、「Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)」を参照してください。

203

Page 210: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

デプロイパッケージは、.zip ファイルまたはスタンドアロン .jar とすることができます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。Maven ビルドツールを使用してスタンドアロン .jar を作成する方法の例については、「IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)」および「Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)」を参照してください。Gradle ビルドツールを使用して .zip ファイルを作成する方法の例については、「.zip デプロイパッケージの作成 (Java) (p. 102)」を参照してください。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)

C#

Kinesis イベントレコードデータを入力として受け取ってそれを処理する C# コードの例を以下に示します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

コードでは、HandleKinesisRecord はハンドラーです。このハンドラーは、定義済みのKinesisEvent クラスを使用します。このクラスは Amazon.Lambda.KinesisEvents ライブラリで定義されています。

using System;using System.IO;using System.Text; using Amazon.Lambda.Core;using Amazon.Lambda.KinesisEvents; namespace KinesisStreams{ public class KinesisSample { [LambdaSerializer(typeof(JsonSerializer))] public void HandleKinesisRecord(KinesisEvent kinesisEvent) { Console.WriteLine($"Beginning to process {kinesisEvent.Records.Count} records..."); foreach (var record in kinesisEvent.Records) { Console.WriteLine($"Event ID: {record.EventId}"); Console.WriteLine($"Event Name: {record.EventName}"); string recordData = GetRecordContents(record.Kinesis); Console.WriteLine($"Record Data:"); Console.WriteLine(recordData); } Console.WriteLine("Stream processing complete."); } private string GetRecordContents(KinesisEvent.Record streamRecord) { using (var reader = new StreamReader(streamRecord.Data, Encoding.ASCII)) { return reader.ReadToEnd(); } } }}

204

Page 211: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

デプロイパッケージを作成するには、.NET Core CLI (p. 87) で概要が説明されているステップに従います。この点で、.NET プロジェクトを作成した後、以下の点に注意してください。

• デフォルトの Program.cs ファイルを、ProcessingKinesisEvents.cs のように任意のファイル名に変更します。

• 名前を変更した Program.cs ファイルのデフォルトコンテンツを上の例のコードに置き換えます。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)

Python

Kinesis イベントレコードデータを入力として受け取ってそれを処理する Python コードの例を以下に示します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

手順に従って、AWS Lambda 関数デプロイパッケージを作成します。

1. テキストエディターを開き、次のコードをコピーします。

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_function#import jsonimport base64def lambda_handler(event, context): for record in event['Records']: #Kinesis data is base64 encoded so decode here payload=base64.b64decode(record["kinesis"]["data"]) print("Decoded payload: " + str(payload))

2. ProcessKinesisRecords.py という名前でファイルを保存します。3. ProcessKinesisRecords.py ファイルを ProcessKinesisRecords.zip という名前で ZIP 圧縮

します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)

Go

Kinesis イベントレコードデータを入力として受け取ってそれを処理する Go コードの例を以下に示します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

手順に従って、AWS Lambda 関数デプロイパッケージを作成します。

1. テキストエディターを開き、次のコードをコピーします。

import ( "strings" "github.com/aws/aws-lambda-go/events”

205

Page 212: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

)

func handler(ctx context.Context, kinesisEvent events.KinesisEvent) { for _, record := range kinesisEvent.Records { kinesisRecord := record.Kinesis dataBytes := kinesisRecordData.Data dataText := string(dataBytes)

fmt.Printf("%s Data = %s \n", record.EventName, dataText) }}

2. ProcessKinesisRecords.go という名前でファイルを保存します。3. ProcessKinesisRecords.go ファイルを ProcessKinesisRecords.zip という名前で ZIP 圧縮

します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 206)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このセクションでは、以下に示す定義済みのロールタイプとアクセスポリシーを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

• AWSLambdaKinesisExecutionRole – これは、ロールにアタッチするアクセス権限ポリシーです。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (たとえば、lambda-kinesis-execution-role) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で [AWSLambdaKinesisExecutionRole] を選択します。このチュートリアルのLambda 関数では、このポリシーでのアクセス権限で十分です。

3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になります。

次のステップ

ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 206)

ステップ 2.3: Lambda 関数を作成し、手動でテストする

このセクションでは、以下の作業を行います。

206

Page 213: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数を手動で呼び出してテストします。イベントソースを作成する代わりに、サンプルの

Kinesis イベントデータを使用します。

次のセクションでは、Kinesis ストリームを作成し、エンドツーエンドエクスペリエンスをテストします。

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードします。

コマンドプロンプトで、adminuser プロファイルを使用して、次の Lambda CLI コマンド create-function を実行します。この設定の詳細については、「AWS CLI の設定」を参照してください。

このコマンドは、.zip ファイルのパスと実行ロールの ARN に実際の値を指定して更新する必要があります。--runtime のパラメータ値には、コードの記述に使用した言語に応じて、python3.6、python2.7、nodejs8.10、nodejs6.10、nodejs4.3、または java8 のいずれかを指定します。

$ aws lambda create-function \--region region \--function-name ProcessKinesisRecords \--zip-file fileb://file-path/ProcessKinesisRecords.zip \--role execution-role-arn \--handler handler \--runtime runtime-value \--profile adminuser

Java の場合、--handler パラメーター値は example.ProcessKinesisRecords::recordHandlerです。Node.js の場合は ProcessKinesisRecords.handler、Python の場合はProcessKinesisRecords.lambda_handler です。

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソール UI で同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

サンプルの Kinesis イベントデータを使用して手動で関数を呼び出します。コンソールを使用して関数を呼び出すことをお勧めします。コンソールには、実行の要約、コードによって書き込まれたログ、関数が返した結果など、実行の結果を確認しやすい UI が用意されているためです (これは、コンソールが常に同期実行を行う、つまり RequestResponse 呼び出しタイプを使用して Lambda 関数を呼び出すからです)。

Lambda 関数をテストする (コンソール)

1. 「開始方法」の手順に従って、Lambda 関数を作成して呼び出します (「Lambda 関数を手動で呼び出し、結果、ログ、メトリクスを確認する (p. 12)」を参照)。テスト用のサンプルイベントとして、[Sample event template] で [Kinesis] を選択します。

2. コンソールで結果を確認します。

207

Page 214: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Lambda 関数をテストする (AWS CLI)

1. 以下の JSON をファイルにコピーし、input.txt という名前で保存します。

{ "Records": [ { "kinesis": { "partitionKey": "partitionKey-3", "kinesisSchemaVersion": "1.0", "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=", "sequenceNumber": "49545115243490985018280067714973144582180062593244200961" }, "eventSource": "aws:kinesis", "eventID": "shardId-000000000000:49545115243490985018280067714973144582180062593244200961", "invokeIdentityArn": "arn:aws:iam::account-id:role/testLEBRole", "eventVersion": "1.0", "eventName": "aws:kinesis:record", "eventSourceARN": "arn:aws:kinesis:us-west-2:35667example:stream/examplestream", "awsRegion": "us-west-2" } ]}

2. 次の invoke コマンドを実行します。

$ aws lambda invoke \--invocation-type Event \--function-name ProcessKinesisRecords \--region region \--payload file://file-path/input.txt \--profile adminuser outputfile.txt

Note

このチュートリアルの例では、メッセージは outputfile.txt ファイルに保存されます。同期実行 (呼び出しタイプが RequestResponse) をリクエストした場合、その関数は応答の本文で文字列メッセージを返します。Node.js の場合は、次のいずれかです (コード内で指定している)。context.succeed("message")context.fail("message")context.done(null, "message)Python または Java の場合は、戻りステートメント内のメッセージです。return "message"

次のステップ

ステップ 3: イベントソースを追加する (Kinesis ストリームを作成し、それを Lambda 関数と関連付ける) (p. 208)

ステップ 3: イベントソースを追加する (Kinesis ストリームを作成し、それを Lambda 関数と関連付ける)このセクションでは、Kinesis ストリームを作成し、AWS Lambda でイベントソースを追加して、Kinesisストリームを Lambda 関数と関連付けます。

208

Page 215: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

イベントソースを作成すると、AWS Lambda はストリームのポーリングを開始します。次に、ストリームにイベントを追加して設定をテストし、AWS Lambda がユーザーの代わりに Lambda 関数を実行したことを確認します。

ステップ 3.1: Kinesis ストリームを作成する次の Kinesis create-stream CLI コマンドを使用してストリームを作成します。

$ aws kinesis create-stream \--stream-name examplestream \--shard-count 1 \--region region \--profile adminuser

次の Kinesis describe-stream AWS CLI コマンドを実行して、ストリーム ARN を取得します。

$ aws kinesis describe-stream \--stream-name examplestream \--region region \--profile adminuser

ARN は、ストリームと Lambda 関数を関連付けるために次のステップで必要になります。ストリームは次の形式です。

arn:aws:kinesis:aws-region:account-id:stream/stream-name

ステップ 3.2: AWS Lambda でイベントソースを追加する次の AWS CLI add-event-source コマンドを実行します。コマンドを実行したら、UUID を書き留めてください。この UUID は、コマンドでイベントソースを参照する場合 (イベントソースを削除するときなど) に必要になります。

$ aws lambda create-event-source-mapping \--region region \--function-name ProcessKinesisRecords \--event-source kinesis-stream-arn \--batch-size 100 \--starting-position TRIM_HORIZON \--profile adminuser

次のコマンドを実行して、イベントソースマッピングのリストを取得できます。

$ aws lambda list-event-source-mappings \--region region \--function-name ProcessKinesisRecords \--event-source kinesis-stream-arn \--profile adminuser \--debug

レスポンスでは、ステータス値が enabled であることを確認できます。Note

イベントソースマッピングを無効にすると、AWS Lambda は Kinesis ストリームのポーリングを停止します。イベントソースマッピングを再度有効化すると、停止時のシーケンス番号からポーリングが再開されるため、マッピングを無効にする前に、各レコードはマッピングを無効にする前または有効にした後のいずれかで処理されます。シーケンス番号が TRIM_HORIZON になっている場合は、再度有効にしたときに TRIM_HORIZON からポーリングが開始されます。た

209

Page 216: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

だし、新しいイベントソースマッピングを作成した場合は、指定した開始位置に応じて、常にTRIM_HORIZON、LATEST または AT_TIMESTAMP からポーリングが開始されます。これは、イベントソースマッピングを削除した後に、それと同じ設定で新しいマッピングを作成した場合にも適用されます。

ステップ 3.3: セットアップのテストすべて完了しました。これで adminuser は次のように設定をテストできます。

1. 次の AWS CLI コマンドを使用して、イベントレコードを Kinesis ストリームに追加します。--data の値は、"Hello, this is a test." 文字列を base64 形式でエンコードした値です。同じコマンドを複数回実行して、複数のレコードをストリームに追加することができます。

$ aws kinesis put-record \--stream-name examplestream \--data "This is a test. final" \--partition-key shardId-000000000000 \--region region \--profile adminuser

2. AWS Lambda は、ストリームをポーリングし、ストリームの更新を検出すると、ストリームからのイベントデータを渡して Lambda 関数を呼び出します。

AWS Lambda では、実行ロールがストリームをポーリングすることが想定されます。必要な Kinesisアクション用のアクセス権限をロールに付与しているため、AWS Lambda はストリームをポーリングし、ストリームからイベントを読み取ることができます。

3. 関数が実行され、Amazon CloudWatch の Lambda 関数に対応するロググループにログが追加されます。

adminuser は、Amazon CloudWatch コンソールで報告されたログを確認することもできます。必ず、Lambda 関数を作成したのと同じ AWS リージョンでログを確認します。

ステップ 4: AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

Kinesis アプリケーションの仕様このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、以前作成した ZIP パッケージの隣に保存します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

210

Page 217: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon DynamoDB

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: ProcessKinesisRecords: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime Policies: AWSLambdaKinesisExecutionRole Events: Stream: Type: Kinesis Properties: Stream: !GetAtt ExampleStream.Arn BatchSize: 100 StartingPosition: TRIM_HORIZON

ExampleStream: Type: AWS::Kinesis::Stream Properties: ShardCount: 1

サーバーレスアプリケーションのデプロイ

パッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

Amazon DynamoDB で AWS Lambda を使用するAmazon DynamoDB テーブルに対して、Lambda 関数をトリガーとして使用できます。トリガーは、DynamoDB テーブルに対して行われた更新に応じて行うカスタムアクションです。トリガーを作成するには、まずテーブルに対して Amazon DynamoDB Streams を有効にします。次に、ストリームに対して発行する更新を処理する Lambda 関数を記述します。

Amazon DynamoDB と AWS Lambda の連携動作については、以下の点に注意してください。

• ストリームベースモデル – これは、AWS Lambda がストリームを 1 秒間に 4 回のレートでポーリングし、新しいレコードを検出すると、更新イベントをパラメータとして渡して Lambda 関数を呼び出すモデル (「イベントソースマッピング (p. 157)」を参照) です。

ストリームベースモデルでは、AWS Lambda にイベントソースマッピングを維持します。イベントソースマッピングには、ストリームから Lambda 関数へのマッピングが記述されています。AWS Lambda では、マッピングを作成するための API (CreateEventSourceMapping (p. 420)) が提供されています。イベントソースマッピングは、AWS Lambda コンソールを使用して作成することもできます。

• 同期呼び出し – AWS Lambda は、RequestResponse 呼び出しタイプ (同期呼び出し) を使用してLambda 関数を呼び出します。呼び出しタイプの詳細については、「呼び出しタイプ (p. 156)」を参照してください。

• イベント構造 – Lambda 関数が受け取るイベントは、AWS Lambda がストリームから読み取るテーブル更新情報です。イベントソースマッピングを設定する際に指定するバッチサイズは、Lambda 関数の呼び出しごとに受け取るレコードの最大数です。

Lambda 関数の呼び出し元と関係なく、ユーザーの代わりに常に AWS Lambda が Lambda 関数を実行します。Lambda 関数で AWS リソースにアクセスする必要がある場合は、それらのリソースにアクセスするためのアクセス権限を付与する必要があります。AWS Lambda に、DynamoDB ストリームをポーリングするアクセス権限も付与する必要があります。AWS Lambda がストリームをポーリングし、ユーザーの代わりに Lambda 関数を実行するために使用できるアクセス権限をすべて IAM ロール (実行ロール) に付

211

Page 218: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

与します。このロールを作成した後、Lambda 関数の作成時にこのロールを有効にします。詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

次の図はアプリケーションフローを示しています。

1. カスタムアプリケーションによって DynamoDB テーブルが更新されます。2. Amazon DynamoDB は項目の更新をストリームに発行します。3. AWS Lambda はストリームをポーリングし、ストリームで新しいレコードを検出すると Lambda 関数

を呼び出します。4. AWS Lambda は、Lambda 関数の作成時に指定した実行ロールを引き受けることにより、Lambda 関数

を実行します。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: Amazon DynamoDB でAWS Lambdaを使用する (p. 212)」を参照してください。

チュートリアル: Amazon DynamoDB で AWS Lambdaを使用するこのチュートリアルでは、DynamoDB ストリームからのイベントを処理する Lambda 関数を作成します。

このチュートリアルは大きく 2 つのセクションに分かれています。

• 最初に、必要なセットアップを実行して Lambda 関数を作成し、サンプルイベントデータを使用して、その関数を手動で呼び出してテストします。

• 次に、ストリーム対応の DynamoDB テーブルを作成し、AWS Lambda でイベントソースのマッピングを追加して、ストリームを Lambda 関数と関連付けます。AWS Lambda はストリームのポーリングを開始します。次に、エンドツーエンドのセットアップをテストします。テーブルから項目を作成、更新、および削除する際に、Amazon DynamoDB はストリームにレコードを書き込みます。AWS Lambda はストリームのポーリングの際に新しいレコードを検出すると、ユーザーに代わって Lambda 関数を実行します。

Important

Lambda 関数と DynamoDB ストリームの両方が同じ AWS リージョンに存在する必要があります。このチュートリアルでは、これらのリソースが us-east-1 リージョンで作成されることを前提としています。

このチュートリアルでは、AWS Command Line Interface を使用して、Lambda 関数の作成、ストリームのAWS Lambda作成、ストリームへのレコードの追加、などの操作を実行します。DynamoDB ストリームを作成する前に、AWS Lambda コンソールを使用して関数を手動で呼び出します。コンソール UI で、戻り値とログを確認します。

212

Page 219: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次のステップステップ 1: 準備 (p. 213)

ステップ 1: 準備次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、以下を参照してください。AWS アカウントのセットアップ (p. 4)

• AWS CLI をインストールしてセットアップした。手順については、以下を参照してください。AWSCommand Line Interface のセットアップ (AWS CLI) (p. 6)

次のステップステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用) (p. 213)

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用)このセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。DynamoDBイベントを処理するために使用する Lambda 関数のサンプルコードが、さまざまな言語で提供されています。いずれかの言語を選択し、該当する手順に従ってデプロイパッケージを作成します。

Note

他の Lambda 関数の呼び出しなど、関数内で他の AWS サービスを使用するその他の例については、「AWS SDK for JavaScript」を参照してください。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。たとえば、AWS Lambda は DynamoDB アクション用のアクセス権限を必要とするため、ストリームをポーリングし、ストリームからレコードを読み取ることができます。プルモデルでは、Lambda 関数を呼び出すためのアクセス権限を AWS Lambda にも付与する必要があります。例のLambda 関数は、一部のイベントデータを CloudWatch に書き込むため、必要な CloudWatch アクション用のアクセス権限を必要とします。

• デプロイパッケージをアップロードして Lambda 関数を作成し、サンプルの DynamoDB イベントデータを使用し、その関数を手動で呼び出してテストします。Lambda 関数を作成するときに、デプロイパッケージと IAM ロールの両方を提供します。また、関数名、メモリサイズ、使用するランタイム環境、ハンドラーなどその他の設定情報も指定できます。 これらのパラメータの詳細については、CreateFunction (p. 425)を参照してください。 Lambda 関数を作成した後、サンプルの AmazonDynamoDB イベントデータを使用してそれを呼び出します。

トピック• ステップ 2.1: Lambda 関数デプロイパッケージを作成する (p. 213)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)• ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 218)

ステップ 2.1: Lambda 関数デプロイパッケージを作成する[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

213

Page 220: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Node.js

1. テキストエディターを開き、次のコードをコピーします。

console.log('Loading function');

exports.lambda_handler = function(event, context, callback) { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { console.log(record.eventID); console.log(record.eventName); console.log('DynamoDB Record: %j', record.dynamodb); }); callback(null, "message");};

Note

コードサンプルは、Node.js ランタイム v4.3 以降に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. ProcessDynamoDBStream.js という名前でファイルを保存します。3. ProcessDynamoDBStream.js ファイルを ProcessDynamoDBStream.zip という名前で ZIP 圧

縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)

Java

次のコードで、handleRequest は AWS Lambda が呼び出し、イベントデータを提供するハンドラーです。このハンドラーは、定義済みの DynamodbEvent クラスを使用します。このクラスは aws-lambda-java-events ライブラリで定義されています。

package example;

import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.services.lambda.runtime.LambdaLogger;import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord;

public class DDBEventProcessor implements RequestHandler<DynamodbEvent, String> { public String handleRequest(DynamodbEvent ddbEvent, Context context) { for (DynamodbStreamRecord record : ddbEvent.getRecords()){ System.out.println(record.getEventID()); System.out.println(record.getEventName()); System.out.println(record.getDynamodb().toString()); } return "Successfully processed " + ddbEvent.getRecords().size() + " records."; }}

ハンドラーが例外をスローせずに正常に戻った場合、Lambda はレコードの入力バッチが正しく処理されたと見なし、ストリーム内の新しいレコードの読み取りを開始します。ハンドラーによって例外がスローされる場合、Lambda はレコードの入力バッチが処理されていないと見なし、レコードの同じバッチで関数を再度呼び出します。

214

Page 221: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

前述のコード (DDBEventProcessor.java という名前のファイル) を使用して、デプロイパッケージを作成します。必ず次の依存関係を追加してください。

• aws-lambda-java-core

• aws-lambda-java-events

詳細については、「Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)」を参照してください。

デプロイパッケージは、.zip ファイルまたはスタンドアロン .jar とすることができます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。Maven ビルドツールを使用してスタンドアロン .jar を作成する方法の例については、「IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)」および「Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)」を参照してください。Gradle ビルドツールを使用して .zip ファイルを作成する方法の例については、「.zip デプロイパッケージの作成 (Java) (p. 102)」を参照してください。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)

C#

次のコードで、ProcessDynamoEvent は AWS Lambda が呼び出し、イベントデータを提供するハンドラーです。このハンドラーは、定義済みの DynamoDbEvent クラスを使用します。このクラスはAmazon.Lambda.DynamoDBEvents ライブラリで定義されています。

using System;using System.IO;using System.Text;using Amazon.Lambda.Core;using Amazon.Lambda.DynamoDBEvents; using Amazon.Lambda.Serialization.Json; namespace DynamoDBStreams{ public class DdbSample { private static readonly JsonSerializer _jsonSerializer = new JsonSerializer(); public void ProcessDynamoEvent(DynamoDBEvent dynamoEvent) { Console.WriteLine($"Beginning to process {dynamoEvent.Records.Count} records..."); foreach (var record in dynamoEvent.Records) { Console.WriteLine($"Event ID: {record.EventID}"); Console.WriteLine($"Event Name: {record.EventName}"); string streamRecordJson = SerializeObject(record.Dynamodb); Console.WriteLine($"DynamoDB Record:"); Console.WriteLine(streamRecordJson); } Console.WriteLine("Stream processing complete."); }

215

Page 222: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

private string SerializeObject(object streamRecord) { using (var ms = new MemoryStream()) { _jsonSerializer.Serialize(streamRecord, ms); return Encoding.UTF8.GetString(ms.ToArray()); } } }}

デプロイパッケージを作成するには、.NET Core CLI (p. 87) で概要が説明されているステップに従います。この点で、.NET プロジェクトを作成した後、以下の点に注意してください。

• デフォルトの Program.cs ファイルを、ProcessingDynamoDBStreams.cs のように任意のファイル名に変更します。

• 名前を変更した Program.cs ファイルのデフォルトコンテンツを上の例のコードに置き換えます。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)

Python

1. テキストエディターを開き、次のコードをコピーします。

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_function

def lambda_handler(event, context): for record in event['Records']: print(record['eventID']) print(record['eventName']) print('Successfully processed %s records.' % str(len(event['Records'])))

2. ProcessDynamoDBStream.py という名前でファイルを保存します。3. ProcessDynamoDBStream.py ファイルを ProcessDynamoDBStream.zip という名前で ZIP 圧

縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)

Go

1. テキストエディターを開き、次のコードをコピーします。

import ( "strings"

"github.com/aws/aws-lambda-go/events"

216

Page 223: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

)

func handleRequest(ctx context.Context, e events.DynamoDBEvent) {

for _, record := range e.Records { fmt.Printf("Processing request data for event ID %s, type %s.\n", record.EventID, record.EventName)

// Print new values for attributes of type String for name, value := range record.DynamoDB.NewImage { if value.DataType() == events.DataTypeString { fmt.Printf("Attribute name: %s, value: %s\n", name, value.String()) } } }}

2. ProcessDynamoDBStream.go という名前でファイルを保存します。3. ProcessDynamoDBStream.go ファイルを ProcessDynamoDBStream.zip という名前で ZIP 圧

縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 217)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このセクションでは、以下に示す定義済みのロールタイプとアクセスポリシーを使用して IAM ロールを作成します。

• [Lambda] タイプの AWS サービスロール – このロールはその他の AWS サービスを呼び出す AWSLambda のアクセス権限を付与します。

• [AWSLambdaDynamoDBExecutionRole] - これには、Lambda の基本的な実行ポリシー引数にアタッチする DynamoDB アクセス権限ポリシーおよび Lambda 関数アカウントで相互作用する 2 つのサービスが含まれます。

IAM ロールに関する詳細は、『IAM ユーザーガイド』の「IAM ロール」、そして『IAM ユーザーガイド』の「AWS のサービスにアクセス許可を委任するロールの作成」で IAM ロール (実行ロール) を作成する手順を参照してください。

この演習で IAM ロール (実行ロール) を作成するには、次を実行します。

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. [Roles] を選択します。3. [Create role] を選択します。4. [信頼されたエンティティの種類を選択] で [AWS サービス] を選択し、続いて [Lambda] を選択しま

す。これにより、アカウントで Lambda 関数機能が AWS サービスを呼び出すことが可能になります。

5. [Next: Permissions] (次へ: アクセス権限) を選択します。6. [Filter: Policy type] (フィルタ: ポリシータイプ) で [AWSLambdaDynamoDBExecutionRole] と入力し、

[次へ: レビュー] を選択します。7. [ロール名*] では、AWS アカウント内で一意のロール名 ([lambda-dynamodb-execution-role] など) を

入力し、[ロールの作成] を選択します。8. ロールの [概要] で [ロールの ARN] (Amazon リソースネーム) を書き留めます。次のステップで

Lambda 関数を作成するときに、この値を適用します。

217

Page 224: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次のステップ

ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 218)

ステップ 2.3: Lambda 関数を作成し、手動でテストするこのセクションでは、以下の作業を行います。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数を手動で呼び出してテストします。イベントソースを作成する代わりに、サンプルの

DynamoDB イベントデータを使用します。

次のセクションでは、DynamoDB ストリームを作成し、エンドツーエンドエクスペリエンスをテストします。

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードします。

コマンドプロンプトで、adminuser プロファイルを使用して、次の Lambda CLI コマンド create-function を実行します。このプロファイルをすでに作成している場合は、「AWS アカウントのセットアップ (p. 4)」を参照してください。

このコマンドは、.zip ファイルのパスと実行ロールの ARN に実際の値を指定して更新する必要があります。--runtime のパラメータ値には、コードの記述に使用した言語に応じて、python3.6、python2.7、nodejs8.10、nodejs6.10 または nodejs4.3、または java8 のいずれかを指定します。

$ aws lambda create-function \--region us-east-1 \--function-name ProcessDynamoDBStream \--zip-file fileb://file-path/ProcessDynamoDBStream.zip \--role role-arn \--handler ProcessDynamoDBStream.lambda_handler \--runtime runtime-value \--profile adminuser

Note

ランタイムとして Java 8 を選択している場合、ハンドラー値はpackageName::methodNameある必要があります。

詳細については、「CreateFunction (p. 425)」を参照してください。AWS Lambda は関数を作成し、関数の設定情報を返します。

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

このセットアップでは、AWS Lambda の CLI コマンド invoke と次のサンプル DynamoDB イベントを使用して、Lambda 関数を手動で呼び出します。

1. 以下の JSON をファイルにコピーし、input.txt という名前で保存します。

{ "Records":[

218

Page 225: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

{ "eventID":"1", "eventName":"INSERT", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"111", "SizeBytes":26, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"2", "eventName":"MODIFY", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"222", "SizeBytes":59, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"3", "eventName":"REMOVE", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1",

219

Page 226: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

"dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "SequenceNumber":"333", "SizeBytes":38, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" } ]}

2. 次の invoke コマンドを実行します。

$ aws lambda invoke \--invocation-type RequestResponse \--function-name ProcessDynamoDBStream \--region us-east-1 \--payload file://file-path/input.txt \--profile adminuser \outputfile.txt

invoke コマンドでは、呼び出しタイプとして、同期実行をリクエストする RequestResponse を指定します。詳細については、「Invoke (p. 463)」を参照してください。この関数はレスポンス本文で文字列メッセージ (コードの context.succeed() のメッセージ) を返します。

3. outputfile.txt ファイルで出力を確認します。

Lambda 関数のアクティビティは、AWS Lambda コンソールでモニタリングできます。

• AWS Lambda コンソールでは、関数の [Cloudwatch Metrics at a glance] セクションで、一部の CloudWatch メトリクスのグラフィカル表現が表示されます。AWS マネジメントコンソール(https://console.aws.amazon.com/) にサインインします。

• 各グラフについて、[logs] リンクをクリックすると、CloudWatch ログを直接表示できます。

次のステップ

ステップ 3: イベントソースを追加する (DynamoDB ストリームを作成し、それを Lambda 関数と関連付ける) (p. 220)

ステップ 3: イベントソースを追加する (DynamoDB ストリームを作成し、それを Lambda 関数と関連付ける)このセクションでは、以下の作業を行います。

• ストリームが有効になった Amazon DynamoDB テーブルを作成します。• AWS Lambda でイベントソースマッピングを作成します。このイベントソースのマッピング

は、DynamoDB ストリームを Lambda関数と関連付けます。このイベントソースのマッピングを作成すると、AWS Lambda はストリームのポーリングを開始します。

220

Page 227: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• エンドツーエンドエクスペリエンスをテストします。テーブルの更新を実行すると、DynamoDB はイベントレコードをストリームに書き込みます。ストリームをポーリングしている AWS Lambda は、ストリームで新しいレコードを検出し、イベントを Lambda 関数に渡して、ユーザーに代わって関数を実行します。

Note

次の例では、管理者権限を持つユーザー (adminuser) が存在することを前提としています。それらの手順に従うときは、adminuser という名前のユーザーを作成します。

自分用の IAM ユーザーを作成し、そのユーザーを管理者グループに追加するには

1. AWS アカウント E メールアドレスとパスワードを使用して https://console.aws.amazon.com/iam/で AWS アカウントのルートユーザー として IAM コンソールにサインインします。

Note

以下の管管管 IAM ユーザーの使用に関するベストプラクティスに従い、ルートユーザー認証情報を安全な場所に保管しておくことを強くお勧めします。ルートユーザーとしてサインインして、少数のアカウントおよびサービス管理タスクのみを実行します。

2. コンソールのナビゲーションペインで、[Users] を選択後、[Add user] を選択します。3. [User name] に、Administrator と入力します。4. [AWS マネジメントコンソール access] の横のチェックボックスをオンにし、[Custom password]

を選択して、新しいユーザーのパスワードをテキストボックスに入力します。オプションとして[Require password reset] (パスワードのリセットの強制) を選択し、ユーザーが次回サインインしたときに新しいパスワードを作成することを強制できます。

5. [Next: Permissions] を選択します。6. [Set permissions for user] ページで、[Add user to group] を選択します。7. [Create group] を選択します。8. [Create group] ダイアログボックスに、Administrators と入力します。9. [Filter] で、[Job function] を選択します。10. ポリシーリストで、[AdministratorAccess] のチェックボックスをオンにします。次に、[Create

group] を選択します。11. グループのリストに戻り、新しいグループのチェックボックスをオンにします。必要に応じて

[Refresh] を選択し、リスト内のグループを表示します。12. [Next: Review] を選択して、新しいユーザーに追加するグループメンバーシップのリストを表示し

ます。続行する準備ができたら、[Create user] を選択します。

この同じプロセスを繰り返して新しいグループとユーザーを作成し、AWS アカウントのリソースへのアクセス権をユーザーに付与できます。ポリシーを使用して特定の AWS リソースに対するユーザーのアクセス権限を制限する方法については、「アクセス管理」と「ポリシーの例」を参照してください。

ステップ 3.1: ストリームが有効になった DynamoDB テーブルを作成する

ストリームとともにテーブルを作成する手順に従います。

1. AWS マネジメントコンソール にサインインし、DynamoDB コンソール (https://console.aws.amazon.com/dynamodb/) を開きます。

2. DynamoDB コンソールで、ストリームを有効にしてテーブルを作成します。ストリームの有効化の詳細については、「DynamoDB Streams を使用したテーブルアクティビティのキャプチャ」を参照してください。

221

Page 228: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Important

DynamoDB テーブルは、Lambda 関数を作成したのと同じリージョンで作成する必要があります。このチュートリアルでは、米国東部(バージニア北部) リージョンであることを前提としています。さらに、テーブルと Lambda 関数の両方が、同じ AWS アカウントに属している必要があります。

3. ストリーム ARN をメモします。次のセクションでストリームを Lambda 関数と関連付ける際に、これが必要になります。

ステップ 3.2: AWS Lambda でイベントソースを追加する

次の AWS CLI create-event-source-mapping コマンドを実行します。コマンドを実行したら、UUIDを書き留めてください。この UUID は、イベントソースマッピングを削除するときなど、コマンドでイベントソースマッピングを参照する場合に必要になります。

$ aws lambda create-event-source-mapping \--region us-east-1 \--function-name ProcessDynamoDBStream \--event-source DynamoDB-stream-arn \--batch-size 100 \--starting-position TRIM_HORIZON \--profile adminuser

Note

これにより、指定された DynamoDB ストリームと Lambda 関数の間にマッピングが作成されます。DynamoDB ストリームを複数の Lambda 関数と関連付け、同じ Lambda 関数を複数のストリームと関連付けることができます。ただし、Lambda 関数は、共有するストリーム用に、読み取りスループットを共有します。

次のコマンドを実行して、イベントソースのマッピングのリストを取得できます。

$ aws lambda list-event-source-mappings \--region us-east-1 \--function-name ProcessDynamoDBStream \--event-source DynamoDB-stream-arn \--profile adminuser

このリストでは、作成済みのすべてのイベントソースのマッピングが返され、各マッピングに対してLastProcessingResult などが示されます。問題がある場合、このフィールドは情報メッセージを提供するために使用されます。No records processed (AWS Lambda がポーリングを開始していないか、ストリームにレコードがないことを示す) や、OK (AWS Lambda がストリームから正常にレコードを読み取り、Lambda 関数を呼び出したことを示す) など値は、問題がないことを示しています。問題がある場合は、エラーメッセージが返されます。

ステップ 3.3: セットアップのテスト

すべて完了しました。これで adminuser は次のように設定をテストできます。

1. DynamoDB コンソールで、テーブルに項目を追加、更新、削除します。DynamoDB はストリームにこれらのアクションのレコードを書き込みます。

2. AWS Lambda は、ストリームをポーリングし、ストリームの更新を検出すると、ストリームで見つかったイベントデータを渡して Lambda 関数を呼び出します。

3. 関数が実行され、Amazon CloudWatch でログが作成されます。adminuser は、Amazon CloudWatch コンソールで報告されたログを確認することもできます。

222

Page 229: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

ステップ 4: AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

DynamoDB アプリケーションの仕様

このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、以前作成した ZIP パッケージの隣に保存します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: ProcessDynamoDBStream: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime Policies: AWSLambdaDynamoDBExecutionRole Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON

DynamoDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 StreamSpecification: StreamViewType: NEW_IMAGE

223

Page 230: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS CloudTrail

サーバーレスアプリケーションのデプロイ

パッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

AWS CloudTrail で AWS Lambda を使用するAWS アカウントで CloudTrail を有効にして、アカウントでの API 呼び出しと関連イベントの履歴のログを取得できます。CloudTrail では、すべての API アクセスイベントが、CloudTrail を有効にするときに指定した Amazon S3 バケットのオブジェクトとして記録されます。

Amazon S3 のバケット通知機能を利用して、Amazon S3 がオブジェクト作成イベントを AWS Lambdaに発行するように指示できます。CloudTrail が S3 バケットにログを書き込むごとに、Amazon S3 はAmazon S3 のオブジェクト作成イベントをパラメーターとして Lambda 関数を呼び出すことができます。その S3 イベントでは、CloudTrail で作成されたログオブジェクトのバケット名とキー名などの情報が提供されます。Lambda 関数のコードで、ログオブジェクトを読み取り、CloudTrail でログ記録されたアクセスレコードを処理できます。たとえば、アカウントで特定の API 呼び出しが行われた場合に通知するための Lambda 関数のコードを記述できます。

このシナリオでは、S3 バケットにアクセスログを書き込みできるように、CloudTrail を有効にします。AWS Lambda については Amazon S3 がイベントソースであるため、Amazon S3 が AWS Lambda にイベントを発行して Lambda 関数を呼び出します。

Note

Amazon S3 でサポートできるイベント送信先は、1 つだけです。

Amazon S3 をイベントソースとして設定する方法の詳細については、「AWS Lambda を Amazon S3 に使用する (p. 182)」を参照してください。

以下の図はフローをまとめたものです。

1. AWS CloudTrail はログを S3 バケットに保存します (オブジェクト作成イベント)。2. Amazon S3 がオブジェクト作成イベントを検出します。3. Amazon S3 は、バケットの通知設定で指定されている Lambda 関数を呼び出すことによっ

て、s3:ObjectCreated:* イベントを AWS Lambda に発行します。Lambda 関数のアクセス権限ポリシーには Amazon S3 がその関数を呼び出すための権限が含まれているため、Amazon S3 はその関数を呼び出すことができます。

224

Page 231: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

4. AWS Lambda は、Lambda 関数の作成時に指定された実行ロールを引き受けることで、Lambda 関数を実行します。

5. Lambda 関数は、パラメーターとして受け取った Amazon S3 イベントを読み取り、CloudTrail オブジェクトの場所を判別し、CloudTrail オブジェクトを読み取り、CloudTrail オブジェクト内のログレコードを処理します。

6. 特定の eventType と eventSource の値が含まれるレコードがログにある場合、イベントをAmazon SNS トピックに発行します。「チュートリアル: AWS CloudTrail で AWS Lambdaを使用する (p. 225)」では、E メールプロトコルを使用して SNS トピックにサブスクライブしているため、Eメール通知がユーザーに送信されます。

シナリオの例を説明しているチュートリアルについては、「チュートリアル: AWS CloudTrail で AWSLambdaを使用する (p. 225)」を参照してください。

チュートリアル: AWS CloudTrail で AWS Lambdaを使用するAWS アカウントに対して AWS CloudTrail を有効にしていて、アカウントで行われた AWS API の呼び出しのレコード (ログ) が維持され、SNS トピックを作成する API 呼び出しが行われると通知を受信するようになっているとします。アカウントで API 呼び出しが行われると、CloudTrail は、設定されているAmazon S3 バケットにログを書き込みます。このシナリオでは、CloudTrail によってログオブジェクトが作成されると、Amazon S3 がオブジェクト作成イベントを AWS Lambda に発行して Lambda 関数を呼び出すようにします。

Amazon S3は Lambda 関数を実行する際に、CloudTrail によって作成されたオブジェクトのバケット名とキー名を識別する S3 イベントを渡します。Lambda 関数はログオブジェクトを読み取り、そのログで報告されている API 呼び出しを知ることができます。

CloudTrail によって S3 バケットに作成される各オブジェクトは、1 つ以上のイベントレコードを持つJSON オブジェクトです。特に、各レコードは eventSource と eventName を提供します。

{ "Records":[ { "eventVersion":"1.02", "userIdentity":{ ... }, "eventTime":"2014-12-16T19:17:43Z", "eventSource":"sns.amazonaws.com", "eventName":"CreateTopic", "awsRegion":"us-west-2", "sourceIPAddress":"72.21.198.64", ... }, { ... }, ...}

ここでは説明のために、Amazon SNS トピックを作成する API 呼び出しがログにレポートされると、Lambda 関数が E メールでユーザーに通知しています。つまり、Lambda 関数はログを分析する際に、次に示すレコードを探します。

• eventSource = "sns.amazonaws.com"

225

Page 232: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• eventName = "CreateTopic"

見つかった場合、Amazon SNS トピックにイベントを発行します (E メールで通知するように、このトピックを設定します)。

実装の要約このチュートリアルのステップを完了すると、アカウントに Amazon S3、AWS Lambda、AmazonSNS、AWS Identity and Access Management (IAM) のリソースが作成されています。

Note

このチュートリアルでは、これらのリソースが us-west-2 リージョンで作成されることを前提としています。

Lambda の場合

• Lambda 関数。• Lambda 関数に関連付けられているアクセスポリシー – このアクセス権限ポリシーを使用して、Lambda

関数を呼び出すアクセス権限を Amazon S3 に付与します。また、特定の AWS アカウントによって所有される特定のバケットからオブジェクト作成イベントに対してのみ、Amazon S3 が Lambda 関数を呼び出せるように、アクセス権限を制限します。

Note

AWS アカウントでバケットと他のいくつかの AWS アカウントを削除し、後に同じ名前のバケットを作成することが可能です。他の条件により、Amazon S3 が特定の AWS アカウントによって所有される特定のバケットからオブジェクト作成イベントを検出した場合のみ、AmazonS3 が Lambda 関数を呼び出すようにできます。

IAM の場合

• IAM ロール (実行ロール) – このロールに関連付けられているアクセス権限ポリシーを通じて、Lambda関数が必要とするアクセス権限を付与します。

Amazon S3 の場合

• バケット – このチュートリアルでは、バケット名は examplebucket です。CloudTrail コンソールで証跡を有効にすると、このバケットを CloudTrail がログを保存するバケットとして指定します。

• examplebucket での通知設定 – 設定で、Lambda 関数を呼び出して、オブジェクト作成イベントを Lambda に発行するように、Amazon S3 に指示します。Amazon S3 通知機能の詳細については、『Amazon Simple Storage Service 開発者ガイド』の「バケットイベントの通知の設定」を参照してください。

• ExampleCloudTrailLog.jsonexamplebucket 例例例例例例例例例例例 CloudTrail 例例例例例例例例 () – このチュートリアルの前半では、Lambda 関数を作成し、サンプル S3 イベントを使用して関数を手動で呼び出してテストします。このサンプルイベントでは、バケット名およびサンプルオブジェクトキー名として examplebucket が識別されます。Lambda 関数は、オブジェクトを読み取り、SNS トピックを使用して E メール通知を送信します。

Amazon SNS の場合

• SNS トピック – プロトコルとして E メールを指定して、このトピックにサブスクライブします。

これで、チュートリアルを開始する準備ができました。

226

Page 233: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次のステップステップ 1: 準備 (p. 227)

ステップ 1: 準備このセクションでは、以下の作業を行います。

• AWS アカウントにサインアップし、AWS CLI を設定します。• アカウントで CloudTrailを有効にします。• SNS トピックを作成してサブスクライブします。

以下のセクションの手順に従って、セットアッププロセスを実行します。

Note

このチュートリアルでは、us-west-2 リージョンでリソースを設定することを前提としています。

ステップ 1.1: AWS にサインアップし、AWS CLI を設定する

次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

• AWS CLI をインストールしてセットアップした。手順については、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

ステップ 1.2: CloudTrail を有効にする

AWS CloudTrail コンソールで、CloudTrail がログを保存する examplebucket を us-west-2 リージョンで指定して、アカウントで証跡を有効にします。証跡を設定するときは、SNS 通知を有効にしないでください。

手順については、『AWS CloudTrail User Guide』の「証跡の作成と更新」を参照してください。

Note

この時点で CloudTrail を有効にしますが、このチュートリアルの前半では、Lambda 関数で実際の CloudTrail ログを処理するための追加設定の手順は実行しません。その代わりに、サンプルのCloudTrail ログオブジェクト (アップロードする) とサンプルの S3 イベントを使用し、Lambda関数を手動で呼び出してテストします。このチュートリアルの後半では、Lambda 関数を有効にして CloudTrail ログを処理するための追加設定の手順を実行します。

ステップ 1.3: SNS トピックを作成しトピックにサブスクライブする

手順に従って us-west-2 リージョンで SNS トピックを作成し、エンドポイントとして E メールアドレスを指定することでそのトピックにサブスクライブします。

トピックを作成してサブスクライブするには

1. SNS トピックを作成します。

手順については、Amazon Simple Notification Service 開発者ガイドの「トピックの作成」を参照してください。

2. エンドポイントとして E メールアドレスを指定することでトピックにサブスクライブします。

227

Page 234: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

手順については、Amazon Simple Notification Service 開発者ガイドの「トピックのサブスクライブ」を参照してください。

3. トピックの ARN を書き留めておきます。この値は以降のセクションで必要となります。

次のステップステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用) (p. 228)

ステップ 2: Lambda 関数を作成し、手動で呼び出す (サンプルイベントデータを使用)このセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。AmazonS3 イベントを処理するために使用する Lambda 関数のサンプルコードが、さまざまな言語で提供されています。いずれかの言語を選択し、該当する手順に従ってデプロイパッケージを作成します。

Note

Lambda 関数は。CloudTrail で作成されたオブジェクトのバケット名とキー名を提供する S3イベントを使用します。次に、Lambda 関数はそのオブジェクトを読み取って、CloudTrail レコードを処理します。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

• デプロイパッケージをアップロードして Lambda 関数を作成し、サンプルの CloudTrail イベントデータを使用し、その関数を手動で呼び出してテストします。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 228)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 230)• ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 231)

ステップ 2.1: デプロイパッケージを作成するデプロイパッケージは、Lambda 関数のコードが含まれている .zip ファイルです。このチュートリアルでは、async ライブラリをインストールする必要があります。これを行うには、コマンドウィンドウを開き、保存先のディレクトリに移動して以下のコードファイルをコピーして保存します。非同期ライブラリをインストールするには、次に示すように npm を使用します。

npm install async

Node.js

1. テキストエディターを開き、次のコードをコピーします。

var aws = require('aws-sdk');var zlib = require('zlib');var async = require('async');

var EVENT_SOURCE_TO_TRACK = /sns.amazonaws.com/; var EVENT_NAME_TO_TRACK = /CreateTopic/; var DEFAULT_SNS_REGION = 'us-west-2';var SNS_TOPIC_ARN = 'The ARN of your SNS topic';

228

Page 235: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

var s3 = new aws.S3();var sns = new aws.SNS({ apiVersion: '2010-03-31', region: DEFAULT_SNS_REGION});

exports.handler = function(event, context, callback) { var srcBucket = event.Records[0].s3.bucket.name; var srcKey = event.Records[0].s3.object.key; async.waterfall([ function fetchLogFromS3(next){ console.log('Fetching compressed log from S3...'); s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function uncompressLog(response, next){ console.log("Uncompressing log..."); zlib.gunzip(response.Body, next); }, function publishNotifications(jsonBuffer, next) { console.log('Filtering log...'); var json = jsonBuffer.toString(); console.log('CloudTrail JSON from S3:', json); var records; try { records = JSON.parse(json); } catch (err) { next('Unable to parse CloudTrail JSON: ' + err); return; } var matchingRecords = records .Records .filter(function(record) { return record.eventSource.match(EVENT_SOURCE_TO_TRACK) && record.eventName.match(EVENT_NAME_TO_TRACK); }); console.log('Publishing ' + matchingRecords.length + ' notification(s) in parallel...'); async.each( matchingRecords, function(record, publishComplete) { console.log('Publishing notification: ', record); sns.publish({ Message: 'Alert... SNS topic created: \n TopicARN=' + record.responseElements.topicArn + '\n\n' + JSON.stringify(record), TopicArn: SNS_TOPIC_ARN }, publishComplete); }, next ); } ], function (err) { if (err) { console.error('Failed to publish notifications: ', err); } else { console.log('Successfully published all notifications.'); } callback(null,"message");

229

Page 236: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

});};

Note

コードサンプルは、Node.js ランタイム v8.10、v6.10 または v4.3 に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. CloudTrailEventProcessing.js という名前でファイルを保存します。3. CloudTrailEventProcessing.js ファイルを CloudTrailEventProcessing.zip という名前

で ZIP 圧縮します。

Note

このチュートリアルの例では Node.js を使用していますが、Lambda 関数を Java または Pythonで記述することもできます。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 230)

ステップ 2.2: 実行ロール (IAM ロール) を作成するここでは、Lambda 関数の作成時に指定する IAM ロール (実行ロール) を作成します。このロールは、Lambda 関数で必要な権限 (CloudWatch ログへの書き込みアクセス権限、S3 バケットからのCloudTrail ログの読み取りアクセス権限、Lambda が CloudTrail レコードで特定の API 呼び出しを検出した場合にイベントを SNS トピックに発行するためのアクセス権限、など) を付与するアクセス権限ポリシーを持ちます。

実行ロールの詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. 管理ポリシーを作成し、それを IAM ロールにアタッチします。このステップでは、既存の AWS 管理ポリシー変更して別の名前で保存し、作成した IAM ロールにアクセス権限ポリシーをアタッチします。

a. IAM コンソールのナビゲーションペインで、[Policies]、[Create Policy] の順に選択します。b. [Copy an AWS Managed Policy] の横の [Select] を選択します。c. [AWSLambdaExecute] の横の [Select] を選択します。d. 次のポリシーを [Policy Document] にコピーして既存のポリシーを置き換え、そのポリシーを、作

成した Amazon SNS トピックの ARN で更新します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:*" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [

230

Page 237: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

"s3:GetObject" ], "Resource": "arn:aws:s3:::examplebucket/*" }, { "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": "your sns topic ARN" } ]}

3. 次のステップで使用するため、アクセス権限ポリシー名を書き留めておきます。4. &guide-iam-user;のAWS サービスにアクセス許可を委任するロールの作成に示されている手順に従っ

て、IAM ロールを作成し、作成したアクセス権限ポリシーをそのロールに添付します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (たとえば、lambda-cloudtrail-execution-role)を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。• [Attach Policy] で、前のステップで作成したポリシーを選択します。

次のステップ

ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 231)

ステップ 2.3: Lambda 関数を作成し、手動でテストするこのセクションでは、以下の作業を行います。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数を手動で呼び出してテストします。

このステップでは、バケット名を特定するサンプルの S3 イベントとサンプルオブジェクト (サンプルのCloudTrail ログ) を使用します。次のセクションでは、オブジェクト作成イベントを発行するように S3バケット通知を設定して、エンドツーエンドエクスペリエンスをテストします。

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードし、adminuser profile を使用して Lambda 関数を作成する際の設定情報を提供します。

admin プロファイルの設定および AWS CLI の使用の詳細については、「AWS Command Line Interfaceのセットアップ (AWS CLI) (p. 6)」を参照してください。

Note

.zip ファイルパッチ (//file-path/CloudTrailEventProcessing.zip \) と実行ロールの ARN (execution-role-arn) を指定してコマンドを更新する必要があります。このチュートリアルで前に提供されたサンプルコードを使用した場合は、--runtime パラメータ値をnodejs8.10、nodejs6.10 または nodejs4.3 に設定します。次の例では nodejs6.10 を使用しています。Lambda関数は Java または Python で記述することもできます。他の言語を使用する場合は、その言語に合わせて --runtime パラメータ値を java8、python3.6、または python2.7 に変更します。

$ aws lambda create-function \

231

Page 238: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

--region region \--function-name CloudTrailEventProcessing \--zip-file fileb://file-path/CloudTrailEventProcessing.zip \--role execution-role-arn \--handler CloudTrailEventProcessing.handler \--runtime nodejs6.10 \--profile adminuser \--timeout 10 \--memory-size 1024

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソールで同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

このセクションでは、サンプルの Amazon S3 イベントデータを使用して Lambda関数を手動で呼び出します。Lambda 関数は、実行されると S3 イベントデータで識別されたバケットから S3 オブジェクト (サンプルの CloudTrail ログ) を読み取り、サンプルの CloudTrail ログで特定の API の使用が報告された場合に、SNS トピックにイベントを発行します。このチュートリアルでは、この特定の API として、トピックの作成に使用される SNS API を使用しています。つまり、CloudTrail ログでは、sns.amazonaws.comを eventSource として識別し、CreateTopic を eventName として識別するレコードが報告されます。

1. 次のサンプル CloudTrail ログをファイル (ExampleCloudTrailLog.json) に保存します。Note

このログには、eventSource が sns.amazonaws.com で、eventName が CreateTopicである 1 つのイベントがあります。この Lambda 関数は、ログを読み取り、このタイプのイベントを見つけると、作成した Amazon SNS トピックにイベントを発行します。このLambda 関数を手動で呼び出すと、1 通の E メールが送信されます。

{ "Records":[ { "eventVersion":"1.02", "userIdentity":{ "type":"Root", "principalId":"account-id", "arn":"arn:aws:iam::account-id:root", "accountId":"account-id", "accessKeyId":"access-key-id", "sessionContext":{ "attributes":{ "mfaAuthenticated":"false", "creationDate":"2015-01-24T22:41:54Z" } } }, "eventTime":"2015-01-24T23:26:50Z", "eventSource":"sns.amazonaws.com", "eventName":"CreateTopic", "awsRegion":"us-west-2",

232

Page 239: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

"sourceIPAddress":"205.251.233.176", "userAgent":"console.amazonaws.com", "requestParameters":{ "name":"dropmeplease" }, "responseElements":{ "topicArn":"arn:aws:sns:us-west-2:account-id:exampletopic" }, "requestID":"3fdb7834-9079-557e-8ef2-350abc03536b", "eventID":"17b46459-dada-4278-b8e2-5a4ca9ff1a9c", "eventType":"AwsApiCall", "recipientAccountId":"account-id" }, { "eventVersion":"1.02", "userIdentity":{ "type":"Root", "principalId":"account-id", "arn":"arn:aws:iam::account-id:root", "accountId":"account-id", "accessKeyId":"access-key-id", "sessionContext":{ "attributes":{ "mfaAuthenticated":"false", "creationDate":"2015-01-24T22:41:54Z" } } }, "eventTime":"2015-01-24T23:27:02Z", "eventSource":"sns.amazonaws.com", "eventName":"GetTopicAttributes", "awsRegion":"us-west-2", "sourceIPAddress":"205.251.233.176", "userAgent":"console.amazonaws.com", "requestParameters":{ "topicArn":"arn:aws:sns:us-west-2:account-id:exampletopic" }, "responseElements":null, "requestID":"4a0388f7-a0af-5df9-9587-c5c98c29cbec", "eventID":"ec5bb073-8fa1-4d45-b03c-f07b9fc9ea18", "eventType":"AwsApiCall", "recipientAccountId":"account-id" } ]}

2. gzip コマンドを実行して、前述のソースファイルから .gz ファイルを作成します。

$ gzip ExampleCloudTrailLog.json

これにより ExampleCloudTrailLog.json.gz ファイルが作成されます。3. CloudTrail 設定で指定した examplebucket に ExampleCloudTrailLog.json.gz ファイルをアッ

プロードします。

このオブジェクトは、Lambda 関数を手動で呼び出す際に使用するサンプルの Amazon S3 イベントデータで指定されています。

4. 次の JSON (例の S3 イベント) を input.txt ファイルに保存します。バケット名とオブジェクトキー名の値を書き留めます。

Lambda 関数を呼び出す際に、このサンプルイベントを指定します。S3 イベント構造の詳細については、『Amazon Simple Storage Service 開発者ガイド』の「イベントメッセージの構造」を参照してください。

233

Page 240: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"your bucket name", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::mybucket" }, "object":{ "key":"ExampleCloudTrailLog.json.gz", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ]}

5. AWS マネジメントコンソール で、サンプルの Amazon S3 イベントデータを使用して関数を手動で呼び出します。コンソールで、以下のサンプルの Amazon S3 イベントデータを使用します。

Note

コンソールを使用して関数を呼び出すことをお勧めします。コンソールには、実行の要約、コードによって書き込まれたログ、関数が返した結果など、実行の結果を確認しやすい UI が用意されているためです (これは、コンソールが常に同期実行を行う、つまりRequestResponse 呼び出しタイプを使用して Lambda 関数を呼び出すからです)。

{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1"

234

Page 241: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

}, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"your bucket name", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::mybucket" }, "object":{ "key":"ExampleCloudTrailLog.json.gz", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ]}

6. 次の AWS CLI コマンドを実行し、adminuser プロファイルを使用して関数を手動で呼び出します。

Note

このプロファイルをまだ作成していない場合は、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

$ aws lambda invoke-async \ --function-name CloudTrailEventProcessing \ --region region \ --invoke-args /filepath/input.txt \ --debug \--profile adminuser

サンプルログオブジェクトには、トピックを作成するために呼び出す SNS API を示すイベントレコードが含まれているため、Lambda 関数はそのイベントを SNS トピックに投稿し、E メール通知が送信されます。

Lambda 関数のアクティビティは、CloudWatch のメトリクスとログを使用してモニタリングできます。CloudWatch のモニタリングの詳細については、「Amazon CloudWatch の使用 (p. 327)」を参照してください。

7. (オプション) 次のように AWS CLI を使用して、Lambda 関数を手動で呼び出します。

a. この手順の前述のステップ 2 で、JSON を input.txt というファイルに保存します。b. 次の invoke コマンドを実行します。

$ aws lambda invoke \--invocation-type Event \--function-name CloudTrailEventProcessing \--region region \--payload file://file-path/input.txt \--profile adminuser outputfile.txt

235

Page 242: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Note

このチュートリアルの例では、メッセージは outputfile.txt ファイルに保存されます。同期実行 (呼び出しタイプが RequestResponse) をリクエストした場合、その関数は応答の本文で文字列メッセージを返します。Node.js の場合は、次のいずれかです (コード内で指定している)。context.succeed("message")context.fail("message")context.done(null, "message)Python または Java の場合は、戻りステートメント内のメッセージです。return "message"

次のステップ

ステップ 3: イベントソースを追加します (イベントを発行するように Amazon S3 を設定する) (p. 236)

ステップ 3: イベントソースを追加します (イベントを発行するように Amazon S3 を設定する)このセクションでは、残りの設定を追加し、Amazon S3 がオブジェクト作成イベントを AWS Lambda に発行し、Lambda 関数を呼び出せるようにします。以下の作業を実行します。

• Amazon S3 が関数を呼び出すことを許可するアクセス権限を、Lambda 関数のアクセス権限ポリシーに追加します。

• 通知設定をソースバケットに追加します。通知設定で、以下の項目を指定します。• Amazon S3 がイベントを発行するイベントタイプ。このチュートリアルで

は、s3:ObjectCreated:* イベントタイプを指定します。• 呼び出す Lambda 関数。

ステップ 3.1: Lambda 関数のアクセス権限ポリシーにアクセス権限を追加する

1. 以下の Lambda CLI add-permission コマンドを実行して、Amazon S3 サービスプリンシパル(s3.amazonaws.com) に lambda:InvokeFunction アクションを実行するためのアクセス権限を付与します。次の条件を満たす場合にのみ関数を呼び出すアクセス権限が Amazon S3 に付与されることに注意してください。

• オブジェクト作成イベントが、特定のバケットで検出されます。• バケットは、特定の AWS アカウントによって所有されます。バケット所有者がバケットを削除し

た場合、他の一部の AWS アカウントは同じ名前でバケットを作成できます。この状態により、特定の AWS アカウントのみが Lambda 関数を実行できるようになります。

Note

adminuser プロファイルをまだ作成していない場合は、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

$ aws lambda add-permission \--function-name CloudTrailEventProcessing \--region region \--statement-id Id-1 \--action "lambda:InvokeFunction" \--principal s3.amazonaws.com \--source-arn arn:aws:s3:::examplebucket \

236

Page 243: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

--source-account examplebucket-owner-account-id \--profile adminuser

2. AWS CLI get-policy コマンドを呼び出すことで、関数のアクセスポリシーを確認します。

$ aws lambda get-policy \--function-name function-name \--profile adminuser

ステップ 3.2: バケットの通知を設定する

オブジェクト作成イベントを Lambda に発行するよう Amazon S3 にリクエストするため、examplebucket で通知設定を追加します。設定で、次のように指定します。

• [Event type] — このチュートリアルでは、オブジェクトを作成する任意のイベントタイプを指定できます。

• [Lambda function ARN] – これは Amazon S3 が呼び出す Lambda 関数です。ARN は次の形式です。

arn:aws:lambda:aws-region:account-id:function:function-name

たとえば、us-west-2 リージョンで作成された CloudTrailEventProcessing 関数の ARN は次のようになります。

arn:aws:lambda:us-west-2:account-id:function:CloudTrailEventProcessing

バケットに通知設定を追加する方法については、Amazon Simple Storage Service コンソールユーザーガイドのイベント通知の有効化を参照してください。

ステップ 3.3: セットアップのテスト

すべて完了しました。これで、次のようにセットアップをテストできます。

1. AWS アカウントで何らかのアクションを実行します。たとえば、Amazon SNS コンソールで別のトピックを追加します。

2. このイベントに関する E メール通知を受信していることを確認します。3. AWS CloudTrail によってバケットにログオブジェクトが作成されます。4. ログオブジェクト (.gz ファイル) を開くと、ログには CreateTopic SNS イベントが表示されます。5. AWS CloudTrail で作成される各オブジェクトに対して、Amazon S3 はイベントデータとしてログオブ

ジェクトを渡して Lambda 関数を呼び出します。6. Lambda は関数を実行します。この関数はログを解析し、CreateTopic SNS イベントを見つけると、

ユーザーに E メール通知を送信します。

Lambda 関数のアクティビティは、CloudWatch のメトリクスとログを使用してモニタリングできます。CloudWatch のモニタリングの詳細については、「Amazon CloudWatch の使用 (p. 327)」を参照してください。

237

Page 244: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

ステップ 4: AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

Amazon API Gateway アプリケーションの仕様このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、前のセクションで作成した ZIP パッケージの隣に保存します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Parameters: NotificationEmail: Type: StringResources: CloudTrailEventProcessing: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime Timeout: 10 MemorySize: 1024 Policies: Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub 'arn:aws:s3:::${Bucket}/*'

238

Page 245: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon SNS

- Effect: Allow Action: sns:Publish Resource: !Ref Topic Events: PhotoUpload: Type: S3 Properties: Bucket: !Ref Bucket Events: s3:ObjectCreated:* Environment: Variables: SNS_TOPIC_ARN: !Ref Topic

Bucket: Type: AWS::S3::Bucket

Trail: Type: AWS::CloudTrail::Trail Properties: IsLogging: true S3BucketName: !Ref Bucket

Topic: Type: AWS::SNS::Topic Properties: Subscription: - Protocol: email Endpoint: !Ref NotificationEmail

サーバーレスアプリケーションのデプロイパッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

さまざまなアカウントから AWS Lambda をAmazon SNS で使用

複数のアカウントから Lambda に Amazon SNS を配信するには、Lambda 関数が Amazon SNS から呼び出されるように Lambda を認可する必要があります。また、Lambda アカウントが Amazon SNS トピックに登録できるように Amazon SNS で許可する必要があります。たとえば、Amazon SNS トピックがアカウント A にあり、Lambda 関数がアカウント B にある場合は、それぞれのリソースにアクセスできるように、両方のアカウントにアクセス権限を付与する必要があります。クロスアカウント権限を設定するためのすべてのオプションが AWS コンソールから使用できるわけではないため、プロセス全体をセットアップしている AWS CLI を使用します。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: Amazon SNS での AWSLambda の使用 (p. 239)」を参照してください。

チュートリアル: Amazon SNS での AWS Lambda の使用このチュートリアルでは、1 つの AWS アカウントに Lambda 関数を作成して、別の AWS アカウントにある Amazon SNS トピックをサブスクライブします。

このチュートリアルは大きく 3 つのセクションに分かれています。

• 最初に、Lambda 関数を作成するために必要な設定を実行します。

239

Page 246: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• 次に、別の AWS アカウントに Amazon SNS トピックを作成します。• 3 番目に、各アカウントにアクセス権限を付与して、Lambda 関数が Amazon SNS トピックをサブスク

ライブできるようにします。次に、エンドツーエンドのセットアップをテストします。

Important

このチュートリアルでは、これらのリソースが us-east-1 リージョンで作成されることを前提としています。

このチュートリアルでは、AWS Command Line Interface を使用して、Lambda 関数の作成、AmazonSNS トピックの作成、これら 2 つのリソースに相互にアクセスするアクセス権限の付与などの AWSLambda オペレーションを実行します。

次のステップステップ 1: 準備 (p. 240)

ステップ 1: 準備• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser と呼びます) を作成しま

す。• AWS CLI をインストールしてセットアップします。

手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

次のステップ

ステップ 2: Lambda 関数を作成する (p. 240)

ステップ 2: Lambda 関数を作成するこのセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。AmazonSNS トピックをサブスクライブするために使用する Lambda 関数のサンプルコードが、さまざまな言語で提供されています。いずれかの言語を選択し、該当する手順に従ってデプロイパッケージを作成します。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

トピック• ステップ 2.1: Lambda 関数デプロイパッケージを作成する (p. 240)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 243)

ステップ 2.1: Lambda 関数デプロイパッケージを作成する

[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

Node.js

1. テキストエディターを開き、次のコードをコピーします。

240

Page 247: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

console.log('Loading function'); exports.handler = function(event, context, callback) {// console.log('Received event:', JSON.stringify(event, null, 4)); var message = event.Records[0].Sns.Message; console.log('Message received from SNS:', message); callback(null, "Success");};

Note

コードサンプルは、Node.js ランタイム v4.3 以降に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. index.js という名前でファイルを保存します。3. index.js ファイルを LambdaWithSNS.zip という名前で ZIP 圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 243)

Java

テキストエディターを開き、次のコードをコピーします。

package example; import java.text.SimpleDateFormat;import java.util.Calendar; import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.services.lambda.runtime.events.SNSEvent; public class LogEvent implements RequestHandler<SNSEvent, Object> { public Object handleRequest(SNSEvent request, Context context){ String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime()); context.getLogger().log("Invocation started: " + timeStamp); context.getLogger().log(request.getRecords().get(0).getSNS().getMessage()); timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime()); context.getLogger().log("Invocation completed: " + timeStamp); return null; }}

前述のコード (LambdaWithSNS.java という名前のファイル) を使用して、デプロイパッケージを作成します。必ず次の依存関係を追加してください。

• aws-lambda-java-core

• aws-lambda-java-events

詳細については、「Java で Lambda 関数を作成するためのプログラミングモデル (p. 36)」を参照してください。

241

Page 248: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

デプロイパッケージは、.zip ファイルまたはスタンドアロン .jar とすることができます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。Maven ビルドツールを使用してスタンドアロン .jar を作成する方法の例については、「IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)」および「Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)」を参照してください。Gradle ビルドツールを使用して .zip ファイルを作成する方法の例については、「.zip デプロイパッケージの作成 (Java) (p. 102)」を参照してください。

デプロイパッケージが作成されたことを確認したら、次のステップに進んで IAM ロール (実行ロール) を作成します。Lambda 関数の作成時にそのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 243)

Go

1. テキストエディターを開き、次のコードをコピーします。

import ( "strings" "github.com/aws/aws-lambda-go/events”)

func handler(ctx context.Context, snsEvent events.SNSEvent) { for _, record := range snsEvent.Records { snsRecord := record.SNS

fmt.Printf("[%s %s] Message = %s \n", record.EventSource, snsRecord.Timestamp, snsRecord.Message) }}

2. lambda_handler.go という名前でファイルを保存します。3. lambda_handler.go ファイルを LambdaWithSNS.zip という名前で ZIP 圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 243)

Python

1. テキストエディターを開き、次のコードをコピーします。

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_functionimport jsonprint('Loading function')

def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) message = event['Records'][0]['Sns']['Message'] print("From SNS: " + message) return message

2. lambda_handler.py という名前でファイルを保存します。

242

Page 249: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

3. lambda_handler.py ファイルを LambdaWithSNS.zip という名前で ZIP 圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 243)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このセクションでは、以下に示す定義済みのロールタイプとアクセスポリシーを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

• AWSLambdaBasicExecutionRole – ロールに添付するアクセス権限ポリシー。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (lambda-sns-execution-role など) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で [AWSLambdaBasicExecutionRole] を選択します。このチュートリアルの Lambda関数では、このポリシーでのアクセス権限で十分です。

3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になります。

ステップ 3: クロスアカウント権限のセットアップこのセクションでは、CLI コマンドを使用して、Lambda 関数アカウントおよび Amazon SNS トピックアカウントにアクセス権限を設定し、サブスクリプションをテストします。

1. アカウント A から Amazon SNS トピックを作成:

aws sns create-topic \ --name lambda-x-account

コマンドによって返されるトピックの arn をメモします。これは、Lambda 関数にアクセス権限を追加してトピックをサブスクライブするときに必要になります。

2. アカウント B から Lambda 関数を作成します。ランタイムパラメータには、デプロイパッケージを作成したときに選択したコードサンプルによって、nodejs8.10、nodejs6.10 またはnodejs4.3、python3.6、python2.7 または java8 のいずれかを選択します。

aws lambda create-function \ --function-name SNS-X-Account \

243

Page 250: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

--runtime runtime language \ --role role arn \ --handler handler-name \ --description "SNS X Account Test Function" \ --timeout 60 \ --memory-size 128 \ --zip-file fileb://path/LambdaWithSNS.zip

コマンドによって返される関数の arn をメモします。これは、Amazon SNS に関数の呼び出しを許可するアクセス権限を追加するときに必要になります。

3. アカウント A からアカウント B にトピックをサブスクライブするアクセス権限を追加します。

aws sns add-permission \ --region us-east-1 \ --topic-arn Amazon SNS topic arn \ --label lambda-access \ --aws-account-id B \ --action-name Subscribe ListSubscriptionsByTopic Receive

4. アカウント B から、Amazon SNS からの呼び出しを許可する Lambda アクセス権限を追加します。

aws lambda add-permission \ --function-name SNS-X-Account \ --statement-id sns-x-account \ --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com \ --source-arn Amazon SNS topic arn

これに応じて、Lambda が以下の JSON コードを返します。ステートメント値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列のバージョンです。

{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-1:B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-1:A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}"}

Note

ポリシーを追加する際に、--source-account パラメーターを使用してソースアカウントをLambda ポリシーに追加しないでください。ソースアカウントは Amazon SNS イベントソースとしてサポートされていないため、アクセスが拒否されます。ソースアカウントはソース ARNに含まれるため、セキュリティに影響はありません。

5. アカウント B から、Lambda 関数でトピックをサブスクライブします。

aws sns subscribe \ --topic-arn Amazon SNS topic arn \ --protocol lambda \ --notification-endpoint arn:aws:lambda:us-east-1:B:function:SNS-X-Account

次のような JSON 出力が表示されます。

{ "SubscriptionArn": "arn:aws:sns:us-east-1:A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"}

244

Page 251: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway

6. これで、アカウント A でサブスクリプションをテストできます。テキストファイルに「Hello World」と入力して、message.txt として保存します。次に、以下のコマンドを実行します。

aws sns publish \ --topic-arn arn:aws:sns:us-east-1:A:lambda-x-account \ --message file://message.txt \ --subject Test

メッセージが Amazon SNS サービスに受け入れられたことを示す、一意の識別子を伴うメッセージ IDが返されます。その後、Amazon SNS はトピックのサブスクライバーにこのメッセージの配信を試みます。

Note

また、message パラメーターに直接 JSON 文字列を入力することもできますが、テキストファイルを使用するとメッセージに改行を使用できます。

Amazon SNS の詳細については、Amazon Simple Notification Service とはを参照してください。

Amazon API Gateway での AWS Lambda の使用(オンデマンド HTTPS 経由)

AWS Lambda 関数を HTTPS 経由で呼び出すことができます。これを行うには、Amazon API Gatewayを使用してカスタム REST API とエンドポイントを定義し、個々のメソッド (GET や PUT など) を特定のLambda 関数にマッピングします。また、ANY という特殊なメソッドを追加して、サポートされているすべてのメソッド (GET、POST、PATCH、DELETE) を Lambda 関数にマッピングすることもできます。APIエンドポイントに HTTPS リクエストを送信するときに、Amazon API Gateway サービスが、対応するLambda 関数を呼び出します。ANY メソッドの詳細については、「Lambda と API Gateway を使用してシンプルなマイクロサービスを作成する (p. 259)」を参照してください。

Amazon API Gateway では、アプリケーションユーザーとアプリケーションロジックの間に、以下を可能にするレイヤーが追加されます。

• 個々のユーザーやリクエストを絞り込む。• 分散型サービス妨害攻撃から保護する。• Lambda 関数からの応答をキャッシュするキャッシュレイヤーを提供する。

Amazon API Gateway と AWS Lambda の連携動作については、以下の点に注意してください。

• プッシュイベントモデル – これは Amazon API Gateway が Lambda 関数にパラメーターとしてリクエストボディのデータを渡して Lambda 関数を起動するモデルです (「イベントソースマッピング (p. 157)」を参照)。

• 同期呼び出し – Amazon API Gateway は、呼び出しタイプとして RequestResponse を指定することにより、Lambda 関数を呼び出してリアルタイムでレスポンスを取得できます。呼び出しタイプについては、「呼び出しタイプ (p. 156)」を参照してください。

• イベント構造 – Lambda 関数が受け取るイベントは、Amazon API Gateway が受信した HTTPS リクエストの本文であり、Lambda 関数は特定のイベントタイプを処理するために記述されたカスタムコードです。

エンドツーエンドのエクスペリエンスを設定するときは、以下の 2 タイプのアクセス権限ポリシーを使用します。

245

Page 252: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

• Lambda 関数のアクセス権限 - Lambda 関数の呼び出し元にかかわらず、AWS Lambda は、Lambda 関数の作成時に指定された IAM ロール (実行ロール) を引き受けることで、その関数を実行します。このロールに関連付けられたアクセス権限ポリシーを使用して、Lambda 関数に必要なアクセス権限を付与します。たとえば、Lambda 関数にオブジェクトの読み取りが必要である場合は、アクセス権限ポリシーで、関連する Amazon S3 アクションのためのアクセス権限を付与します。詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

• Amazon API Gateway が Lambda 関数を呼び出すためのアクセス権限 – アクセス権限が付与されていない場合、Amazon API Gateway は Lambda関数を呼び出すことはできません。Lambda 関数に関連付けられるアクセス権限ポリシーによって、このアクセス権限を付与します。

セットアップの例を説明しているチュートリアルについては、「Amazon API Gateway での AWS Lambdaの使用 (オンデマンド HTTPS 経由) (p. 246)」を参照してください。

Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由)この例では、Amazon API Gateway を使用してシンプルな API (DynamoDBOperations) を作成します。Amazon API Gateway はリソースとメソッドの集合体です。このチュートリアルでは、1 つのリソース (DynamoDBManager) を作成し、それに対する 1 つのメソッド (POST) を定義します。このメソッドでは-Lambda 関数 (LambdaFunctionOverHttps) が使用されます。つまり、HTTPS エンドポイントでメソッドを呼び出すと、Amazon API Gateway が Lambda 関数を呼び出します。

DynamoDBManager リソースの POST メソッドでは、以下の DynamoDB オペレーションがサポートされます。

• 項目を作成、更新、削除する。• 項目を読み取る。• 項目をスキャンする。• テストに使用できる、DynamoDB に関連しないその他のオペレーション (echo、ping)。

POST リクエストで送信するリクエストペイロードによって、DynamoDB オペレーションが識別され、必要なデータが提供されます。以下に例を示します。

• DynamoDB の項目の作成オペレーションのリクエストペイロードの例を以下に示します。

{ "operation": "create", "tableName": "LambdaTable", "payload": { "Item": { "Id": "1", "name": "Bob" } }}

• DynamoDB の Read Item オペレーションのリクエストペイロードの例を以下に示します。

{ "operation": "read", "tableName": "LambdaTable", "payload": { "Key": { "Id": "1" } }

246

Page 253: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

}

• echo オペレーションのリクエストペイロードの例を以下に示します。リクエストボディに以下のデータを使用して、HTTPS POST リクエストをエンドポイントに送信します。

{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" }}

API エンドポイントの作成および管理は、AWS Lambda コンソールで行うこともできます。たとえば、設計図から microservice を検索できます。このチュートリアルでは、コンソールを使用せず代わりに AWSCLI を使用して、API の動作を詳細に説明します。

Note

API Gateway には、次のような高度な機能があります。

• リクエスト全体のパススルー – AWS_PROXY 統合タイプを使用して、Lambda 関数で HTTP リクエスト全体 (リクエストボディだけでなく) を受信し、HTTP レスポンス (レスポンス本文だけでなく) を設定できます。

• キャッチオールメソッド – ANY キャッチオールメソッドを使用して、API リソースのすべてのメソッドを単一のマッピングを使用する単一の Lambda 関数にマッピングできます。

• キャッチオールリソース – 新しいパスパラメーター ({proxy+})) を使用して、リソースのすべてのサブパスを、追加構成を必要とせずに Lambda 関数にマッピングできます。

これらの API ゲートウェイ機能の詳細については、プロキシリソースのプロキシ統合を設定するを参照してください。

次のステップステップ 1: 準備 (p. 247)

ステップ 1: 準備次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

• AWS CLI をインストールしてセットアップした。手順については、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

次のステップ

ステップ 2: Lambda 関数を作成し、手動でテストする (p. 247)

ステップ 2: Lambda 関数を作成し、手動でテストするこのセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。

247

Page 254: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

• Lambda 関数を作成し、手動でテストします。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 248)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 250)• ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 251)

ステップ 2.1: デプロイパッケージを作成する

[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

Node.js

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

console.log('Loading function');

var AWS = require('aws-sdk');var dynamo = new AWS.DynamoDB.DocumentClient();

/** * Provide an event that contains the following keys: * * - operation: one of the operations in the switch statement below * - tableName: required for operations that interact with DynamoDB * - payload: a parameter to pass to the operation being performed */exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2));

var operation = event.operation;

if (event.tableName) { event.payload.TableName = event.tableName; }

switch (operation) { case 'create': dynamo.put(event.payload, callback); break; case 'read': dynamo.get(event.payload, callback); break; case 'update': dynamo.update(event.payload, callback); break; case 'delete': dynamo.delete(event.payload, callback); break; case 'list': dynamo.scan(event.payload, callback); break; case 'echo': callback(null, "Success");

248

Page 255: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

break; case 'ping': callback(null, "pong"); break; default: callback('Unknown operation: ${operation}'); }};

Note

コードサンプルは、Node.js ランタイム v6.10 または v4.3 に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. LambdaFunctionOverHttps.js という名前でファイルを保存します。3. LambdaFunctionOverHttps.js ファイルを LambdaFunctionOverHttps.zip という名前で ZIP

圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 250)

Python

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

Note

from __future__ ステートメントを使用すると、Python 2 または 3 と互換性のあるコードを作成できます。ランタイムバージョン 3.6 を使用している場合は、これを含める必要はありません。

from __future__ import print_function

import boto3import json

print('Loading function')

def handler(event, context): '''Provide an event that contains the following keys:

- operation: one of the operations in the operations dict below - tableName: required for operations that interact with DynamoDB - payload: a parameter to pass to the operation being performed ''' #print("Received event: " + json.dumps(event, indent=2))

operation = event['operation']

if 'tableName' in event: dynamo = boto3.resource('dynamodb').Table(event['tableName'])

operations = { 'create': lambda x: dynamo.put_item(**x), 'read': lambda x: dynamo.get_item(**x), 'update': lambda x: dynamo.update_item(**x), 'delete': lambda x: dynamo.delete_item(**x), 'list': lambda x: dynamo.scan(**x),

249

Page 256: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

'echo': lambda x: x, 'ping': lambda x: 'pong' }

if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))

2. LambdaFunctionOverHttps.py という名前でファイルを保存します。3. LambdaFunctionOverHttps.py ファイルを LambdaFunctionOverHttps.zip という名前で ZIP

圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 250)

Go

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

import ( "strings" "github.com/aws/aws-lambda-go/events")

func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { fmt.Printf("Processing request data for request %s.\n", request.RequestContext.RequestId) fmt.Printf("Body size = %d.\n", len(request.Body))

fmt.Println("Headers:") for key, value := range request.Headers { fmt.Printf(" %s: %s\n", key, value) }

return events.APIGatewayProxyResponse { Body: request.Body, StatusCode: 200 }, nil}

2. LambdaFunctionOverHttps.go という名前でファイルを保存します。3. LambdaFunctionOverHttps.go ファイルを LambdaFunctionOverHttps.zip という名前で ZIP

圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 250)

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このセクションでは、以下の定義済みロールタイプを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

250

Page 257: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (たとえば、lambda-gateway-execution-role) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• コンソールでアクセス権限ポリシーをアタッチせずに、IAM ロールを作成します。ロールを作成した後に、ロールを更新し、以下のアクセス権限ポリシーをロールにアタッチします。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ]}

3. ロールの ARN (Amazon リソースネーム) をメモします。これは、次のステップで Lambda 関数を作成するときに必要です。

次のステップ

ステップ 2.3: Lambda 関数を作成し、手動でテストする (p. 251)

ステップ 2.3: Lambda 関数を作成し、手動でテストする

このセクションでは、以下の作業を行います。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数にサンプルのイベントデータを渡して手動で呼び出し、テストします。

251

Page 258: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードします。

コマンドプロンプトで、adminuser プロファイルを使用して、次の Lambda CLI コマンド create-function を実行します。

このコマンドは、.zip ファイルのパスと実行ロールの ARN に実際の値を指定して更新する必要があります。--runtime のパラメータ値には、コードの記述に使用した言語に応じて、python3.6、python2.7、nodejs8.10、nodejs6.10 または nodejs4.3、または java8 のいずれかを指定します。

$ aws lambda create-function \--region region \--function-name LambdaFunctionOverHttps \--zip-file fileb://file-path/LambdaFunctionOverHttps.zip \--role execution-role-arn \--handler LambdaFunctionOverHttps.handler \--runtime runtime-value \--profile adminuser

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソール UI で同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

サンプルイベントデータを使用して手動で関数を呼び出します。コンソールを使用して関数を呼び出すことをお勧めします。コンソールには、実行の要約、コードによって書き込まれたログ、関数が返した結果など、実行の結果を確認しやすい UI が用意されているためです (これは、コンソールが常に同期実行を行う、つまり RequestResponse 呼び出しタイプを使用して Lambda 関数を呼び出すからです)。

Lambda 関数をテストするには (AWS マネジメントコンソール)

1. 「開始方法」の演習の手順に従って、Lambda 関数を作成して呼び出します (「Lambda 関数を手動で呼び出し、結果、ログ、メトリクスを確認する (p. 12)」を参照)。テスト用のサンプルイベントについては、[Sample event template] で [Hello World] を選択し、データを以下のように置き換えます。

{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" }}

2. dynamo オペレーションの 1 つ (たとえば read) をテストするには、入力データを以下のように変更します。

{ "operation": "read", "tableName": "the name of your stream table",

252

Page 259: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

"payload": { "Key": { "the primary key of the table": "the value of the key" } }}

3. コンソールで結果を確認します。

Lambda 関数をテストする (AWS CLI)

1. 以下の JSON をファイルにコピーし、input.txt という名前で保存します。

{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" }}

2. 以下の invoke コマンドを実行します。

$ aws lambda invoke \--invocation-type Event \--function-name LambdaFunctionOverHttps \--region region \--payload fileb://file-path/input.txt \--profile adminuser \outputfile.txt

Note

このチュートリアルの例では、同期実行 (呼び出しタイプが RequestResponse) をリクエストした場合、メッセージは outputfile.txt ファイルに保存されます。この関数はレスポンス本文で文字列メッセージを返します。Event 呼び出しタイプを使用すると、メッセージが出力ファイルに返されることはありません。どちらの場合でも、outputfile.txt パラメーターが必要です。

次のステップ

ステップ 3: Amazon API Gateway を使用して API を作成し、テストする (p. 253)

ステップ 3: Amazon API Gateway を使用して API を作成し、テストするこのステップでは、Amazon API Gateway を使用して作成した API 内のメソッドに Lambda 関数を関連付け、エンドツーエンドエクスペリエンスをテストします。つまり、HTTPS リクエストが API メソッドに送信されると、Amazon API Gateway は Lambda 関数を呼び出します。

最初に、Amazon API Gateway を使用して、1 つのリソース (DynamoDBManager) と 1 つのメソッド(POST) を持つ API (DynamoDBOperations) を作成します。POST メソッドを Lambda 関数に関連付けます。次に、エンドツーエンドエクスペリエンスをテストします。

ステップ 3.1: API を作成する次の create-rest-api コマンドを実行して、このチュートリアル用の DynamoDBOperations API を作成します。

253

Page 260: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

$ aws apigateway create-rest-api \--name DynamoDBOperations \--region region \--profile profile

以下に、応答の例を示します。

{ "name": "DynamoDBOperations", "id": "api-id", "createdDate": 1447724091}

API ID を書き留めます。

API のルートリソースの ID も必要です。この ID を取得するには、get-resources コマンドを実行します。

$ aws apigateway get-resources \--rest-api-id api-id

応答の例を以下に示します (この時点ではルートリソースのみですが、次のステップでリソースを追加します)。

{ "items": [ { "path": "/", "id": "root-id" } ]}

ステップ 3.2: API のリソース (DynamoDBManager) を作成します。

次の create-resource コマンドを実行して、前のセクションで作成した API のリソース(DynamoDBManager) を作成します。

$ aws apigateway create-resource \--rest-api-id api-id \--parent-id root-id \--path-part DynamoDBManager

以下に、応答の例を示します。

{ "path": "/DynamoDBManager", "pathPart": "DynamoDBManager", "id": "resource-id", "parentId": "root-id"}

応答内の ID を書き留めます。これは、作成したリソース (DynamoDBManager) の ID です。

254

Page 261: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

ステップ 3.3: リソースに対するメソッド (POST) を作成する次の put-method コマンドを実行して、API (DynamoDBOperations) のリソース (DynamoDBManager)に対するメソッド (POST) を作成します。

$ aws apigateway put-method \--rest-api-id api-id \--resource-id resource-id \--http-method POST \--authorization-type NONE

--authorization-type パラメーターに、このメソッドでは未認証リクエストがサポートされていることを意味する NONE を指定します。この値はテスト用には適切ですが、本稼働時にはキーベースまたはロールベースのいずれかの認証を使用する必要があります。

以下に、応答の例を示します。

{ "apiKeyRequired": false, "httpMethod": "POST", "authorizationType": "NONE"}

ステップ 3.4: Lambda 関数を POST メソッドの送信先に設定する次のコマンドを実行して、Lambda 関数を POST メソッド の統合ポイントに設定します (POST メソッドのエンドポイントに HTTPS リクエストを行ったときに、Amazon API Gateway がこのメソッドを呼び出します)。

$ aws apigateway put-integration \--rest-api-id api-id \--resource-id resource-id \--http-method POST \--type AWS \--integration-http-method POST \--uri arn:aws:apigateway:aws-region:lambda:path/2015-03-31/functions/arn:aws:lambda:aws-region:aws-acct-id:function:LambdaFunctionOverHttps/invocations

Note

• --rest-api-id は、Amazon API Gateway で作成した API (DynamoDBOperations) の ID です。

• --resource-id は、API に作成したリソース (DynamoDBManager) のリソース ID です。• --http-method は API Gateway メソッドであり、--integration-http-method は API

Gateway が AWS Lambda との通信に使用するメソッドです。• --uri は、Amazon API Gateway からのリクエストの送信先となるエンドポイントの一意の識

別子です。

以下に、応答の例を示します。

{ "httpMethod": "POST", "type": "AWS", "uri": "arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:region:aws-acct-id:function:LambdaFunctionOverHttps/invocations", "cacheNamespace": "resource-id"}

255

Page 262: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

POST メソッドのレスポンスおよび統合レスポンスの content-type を、以下のように JSON に設定します。

• 次のコマンドを実行して、POST メソッドのレスポンスを JSON に設定します。これが、API メソッドが返すレスポンスのタイプになります。

$ aws apigateway put-method-response \--rest-api-id api-id \--resource-id resource-id \--http-method POST \--status-code 200 \--response-models "{\"application/json\": \"Empty\"}"

• 次のコマンドを実行して、POST メソッドの統合レスポンスを JSON に設定します。これが、Lambda関数が返すレスポンスのタイプになります。

$ aws apigateway put-integration-response \--rest-api-id api-id \--resource-id resource-id \--http-method POST \--status-code 200 \--response-templates "{\"application/json\": \"\"}"

ステップ 3.5: API をデプロイする

このステップでは、作成した API を prod というステージにデプロイします。

$ aws apigateway create-deployment \--rest-api-id api-id \--stage-name prod

以下に、応答の例を示します。

{ "id": "deployment-id", "createdDate": 1447726017}

ステップ 3.6: Amazon API Gateway が Lambda 関数を呼び出すためのアクセス権限を付与する

Amazon API Gateway を使用して API を作成し、デプロイしたので、テストできます。まず、POST メソッドに HTTPS リクエストを送信したときに、Amazon API Gateway が Lambda 関数を呼び出すことができるようにアクセス権限を追加する必要があります。

これを行うには、Lambda 関数に関連付けられているアクセス権限ポリシーにアクセス権限を追加する必要があります。次の AWS Lambda add-permission コマンドを実行して、Lambda 関数(LambdaFunctionOverHttps) を呼び出すアクセス権限を Amazon API Gateway サービスプリンシパル(apigateway.amazonaws.com) に付与します。

$ aws lambda add-permission \--function-name LambdaFunctionOverHttps \--statement-id apigateway-test-2 \--action lambda:InvokeFunction \--principal apigateway.amazonaws.com \--source-arn "arn:aws:execute-api:region:aws-acct-id:api-id/*/POST/DynamoDBManager"

256

Page 263: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

テストを行うには、このアクセス権限を付与する必要があります (Amazon API Gateway に移動し、[Test]を選択して API メソッドをテストする場合は、このアクセス権限が必要です)。--source-arn には、ステージ値としてワイルドカード文字 (*) を指定する (テスト用のみを表す) ことに注意してください。これにより、API をデプロイせずにテストできます。

次に、同じコマンドをもう一度実行しますが、今度は、Lambda 関数を呼び出すためのアクセス権限を、デプロイ済み API に付与します。

$ aws lambda add-permission \--function-name LambdaFunctionOverHttps \--statement-id apigateway-prod-2 \--action lambda:InvokeFunction \--principal apigateway.amazonaws.com \--source-arn "arn:aws:execute-api:region:aws-acct-id:api-id/prod/POST/DynamoDBManager"

デプロイ済み API が Lambda 関数を呼び出すためのアクセス権限を持つように、このアクセス権限を付与します。--source-arn には、API のデプロイ時に使用したステージ名である prod を指定することに注意してください。

ステップ 3.7: HTTPS リクエストの送信をテストする

このステップでは、POST メソッドのエンドポイントに HTTPS リクエストを送信する準備ができています。Curl または Amazon API Gateway で提供されているメソッド (test-invoke-method) のいずれかを使用できます。

DynamoDB テーブルに対して Lambda 関数でサポートされているオペレーションをテストする場合は、まず Amazon DynamoDB の LambdaTable (Id) (Id は文字列型のハッシュキー) でテーブルを作成する必要があります。

Lambda 関数でサポートされている echo および ping のオペレーションをテストする場合は、DynamoDB テーブルを作成する必要はありません。

リソース (DynamoDBManager) のエンドポイントに HTTPS POST リクエストを送信するには、AmazonAPI Gateway の CLI コマンドを使用できます。Amazon API Gateway はデプロイ済みであるため、Curl を使用して同じオペレーション用のメソッドを呼び出すことができます。

Lambda 関数では、DynamoDB テーブル内に項目を作成する create オペレーションの使用がサポートされています。このオペレーションをリクエストするには、次の JSON を使用します。

{ "operation": "create", "tableName": "LambdaTable", "payload": { "Item": { "Id": "foo", "number": 5 } }}

リクエストボディに前述の JSON を使用して、リソース (DynamoDBManager) のエンドポイントに POSTメソッドの HTTPS リクエストを送信する、Amazon API Gateway の test-invoke-method コマンドを実行します。

$ aws apigateway test-invoke-method \--rest-api-id api-id \--resource-id resource-id \--http-method POST \

257

Page 264: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon API Gateway での AWS Lambda

の使用 (オンデマンド HTTPS 経由)

--path-with-query-string "" \--body "{\"operation\":\"create\",\"tableName\":\"LambdaTable\",\"payload\":{\"Item\":{\"Id\":\"1\",\"name\":\"Bob\"}}}"

または、次の Curl コマンドを使用することもできます。

curl -X POST -d "{\"operation\":\"create\",\"tableName\":\"LambdaTable\",\"payload\":{\"Item\":{\"Id\":\"1\",\"name\":\"Bob\"}}}" https://api-id.execute-api.aws-region.amazonaws.com/prod/DynamoDBManager

Lambda 関数でサポートされている echo オペレーション用のリクエストを送信するには、次のリクエストペイロードを使用できます。

{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" }}

リクエストボディに前述の JSON を使用して、リソース (DynamoDBManager) のエンドポイントに POSTメソッドの HTTPS リクエストを送信する、Amazon API Gateway の test-invoke-method CLI コマンドを実行します。

$ aws apigateway test-invoke-method \--rest-api-id api-id \--resource-id resource-id \--http-method POST \--path-with-query-string "" \--body "{\"operation\":\"echo\",\"payload\":{\"somekey1\":\"somevalue1\",\"somekey2\":\"somevalue2\"}}"

または、次の Curl コマンドを使用することもできます。

curl -X POST -d "{\"operation\":\"echo\",\"payload\":{\"somekey1\":\"somevalue1\",\"somekey2\":\"somevalue2\"}}" https://api-id.execute-api.region.amazonaws.com/prod/DynamoDBManager

ステップ 4: AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

258

Page 265: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda と API Gateway を使用してシンプルなマイクロサービスを作成する

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

Amazon API Gateway アプリケーションの仕様

このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、以前作成した ZIP パッケージの隣に保存します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: LambdaFunctionOverHttps: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime Policies: AmazonDynamoDBFullAccess Events: HttpPost: Type: Api Properties: Path: '/DynamoDBOperations/DynamoDBManager' Method: post

サーバーレスアプリケーションのデプロイ

パッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

Lambda と API Gateway を使用してシンプルなマイクロサービスを作成するこの演習では、Lambda コンソールを使用して Lambda 関数 (MyLambdaMicroservice) を作成し、Amazon API Gateway エンドポイントを使用してこの関数をトリガーします。エンドポイントの呼び出しがどの方法 (GET、POST、PATCH など) でも、Lambda 関数をトリガーできます。エンドポイントが呼び出されると、リクエスト全体が Lambda 関数にパススルーされます。関数のアクションはエンドポイントの呼び出し方法によって決まります。

• DELETE: DynamoDB テーブルから項目を削除します• GET: テーブルをスキャンし、すべての項目を返します• POST: 項目を作成します• PUT: 項目を更新します

次のステップステップ 3.1: Amazon API Gateway を使用して API を作成する (p. 259)

ステップ 3.1: Amazon API Gateway を使用して API を作成するこのセクションのステップに従って、新しい Lambda 関数とそれをトリガーする API Gateway エンドポイントを作成します。

1. AWS マネジメントコンソールにサインインし、AWS Lambda コンソールを開きます。2. [Create Lambda function] を選択します。

259

Page 266: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda と API Gateway を使用してシンプルなマイクロサービスを作成する

3. [: Select blueprint] ページで、[microservice-http-endpoint] 設計図を選択します。[Filter] を使用して検索できます。

4. [Configure triggers] ページに API Gateway トリガーが入力されます。作成される API のデフォルト名はLambdaMicroservice です (必要であれば、[API Name] で名前を変更できます)。

Note

ウィザードを完了して関数を作成すると、選択した API 名の下に Lambda によって自動的にMyLambdaMicroservice (関数名) というプロキシリソースが作成されます。プロキシリソースに関する詳細については、プロキシリソースのプロキシ統合を設定するを参照してください。プロキシリソースには、AWS_PROXY 統合タイプおよびキャッチオールメソッドである ANY があります。AWS_PROXY 統合タイプでは、Lambda はデフォルトのマッピングテンプレートを適用してリクエスト全体を Lambda 関数にパススルーし、Lambda 関数の出力をHTTP レスポンスに変換します。ANY メソッドは、GET、POST、PATCH、DELETE などを含むすべてのサポートされているメソッドに対して同じ統合設定を定義します。

トリガーを確認したら、[Next] を選択します。5. [: Configure function] ページで、以下の作業を行います。

a. Lambda 関数に事前に設定された情報を確認します。• [Runtime] は Node.js 6.10 です。• JavaScript で作成されたコードが提供されます。コードは呼び出されたメソッドと提供されたペイ

ロードに基づいて、DynamoDB オペレーションを実行します。• [Handler] には index.handler が表示されます。形式は次のとおりです。filename.handler-function

b. 関数名として、[MyLambdaMicroserviceName] に「」と入力します。c. [Role] に作成する新しいロールのロール名を入力します。

Note

[microservice-http-endpoint] 設計図は [Policy templates] フィールドの Simple Microservicepermission ポリシーテンプレートにあらかじめ入力されているため、新しいロールの作成時に追加できます。これにより、そのポリシーに添付されている必要なアクセス権限が自動的に新しいロールに追加されます。詳細については、「ポリシーテンプレート (p. 380)」を参照してください。

6. [Create function] を選択します。

次のステップ

ステップ 3.2: HTTPS リクエストの送信をテストする (p. 260)

ステップ 3.2: HTTPS リクエストの送信をテストするこのステップでは、コンソールを使用して Lambda 関数をテストします。さらに、curl コマンドを実行してエンドツーエンドの使い勝手をテストできます。つまり、HTTPS リクエストを API メソッドに送信し、Amazon API Gateway で Lambda 関数を呼び出します。ステップを完了するには、DynamoDB テーブルを作成し、「MyTable」という名前を付けたことを確認します。詳細については、「ステップ 3.1: ストリームが有効になった DynamoDB テーブルを作成する (p. 221)」を参照してください。

1. MyLambdaMicroService 関数をまだコンソールで開いている場合は、[Actions] タブを選択して[Configure test event] を選択します。

2. 既存のテキストを以下に置き換えます。

{ "httpMethod": "GET", "queryStringParameters": {

260

Page 267: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda と API Gateway を使用してシンプルなマイクロサービスを作成する

"TableName": "MyTable" }}

3. 上記のテキストを入力したら、[Save and test] を選択します。

次のステップ

ステップ 3.3: (オプション) 他の設計図を試す (p. 261)

ステップ 3.3: (オプション) 他の設計図を試す必要に応じて、以下の演習を試すことができます。

• この「開始方法」の演習では、[hello-world-python] 設計図を使用しました。この設計図には、Python で作成されたサンプルコードが用意されています。また、Node.js. で作成された同様の Lambda 関数コードが用意された [hello-world] 設計図もあります。

• [hello-world-python] と [hello-world] のいずれの設計図もカスタムイベントを処理します。この「開始方法」の演習では、独自に作成したサンプルイベントデータを使用しました。Amazon S3 や DynamoDBなどのイベントソースによって発行されるイベントを処理する Lambda 関数を記述できます。これには、コンソールでのイベントソースの設定が必要です。

たとえば、Amazon S3 イベントを処理する Lambda 関数を記述できます。その後、AWS Lambda にオブジェクト作成イベントを発行するように、イベントのソースとして Amazon S3 を設定します。バケットにオブジェクトをアップロードすると、Amazon S3 によってイベントが検出され、Lambda 関数が呼び出されます。Lambda 関数はパラメータとしてイベントデータを受け取ります。Lambda コンソールまたは CloudWatch コンソールのいずれかで CloudWatch ログを調べることで、Lambda 関数が実行されたことを確認できます。

Lambda コンソールには、Amazon S3 イベントを処理するように Lambda 関数の例を設定するための設計図が用意されています。[Select blueprint] ページでコンソールを使用して Lambda 関数を作成するとき、[Filter] ボックスに「s3」と入力して、使用可能な設計図のリストを検索します。

さまざまなイベントソースの使用の詳細については、「ユースケース (p. 182)」を参照してください。

次のステップ

次のステップ (p. 261)

次のステップこの「開始方法」の演習では、AWS Lambda コンソールの使用方法の概要を示しました。

AWS Lambda 関数は、Amazon S3 や DynamoDB などの他の AWS サービスでのイベントに応じて、自動的に呼び出されるようにもできます。Lambda 関数は HTTPS 経由でオンデマンドで呼び出すこともできます。また、独自のカスタムイベントソースを作成し、Lambda 関数をオンデマンドで呼び出すこともできます。

統合シナリオ (アプリケーションに必要なのがイベント駆動型の Lambda 関数呼び出しかオンデマンドの呼び出しか) に応じて、以下のセクションを参照してください。

• AWS Lambda を Amazon S3 に使用する (p. 182)• Kinesis で AWS Lambda を使用する (p. 200)• Amazon DynamoDB で AWS Lambda を使用する (p. 211)• AWS CloudTrail で AWS Lambda を使用する (p. 224)• Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) (p. 245)

261

Page 268: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドモバイルバックエンド (Android)

• モバイルアプリケーションのバックエンドとしての AWS Lambda の使用 (カスタムイベントソース:Android) (p. 262)

コンソールには、これらのイベントソースのイベントを処理できる Lambda 関数の例を設定するための設計図がいくつか用意されています。これらのイベントソースによってトリガーされる Lambda 関数の使用開始にあたって、コンソールで他の設計図を探ることもできます。

モバイルアプリケーションのバックエンドとしての AWS Lambda の使用 (カスタムイベントソース:Android)

AWS Lambda を使用して、モバイルアプリケーションのバックエンドロジックをホストできます。つまり、モバイルアプリのコードの一部を Lambda 関数として実行できます。これにより、モバイルアプリケーション自体に最小限のロジックを配置できるため、スケーリングと更新が簡単になります (たとえば、コードの更新部分をアプリケーションクライアントにデプロイせずに、Lambda 関数にのみ適用するだけで済みます)。

Lambda 関数を作成したら、AWS SDK for Android などの AWS Mobile SDK を使用して、モバイルアプリからその関数を呼び出すことができます。詳細については、「Tools for Amazon Web Services」を参照してください。

Note

また、いずれかの AWS SDK を使用する代わりに Amazon API Gateway を使用して、HTTP 経由で Lambda 関数を呼び出すこともできます。Amazon API Gateway によって、モバイルユーザーとアプリロジックとの間に、以下のことが可能になる別のレイヤーが追加されます。

• 個々のユーザーやリクエストを絞り込む。• 分散型サービス妨害攻撃から保護する。• Lambda 関数からの応答をキャッシュするキャッシュレイヤーを提供する。

モバイルアプリケーションと AWS Lambda の統合のしくみについては、以下の点に注意してください。

• プッシュイベントモデル – これはアプリがイベントデータをパラメーターとして渡して Lambda 関数を呼び出すモデルです (「イベントソースマッピング (p. 157)」を参照)。

• 同期または非同期呼び出し - アプリは Lambda 関数を呼び出して、呼び出しタイプとしてRequestResponse を指定することで (または非同期呼び出しには Event 呼び出しタイプを使用することで) リアルタイムで応答を取得できます。呼び出しタイプについては、「権限の管理: Lambda 関数ポリシーを使用する (p. 376)」を参照してください。

• イベント構成 - Lambda 関数が受け取るイベントは、アプリケーションによって定義され、Lambda 関数は、特定タイプのイベントを処理するために記述されたカスタムコードです。

エンドツーエンドのエクスペリエンスの設定で使用するアクセス権限ポリシーには以下の 2 タイプあります。

• Lambda 関数のアクセス権限 - Lambda 関数の呼び出し元にかかわらず、AWS Lambda は、Lambda 関数の作成時に指定された IAM ロール (実行ロール) を引き受けることで、その関数を実行します。このロールに関連付けられたアクセス権限ポリシーを使用して、Lambda 関数に必要なアクセス権限を付与します。たとえば、Lambda 関数にオブジェクトの読み取りが必要である場合は、アクセス権限ポリシーで、関連する Amazon S3 アクションのためのアクセス権限を付与します。詳細については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

262

Page 269: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• モバイルアプリが Lambda 関数を呼び出すためのアクセス権限 - アプリケーションには、Lambda 関数を呼び出すための有効なセキュリティ認証情報とアクセス権限が必要です。モバイルアプリケーションに対して、Amazon Cognito サービスを使用してユーザー ID、認証、アクセス権限を管理できます。

以下の図で示しているのは、アプリケーションのフローです (この図では、モバイルアプリが AWS MobileSDK for Android を使用して API の呼び出しを行っているとします)。

1. モバイルアプリケーションはリクエストを Amazon Cognito に送ります。リクエストには ID プール IDが含まれています (ID プールはセットアップ時に作成)。

2. Amazon Cognito が一時的なセキュリティ認証情報をアプリケーションに返します。

Amazon Cognito は、ID プールに関連付けられたロールを引き受け、一時的な認証情報を生成します。一時的な認証情報の取得に使用される Amazon Cognito ロールに関連付けられたアクセス権限ポリシーで定義されたアクセス権限によって、一時的な認証情報を使用してアプリケーションができることが制限されます。

Note

AWS SDK は一時的な認証情報をキャッシュし、アプリケーションが Lambda 関数を呼び出す必要があるたびに、Amazon Cognito にリクエストを送信しないようにできます。

3. モバイルアプリケーションは一時的な認証情報 (Cognito ID) を使用して Lambda 関数を呼び出します。4. AWS Lambda は実行ロールを引き受け、ユーザーの代わりに Lambda 関数を実行します。5. Lambda 関数が実行されます。6. AWS Lambda はモバイルアプリケーションに結果を返します。ただし、アプリケーションが

RequestResponse の呼び出しタイプ (同期呼び出し) を使用して Lambda 関数を呼び出したとします。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: モバイルアプリケーションのバックエンドとしての AWS Lambda の使用 (p. 263)」を参照してください。

チュートリアル: モバイルアプリケーションのバックエンドとしての AWS Lambda の使用このチュートリアルでは、シンプルな Android モバイルアプリケーションを作成します。このチュートリアルの主な目的は、さまざまなコンポーネントをフックして、Android モバイルアプリケーションが

263

Page 270: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Lambda 関数を呼び出し、応答を処理できるようにすることです。アプリ自体は単純で、以下のことを想定します。

• サンプルモバイルアプリケーションは以下の形式で名前 (姓と名) から成るイベントデータを生成します。

{ firstName: 'value1', lastName: 'value2' }

• Lambda 関数を使用してイベントを処理します。つまり、アプリは (AWS Mobile SDK for Android を使用して) イベントデータを渡して Lambda 関数 (ExampleAndroidEventProcessor) を呼び出します。このチュートリアルの Lambda 関数は以下の処理を行います。• Amazon CloudWatch Logs のログに受信イベントデータを記録する。• 正常に実行されると、応答の本文で単純な文字列を返す。モバイルアプリは Android Toast クラスを

使用してメッセージを表示します。

Note

このチュートリアルに示すように、モバイルアプリケーションが Lambda 関数を呼び出す方法は、AWS Lambda の request-response モデルの一例であり、アプリケーションは Lambda 関数を呼び出し、リアルタイムで応答を受け取ります。詳細については、「プログラミングモデル (p. 19)」を参照してください。

実装の要約このチュートリアルは大きく 2 つのセクションに分かれています。

• まず、Lambda 関数の作成に必要なセットアップを実行し、サンプルイベントデータを使用して手動でその関数を呼び出すことでテストします (Lambda 関数のテストにモバイルアプリは不要)。

• 次に、Amazon Cognito ID プールを作成して認証とアクセス権限を管理し、Android アプリケーションの例を作成します。続いて、アプリケーションを実行し、Lambda 関数を呼び出します。その後、エンドツーエンドのエクスペリエンスを確認できます。このチュートリアルの例:• Amazon Cognito サービスを使用して、ユーザー ID、認証、アクセス権限を管理できます。モバイル

アプリケーションには、Lambda 関数を呼び出す有効なセキュリティ認証情報とアクセス権限が必要です。アプリケーション設定の一環として、Amazon Cognito ID プールを作成してユーザー ID を保存し、アクセス権限を定義します。詳細については、「Amazon Cognito」を参照してください。

• このモバイルアプリケーションでは、ユーザーがログインする必要がありません。モバイルアプリケーションでは、ユーザーが Amazon や Facebook などのパブリック ID プロバイダーを使用してログインするよう要求できます。このチュートリアルの対象は限定されており、モバイルアプリケーションユーザーは認証されていないものとします。したがって、Amazon Cognito ID プールを設定するとき、以下の操作を行います。• 認証されていない ID 用のアクセスを有効にします。

Amazon Cognito には、Lambda 関数を呼び出すこれらのユーザー向けに、一意の識別子と一時的なAWS 認証情報が用意されています。

• 認証されていないユーザー用に、Lambda ロールと関連付けられたアクセス権限ポリシーで、IAM関数を呼び出すためのアクセス権限を追加します。ID プールには関連する 2 つの IAM ロールがあります。1 つは、認証されたアプリケーションユーザー用で、もう 1 つは認証されていないアプリケーションユーザー用です。この例では、Amazon Cognito は認証されていないユーザーが一時的な認証情報を取得するためのロールを引き受けます。アプリがこれらの一時的な認証情報を使用して Lambda 関数を呼び出せるのは、必要なアクセス権限がある場合のみです (つまり、認証情報が有効であっても、さらにアクセス権限が必要です)。そのためには、Amazon Cognito が一時的な認証情報を取得するために使用するアクセス権限ポリシーを更新します。

次の図はアプリケーションフローを示しています。

264

Page 271: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

これで、チュートリアルを開始する準備ができました。

次のステップステップ 1: 準備 (p. 265)

ステップ 1: 準備次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、以下を参照してください。AWS アカウントのセットアップ (p. 4)

• AWS CLI をインストールしてセットアップした。手順については、以下を参照してください。AWSCommand Line Interface のセットアップ (AWS CLI) (p. 6)

Note

チュートリアルでは、us-east-1 リージョンで Lambda 関数と Amazon Cognito ID を作成します。別の AWS リージョンを使用する場合は、同じリージョンでこれらのリソースを作成してください。また、使用する特定のリージョンを指定して、サンプルモバイルアプリケーションのコードを更新する必要もあります。

次のステップ

ステップ 2: Lambda 関数を作成して手動で呼び出す (サンプルイベントデータを使用) (p. 265)

ステップ 2: Lambda 関数を作成して手動で呼び出す (サンプルイベントデータを使用)このセクションでは、以下の作業を行います。

• 提供されたサンプルの コードを使用して Lambda 関数のデプロイパッケージを作成します。モバイルアプリケーションのイベントを処理する Lambda 関数のサンプルコードが、さまざまな言語で提供されています。いずれかの言語を選択し、該当する手順に従ってデプロイパッケージを作成します。

265

Page 272: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Note

他の Lambda 関数の呼び出しなど、関数内で他の AWS サービスを使用するその他の例については、「AWS SDK for JavaScript」を参照してください。

• IAM ロール (実行ロール) を作成します。デプロイパッケージをアップロードするときは、IAM ロール(実行ロール) を指定する必要があります。これは、AWS Lambda がユーザーの代わりに Lambda 関数を呼び出すために引き受けるロールです。

• デプロイパッケージをアップロードして Lambda 関数を作成したら、サンプルイベントデータを使用してその関数を手動で呼び出すことでテストします。

トピック• ステップ 2.1: デプロイパッケージを作成する (p. 266)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 268)• ステップ 2.3: Lambda 関数を作成して手動で呼び出す (サンプルイベントデータを使用) (p. 269)

ステップ 2.1: デプロイパッケージを作成する

[Filter View] リストから、Lambda 関数で使用する言語を選択します。該当するセクションに、デプロイパッケージを作成するためのコードと所定の手順が表示されます。

Node.js

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

exports.handler = function(event, context, callback) { console.log("Received event: ", event); var data = { "greetings": "Hello, " + event.firstName + " " + event.lastName + "." }; callback(null, data);}

Note

コードサンプルは、Node.js ランタイム v6.10 または v4.3 に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. AndroidBackendLambdaFunction.js という名前でファイルを保存します。3. AndroidBackendLambdaFunction.js ファイルを AndroidBackendLambdaFunction.zip とい

う名前で ZIP 圧縮します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 268)

Java

次の Java コードを使用して、Lambda 関数 (AndroidBackendLambdaFunction) を作成します。コードは、ハンドラーへの最初のパラメータとして Android アプリイベントデータを受け取ります。その後、コードはイベントデータを処理します (説明のために、このコードは CloudWatch Logs にイベントデータの一部を書き込み、応答で文字列を返します)。

266

Page 273: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

コードで、handler (myHandler) は入出力に RequestClass および ResponseClass 型を使用します。コードでは、これらの型を実装しています。

Important

次のセクションで、サンプルモバイルアプリケーションを作成するときに、サンプルクラス(POJO) を使用して入出力データを処理します。

package example;

import com.amazonaws.services.lambda.runtime.Context;

public class HelloPojo {

// Define two classes/POJOs for use with Lambda function. public static class RequestClass { String firstName; String lastName;

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public RequestClass(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }

public RequestClass() { } }

public static class ResponseClass { String greetings;

public String getGreetings() { return greetings; }

public void setGreetings(String greetings) { this.greetings = greetings; }

public ResponseClass(String greetings) { this.greetings = greetings; }

public ResponseClass() { }

}

public static ResponseClass myHandler(RequestClass request, Context context){

267

Page 274: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

String greetingString = String.format("Hello %s, %s.", request.firstName, request.lastName); context.getLogger().log(greetingString); return new ResponseClass(greetingString); }}

ファイル (HelloPojo.java) に先ほどのコードを保存します。デプロイパッケージを作成します。以下の依存関係を含める必要があります。

• aws-lambda-java-core

デプロイパッケージは、.zip ファイルまたはスタンドアロン .jar とすることができます。デプロイパッケージを作成するために、使い慣れた任意のビルドおよびパッケージ化ツールを使用できます。Maven ビルドツールを使用してスタンドアロン .jar を作成する方法の例については、「IDE なしで Maven を使用した .jar デプロイパッケージの作成 (Java) (p. 97)」および「Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java) (p. 99)」を参照してください。Gradle ビルドツールを使用して .zip ファイルを作成する方法の例については、「.zip デプロイパッケージの作成 (Java) (p. 102)」を参照してください。

デプロイパッケージ (lambda-java-example-1.0-SNAPSHOT.jar) が作成されたことを確認したら、次のセクションに進み、IAM ロール (実行ロール) を作成します。Lambda 関数を作成するときに、そのロールを指定します。

次のステップ

ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 268)

ステップ 2.2: 実行ロール (IAM ロール) を作成するこのセクションでは、以下に示す定義済みのロールタイプとアクセスポリシーを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

• AWSLambdaBasicExecute - ロールにアタッチするアクセス権限ポリシー。この Lambda 関数はCloudWatch Logs にログを書き込むのみです。したがって、特定の CloudWatch アクションのためのアクセス権限が必要です。このポリシーはそれらのアクセス権限を付与します。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (lambda-android-execution-role など) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で、[AWSLambdaBasicExecute] を選択します。このチュートリアルの Lambda 関数では、このポリシーでのアクセス権限で十分です。

3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になります。

268

Page 275: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次のステップ

ステップ 2.3: Lambda 関数を作成して手動で呼び出す (サンプルイベントデータを使用) (p. 269)

ステップ 2.3: Lambda 関数を作成して手動で呼び出す (サンプルイベントデータを使用)

このセクションでは、以下の作業を行います。

• デプロイパッケージをアップロードして、Lambda 関数を作成します。• Lambda 関数を手動で呼び出してテストします。イベントソースを作成する代わりに、サンプルイベン

トデータを使用します。次のセクションでは、Android モバイルアプリを作成し、エンドツーエンドのエクスペリエンスをテストします。

ステップ 2.3.1: Lambda 関数を作成する (デプロイパッケージをアップロードする)

このステップでは、AWS CLI を使用してデプロイパッケージをアップロードします。

コマンドプロンプトで、create-functionadminuser を使用して、次の Lambda CLI の profile コマンドを実行します。

このコマンドは、.zip ファイルのパスと実行ロールの ARN に実際の値を指定して更新する必要があります。--runtime パラメータ値には、コードの作成用に選択した言語に応じて、nodejs8.10、nodejs6.10 または nodejs4.3、または java8 のいずれかを指定します。

$ aws lambda create-function \--region us-east-1 \--function-name AndroidBackendLambdaFunction \--zip-file fileb://file-path-to-jar-or-zip-deployment-package \--role execution-role-arn \--handler handler-name \--runtime runtime-value \--profile adminuser

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

Note

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソール UI で同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

サンプルイベントデータを使用して手動で関数を呼び出します。コンソールを使用して関数を呼び出すことをお勧めします。コンソールには、実行の要約、コードによって書き込まれたログ、関数が返した結果など、実行の結果を確認しやすい UI が用意されているためです (これは、コンソールが常に同期実行を行う、つまり RequestResponse 呼び出しタイプを使用して Lambda 関数を呼び出すからです)。

Lambda 関数をテストするには (AWS マネジメントコンソール)

1. 「開始方法」の演習の手順に従って、Lambda 関数を作成して呼び出します (「Lambda 関数を手動で呼び出し、結果、ログ、メトリクスを確認する (p. 12)」を参照)。Lambda 関数を選択したら、

269

Page 276: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

[Actions] メニューの [Configure test event] を選択して、以下のサンプルイベントデータを指定します。

{ "firstName": "first-name", "lastName": "last-name" }

2. コンソールで結果を確認します。

• [Execution result] は Succeeded と以下の戻り値になります。

{ "greetings": "Hello first-name, last-name."}

• [Summary] と [Log output] セクションを確認します。

Lambda 関数をテストする (AWS CLI)

1. 以下のサンプルイベント JSON を input.txt ファイル に保存します。

{ "firstName": "first-name", "lastName": "last-name" }

2. 以下の invoke コマンドを実行します。

$ aws lambda invoke \--invocation-type Event \--function-name AndroidBackendLambdaFunction \--region us-east-1 \--payload file://file-path/input.txt \--profile adminuser outputfile.txt

Note

このチュートリアルの例では、メッセージは outputfile.txt ファイルに保存されます。同期実行 (呼び出しタイプが RequestResponse) をリクエストした場合、その関数は応答の本文で文字列メッセージを返します。Node.js の場合は、次のいずれかです (コード内で指定している)。context.succeed("message")context.fail("message")context.done(null, "message)Java の場合、return ステートメントにあるのがメッセージです。return "message"

次のステップ

ステップ 3: Amazon Cognito ID プールを作成する (p. 270)

ステップ 3: Amazon Cognito ID プールを作成するこのセクションでは、Amazon Cognito ID プールを作成します。ID プールには 2 つの IAM ロールがあります。認証されていないユーザー用に IAM ロールを更新し、AndroidBackendLambdaFunctionLambda 関数を実行するためのアクセス権限を付与します。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。AmazonCognito のサービスの詳細については、Amazon Cognito 製品の詳細ページを参照してください。

270

Page 277: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

ID プールを作成するには

1. IAM ユーザーのサインイン URL を使用して、Amazon Cognito コンソールに adminuser としてサインインします。

2. JavaFunctionAndroidEventHandlerPool という名前の新しい ID プールを作成します。ID プールを作成する手順に従う前に、次のことに注意してください。

• 作成する ID プールでは、認証されていない ID へのアクセスを許可する必要があります。この例のモバイルアプリケーションでは、ユーザーがログインする必要はないためです (アプリケーションユーザーは認証されません)。したがって、必ず [Enable access to unauthenticatedidentities] オプションを選択してください。

• 認証されていないアプリケーションユーザーは、Lambda 関数を呼び出すアクセス権限を必要とします。これを有効にするには、認証されていない ID に関連付けられているアクセス権限ポリシーに以下のステートメントを追加します (それにより、特定の Lambda 関数でlambda:InvokeFunction アクションのためのアクセス権限が付与されます。アカウント ID でリソース ARN を更新する必要があります)。

{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:account-id:function:AndroidBackendLambdaFunction" ]}

作成されるポリシーは次のとおりです。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "mobileanalytics:PutEvents", "cognito-sync:*" ], "Resource":[ "*" ] }, { "Effect":"Allow", "Action":[ "lambda:invokefunction" ], "Resource":[ "arn:aws:lambda:us-east-1:account-id:function:AndroidBackendLambdaFunction" ] } ]}

Note

ID プールの作成時にポリシーを更新できます。ID プールを作成したら、ポリシーを更新できます。その場合は必ず、Amazon Cognito コンソールから認証されていないユーザーの

271

Page 278: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

IAM ロール名をメモしておいてください。続いて、IAM コンソールに移動し、特定のロールを検索して、アクセス権限ポリシーを編集します。

ID プールを作成する方法については、Amazon Cognito コンソールにログインし、[New Identity Pool]ウィザードに従います。

3. ID プール ID をメモしておきます。次のセクションで作成するモバイルアプリケーションで、このID を指定します。アプリは一時的なセキュリティ認証情報をリクエストするために、リクエストをAmazon Cognito に送る際に、この ID を使用します。

次のステップステップ 4: Android 用モバイルアプリケーションを作成する (p. 272)

ステップ 4: Android 用モバイルアプリケーションを作成するこれで、イベントを生成し、パラメータとしてイベントデータを渡すことで Lambda 関数を呼び出すシンプルな Android モバイルアプリケーションを作成できます。

次の手順は、Android Studio を使用して確認されました。

1. 次の設定を使用して、AndroidEventGenerator という新しい Android プロジェクトを作成します。

• [Phone and Tablet] プラットフォームを選択します。• [Blank Activity] を選択します。

2. build.gradle (Module:app) ファイルで、dependencies セクションに以下を追加します。

compile 'com.amazonaws:aws-android-sdk-core:2.2.+'compile 'com.amazonaws:aws-android-sdk-lambda:2.2.+'

3. プロジェクトをビルドし、必要な依存関係が必要に応じてダウンロードされるようにします。4. Android アプリケーションマニフェスト (AndroidManifest.xml) で、次のアクセス権限を追加し、

アプリケーションがインターネットに接続できるようにします。アクセス権限は、</manifest> 終了タグの直前に追加できます。

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5. MainActivity で、次のインポートを追加します。

import com.amazonaws.mobileconnectors.lambdainvoker.*;import com.amazonaws.auth.CognitoCachingCredentialsProvider;import com.amazonaws.regions.Regions;

6. [package] セクションで、以下の 2 つのクラス (RequestClass と ResponseClass) を追加します。POJO が、前のセクションの Lambda 関数で作成した POJO と同じであることに注意してください。

• RequestClass。このクラスのインスタンスは、名と姓で構成されるイベントデータの POJO(Plain Old Java Object) として機能します。前のセクションで作成した Lambda 関数に Java の例を使用している場合、この POJO は Lambda 関数コードで作成した POJO と同じです。

package com.example....lambdaeventgenerator;public class RequestClass { String firstName; String lastName;

272

Page 279: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public RequestClass(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }

public RequestClass() { }}

• ResponseClass

package com.example....lambdaeventgenerator;public class ResponseClass { String greetings;

public String getGreetings() { return greetings; }

public void setGreetings(String greetings) { this.greetings = greetings; }

public ResponseClass(String greetings) { this.greetings = greetings; }

public ResponseClass() { }}

7. 同じパッケージで、AndroidBackendLambdaFunction Lambda 関数を呼び出すために、MyInterface という名前のインターフェイスを作成します。

Note

コード内の @LambdaFunction の注釈により、特定のクライアントメソッドが同じ名前のLambda 関数にマッピングされます。この注釈の詳細については、『AWS Mobile SDK forAndroid Developer Guide』の「AWS Lambda」を参照してください。

package com.example.....lambdaeventgenerator;import com.amazonaws.mobileconnectors.lambdainvoker.LambdaFunction;public interface MyInterface {

/** * Invoke the Lambda function "AndroidBackendLambdaFunction". * The function name is the method name.

273

Page 280: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

*/ @LambdaFunction ResponseClass AndroidBackendLambdaFunction(RequestClass request);

}

8. アプリケーションをシンプルに保つため、onCreate() イベントハンドラーで Lambda 関数を呼び出すコードを追加します。MainActivity で、onCreate() コードの末尾に以下のコードを追加します。

// Create an instance of CognitoCachingCredentialsProviderCognitoCachingCredentialsProvider cognitoProvider = new CognitoCachingCredentialsProvider( this.getApplicationContext(), "identity-pool-id", Regions.US_WEST_2);

// Create LambdaInvokerFactory, to be used to instantiate the Lambda proxy.LambdaInvokerFactory factory = new LambdaInvokerFactory(this.getApplicationContext(), Regions.US_WEST_2, cognitoProvider);

// Create the Lambda proxy object with a default Json data binder.// You can provide your own data binder by implementing// LambdaDataBinder.final MyInterface myInterface = factory.build(MyInterface.class);

RequestClass request = new RequestClass("John", "Doe");// The Lambda function invocation results in a network call.// Make sure it is not called from the main thread.new AsyncTask<RequestClass, Void, ResponseClass>() { @Override protected ResponseClass doInBackground(RequestClass... params) { // invoke "echo" method. In case it fails, it will throw a // LambdaFunctionException. try { return myInterface.AndroidBackendLambdaFunction(params[0]); } catch (LambdaFunctionException lfe) { Log.e("Tag", "Failed to invoke echo", lfe); return null; } }

@Override protected void onPostExecute(ResponseClass result) { if (result == null) { return; }

// Do a toast Toast.makeText(MainActivity.this, result.getGreetings(), Toast.LENGTH_LONG).show(); }}.execute(request);

9. コードを実行し、以下のように確認します。

• Toast.makeText() に、返されたレスポンスが表示されます。• CloudWatch Logs に、Lambda 関数によって作成されたログが示されます。これはイベントデータ

(名と姓) を示します。この情報も、AWS Lambda コンソールで確認できます。

274

Page 281: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド予定されているイベント

スケジュールされたイベントでの AWS Lambda の使用

Lambda 関数を作成して、AWS Lambda を定期的なスケジュールで実行するように指示できます。固定の間隔を指定する (たとえば、1 時間ごとまたは 15 分ごとに Lambda 関数を実行する) ことも、Cron 式を指定することもできます。スケジュール式の詳細については、「Rate または Cron を使用したスケジュール式 (p. 279)」を参照してください。

この機能は AWS Lambda コンソールまたは AWS CLI を使用して Lambda 関数を作成する場合に使用できます。AWS CLI を使用して設定するには、スケジュールに基づいて AWS CLI で AWS Lambda 関数を実行するを参照してください。コンソールはイベントソースとして [CloudWatch イベント] を提供します。Lambda 関数の作成時に、このイベントのソースを選択し、時間間隔を指定します。

関数のアクセス許可を手動で変更した場合は、スケジュールされたイベントに関数へのアクセスを再適用する必要が生じることがあります。これを行うには、次の CLI コマンドを使用します。

aws lambda add-permission \ --statement-id 'statement_id' \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:region:account-id:rule/rule_name \ --function-name:function_name \ --region region

Note

各 AWS アカウントは、[CloudWatch イベント- スケジュール] ソースタイプの最大 100 個の一意なイベントソースを指定できます。それぞれが、最大 5 つの Lambda 関数のイベントソースになります。つまり、AWS アカウントで最大 500 のスケジュールで実行する Lambda 関数を使用できます。

コンソールにはまた、[CloudWatch イベント- スケジュール] ソースタイプを使用する設計図 (lambda-canary) が用意されています。この設計図を使用して、Lambda 関数の例を作成し、この機能をテストできます。設計図が提供するサンプルコードは、特定のウェブページの存在およびそのウェブページ内の特定の文字列の存在を確認します。ウェブページまたは文字列が見つからない場合、Lambda 関数はエラーをスローします。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: スケジュールされたイベントでの AWS Lambda の使用 (p. 275)」を参照してください。

チュートリアル: スケジュールされたイベントでのAWS Lambda の使用このチュートリアルでは、以下の作業を行います。

• [lambda-canary] 設計図を使用して Lambda 関数を作成します。毎分ごとに実行されるように Lambda関数を設定します。関数がエラーを帰す場合、AWS Lambda が CloudWatch にエラーメトリクスを記録することに注意してください。

• Lambda 関数の Errors メトリクスに CloudWatch アラームを設定して、AWS Lambda が CloudWatchにエラーメトリクスを送信すると、Amazon SNS トピックにメッセージを投稿するようにします。Amazon SNS トピックに、電子メール通知を受け取るようにサブスクライブします。このチュートリアルでは、以下の手順でこの設定を行います。• Amazon SNS トピックを作成します。

275

Page 282: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• 新しいメッセージがトピックに投稿されたときに E メール通知を取得するようにトピックにサブスクライブします。

• Amazon CloudWatch で Lambda 関数の Errors メトリクスにアラームを設定し、エラー発生時にSNS トピックにメッセージを発行するようにします。

次のステップステップ 1: Lambda 関数を作成する (p. 276)

ステップ 1: Lambda 関数を作成する1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある

AWS Lambda コンソールを開きます。2. [Create function] を選択します。3. [設計図] を選択し、[lambda-canary] 設計図を選択します。4. 基本的な情報で、関数に [名前*] を入力します。5. [Role*] で、[Choose an existing role] を選択します。6. [Existing role*] で、[lambda_basic_execution] を選択します。7. [CloudWatch イベント] で [ルール] リストを選択して、[新規ルールの作成] を選択します。

• [Rule name] に名前 (たとえば、CheckWebsiteScheduledEvent) を入力します。• [Rule description] に説明を入力します (たとえば CheckWebsiteScheduledEvent trigger)。• [スケジュール式] を選択し、rate(1 minute) (レート (1 分)) を指定します。値は rate またはcron 式形式で指定できることに注意してください。すべてのスケジュールのタイムゾーンは UTCで、最小精度は 1 分です。

Note

間隔の式を設定すると、最初の実行は即時に発生し、それ以降の実行は間隔のスケジュールに基づいて発生します。前述の例では、それ以降の実行の間隔は 1 分ごとです。

スケジュール式の詳細については、「Rate または Cron を使用したスケジュール式 (p. 279)」を参照してください。

 • [Enable trigger] は、テストまでこのトリガーは無効にしておくことをお勧めします。• [Lambda function code] (関数コード) セクションを書き留めます。このサンプルコードは、関数の作

成後に設定できます。さらに、コンソールでは Lambda がサポートするランタイムの選択とカスタムコードの追加ができます。

Important

前に述べたように、設計図で提供されるコードは関数作成後に編集できます。ただし、これは次に説明するように、 SITE および EXPECTED 変数を設定できる環境変数のプレースホルダ―として使用することに注意してください。

• この [環境変数] セクションでは、関数コードを更新する必要なく Lambda 関数に適用できる設定を指定します。この場合、 [site] (サイト) キーの URL 値および [expected] (期待) キーのこのサイトから返される期待値を指定できます。これらの値を指定することは強く推奨されますが、この関数には環境変数を選択することは避けてください。この関数を作成する前に、[site] および [expected]フィールドの両方で [<enter value here] (ここに値を入力) フィールドを空にすることが必要となります。また、サンプル関数コードを更新して、使用するリテラル値で SITE および EXPECTED 変数を置き換える必要があります。

• [Create function] を選択します。276

Page 283: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Note

Lambda 関数を作成したら、関数の要件に合わせて環境変数の追加あるいは更新もできます。詳細については、「Environment Variables (p. 391)」を参照してください。

次のステップ

ステップ 2: Lambda 関数をテストする (サンプルテストイベントを使用) (p. 277)

ステップ 2: Lambda 関数をテストする (サンプルテストイベントを使用)1. 前のステップで作成した関数を選択し、[Test] を選択します。2. [Input sample event] ページで、[Sample event] リスト内の [Scheduled Event] を選択します。

サンプルイベントのイベント時間に注意してください。この値は、予定された間隔で AWS Lambdaが関数を呼び出す場合は異なります。サンプルの Lambda 関数コードはこの時間を CloudWatch Logsに記録します。

3. [Save and test] を選択し、[Execution result] セクションが成功を示すのを確認します。

次のステップ

ステップ 3: Amazon SNS トピックを作成してサブスクライブする (p. 277)

ステップ 3: Amazon SNS トピックを作成してサブスクライブする1. Amazon SNS コンソールを使用して SNS トピックを作成します。手順については、Amazon Simple

Notification Service 開発者ガイドのトピックの作成を参照してください。2. トピックを受信します。この実習では、通信プロトコルとしてメールを使用します。手順について

は、Amazon Simple Notification Service 開発者ガイドのトピックのサブスクライブを参照してください。

この Amazon SNS トピックは、次のステップで AWS Lambda がエラーを返したときにアラームがこのトピックに通知を発行するように CloudWatch アラームを設定するときに使用します。

次のステップ

ステップ 4: CloudWatch アラームを設定する (p. 277)

ステップ 4: CloudWatch アラームを設定するCloudWatch アラームを設定するには、『Amazon CloudWatch ユーザーガイド』の「アラームの作成」の手順に従います。ステップを実行する際は、以下の点に注意してください。

• [Create Alarm] (1. Select Metric] ステップ) で [Lambda Metrics] を選択し、次に作成した Lambda 関数に対して [Errors] ([Metric Name] は [Errors]) を選択します。また、統計ドロップダウンで、設定を[Average] から [Sum] に変更します。

• [Create Alarm] (2. Define Metric] ステップ) で、アラームのしきい値を [Whenever: Errors is >= 1] に設定し、[Send notification to:] リストから Amazon SNS トピックを選択します。

277

Page 284: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

次のステップ

ステップ 5: Lambda 関数を再テストする (p. 278)

ステップ 5: Lambda 関数を再テストするLambda 関数を再度テストします。今回は、存在しないウェブページの URL または文字列を指定してコードを更新します。これにより、関数はエラーを返し、AWS Lambda は CloudWatch にエラーメトリクスを送ります。CloudWatch はこのメッセージを Amazon SNS トピックに投稿し、E メール通知が届きます。

(オプション): AWS SAM と AWS CloudFormation でデプロイ前のセクションでは、ZIP ファイルとしてデプロイパッケージを指定することにより、AWS Lambda APIを使用して Lambda 関数を作成および更新しました。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレスアプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation はアマゾン ウェブ サービス リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。

さらに、AWS サーバーレスアプリケーションモデルを使用して、サーバーレスアプリケーションを構成するリソースを表現することもできます。Lambda 関数や API のようなこれらのリソースタイプは AWSCloudFormation によって完全にサポートされており、サーバーレスアプリケーションの定義およびデプロイが容易になります。

詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

スケジュールされたイベントアプリケーションの仕様

このアプリケーションの SAM テンプレートを次に示します。下のテキストを .yaml ファイルにコピーし、以前作成した ZIP パッケージの隣に保存します。Runtime: パラメータ値が前のセクションで選択した値と一致することを確認します。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Parameters: NotificationEmail: Type: StringResources: CheckWebsitePeriodically: Type: AWS::Serverless::Function Properties: Handler: LambdaFunctionOverHttps.handler Runtime: runtime Policies: AmazonDynamoDBFullAccess Events: CheckWebsiteScheduledEvent: Type: Schedule Properties: Schedule: rate(1 minute)

AlarmTopic: Type: AWS::SNS::Topic Properties: Subscription:

278

Page 285: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

- Protocol: email Endpoint: !Ref NotificationEmail

Alarm: Type: AWS::CloudWatch::Alarm Properties: AlarmActions: - !Ref AlarmTopic ComparisonOperator: GreaterThanOrEqualToThreshold Dimensions: - Name: FunctionName Value: !Ref CheckWebsitePeriodically EvaluationPeriods: String MetricName: Errors Namespace: AWS/Lambda Period: '60' Statistic: Sum Threshold: '1'

サーバーレスアプリケーションのデプロイ

パッケージおよびデプロイコマンドを使用してサーバーレスアプリケーションをパッケージングしてデプロイする方法については、パッケージ化とデプロイ (p. 317)を参照してください。

Rate または Cron を使用したスケジュール式間隔の式

rate(Value Unit)

各パラメーターの意味は次のとおりです。

Value には正の整数を指定できます。

Unit には分、時、日を指定できます。

以下に例を示します。

例 Cron 式

Lambda 関数を 5 分ごとに呼び出すrate(5 minutes)

Lambda 関数を 1 時間ごとに呼び出すrate(1 hour)

Lambda 関数を 7 日ごとに呼び出すrate(7 days)

次の点に注意してください。

• 1 分より短い間隔はサポートされていません。• 単数の値に対しては単位も単数 (たとえば、rate(1 day))、そうでない場合は複数 (たとえ

ば、rate(5 days)) にする必要があります。

 

279

Page 286: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

Cron 式

cron(Minutes Hours Day-of-month Month Day-of-week Year)

すべてのフィールドが必須であり、タイムゾーンは UTC のみです。次の表は、これらのフィールドを示しています。

フィールド 値 ワイルドカード

分 0-59 , - * /

時間 0-23 , - * /

日 1-31 , - * ? / L W

月 1-12 または JAN-DEC

, - * /

曜日 1-7 または SUN-SAT

, - * ? / L #

年 1970-2199 , - * /

次の表に、ワイルドカード文字を示します。

文字 定義 例

/ 増分を指定します minutes フィールドの 0/15 は、15 分ごとに実行が発生するように指定します。

L "最後" を指定します

Day-of-month フィールドに使用された場合、その月の末日が指定されます。Day-of-week フィールドに使用された場合、週の最後の曜日 (土曜日) が指定されます。

W 平日を指定します 日付とともに使用した場合 (5/W など)、その月の 5 日に最も近い平日が指定されます。5 日が土曜日の場合、実行は金曜日に発生します。5 日が日曜日の場合、実行は月曜日に発生します。

# その月の n 番目の日を指定します

3#2 は、月の第 2 火曜日を意味します (火曜日は週 7 日の 3番目の曜日です)。

* すべての値を指定します

Day-of-month フィールドで使用した場合、月のすべて日を意味します。

? 値を指定しません 指定した別の値とともに使用されます。たとえば、特定の日付を指定したが、その日が何曜日であってもかまわない場合です。

- 範囲を指定します 10-12 は 10、11、および 12 を意味します

, 追加の値を指定します

SUN, MON, TUE は、日曜日、月曜日、および火曜日を意味します

/ 増分を指定します 5/10 は、5、15、25、35 などを意味します

次の表に一般的な Cron 式の例を示します。

280

Page 287: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドカスタムユーザーアプリケーション

例 Cron 式

毎日午前 10:00 (UTC) に Lambda関数を呼び出す cron(0 10 * * ? *)

毎日午後 12:15 (UTC) に Lambda関数を呼び出す cron(15 12 * * ? *)

毎月曜~金曜の午後 06:00 (UTC)に Lambda 関数を呼び出す cron(0 18 ? * MON-FRI *)

毎月最初の日の午前 8:00 (UTC)に Lambda 関数を呼び出す cron(0 8 1 * ? *)

月曜~金曜の 10 分ごとにLambda 関数を呼び出す cron(0/10 * ? * MON-FRI *)

月曜~金曜の午前 8:00 ~ 午後 5:55 (UTC) の間 5 分ごとにLambda 関数を呼び出す

cron(0/5 8-17 ? * MON-FRI *)

毎月最初の月曜日の午前 9 時(UTC) に Lambda 関数を呼び出す

cron(0 9 ? * 2#1 *)

次の点に注意してください。

• 1 分より短い間隔を導き出す cron 式はサポートされていません。• 日または週日の値は疑問符である必要があります (?)。

カスタムユーザーアプリケーションでの AWSLambda の使用

AWS Lambda を使用するユースケースの 1 つは、ユーザーアプリケーションによって生成されたイベントの処理です。デモンストレーションの目的では、Lambda 関数を呼び出すユーザーアプリケーションを記述する必要はありません。代わりに、このセクションのチュートリアルでは、Lambda 関数を手動で呼び出すために使用できるサンプルイベントデータが提供されています。

ユーザーアプリケーションが Lambda 関数を呼び出す場合、それはアプリケーションが Lambda 関数を呼び出し、リアルタイムでレスポンスを受け取る、AWS Lambda の request-response モデルの例です。

セットアップの例を説明しているチュートリアルについては、「チュートリアル: カスタムユーザーアプリケーションでの AWS Lambda の使用 (p. 281)」を参照してください。

チュートリアル: カスタムユーザーアプリケーションでの AWS Lambda の使用このチュートリアルでは、AWS CLI を使用して Lambda 関数の作成と呼び出しを行うとともに、その他のAWS Lambda API について説明します。

以下を実行します。

• 受信イベントをパラメータとして処理する Lambda 関数を作成します。次の Node.js コードの例を使用して、Lambda 関数を作成します。

281

Page 288: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

console.log('Loading function');

exports.handler = function(event, context, callback) { console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); callback(null,"Success"); };

Note

コードサンプルは、Node.js ランタイム v4.3 以降に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

この関数はシンプルです。受信イベントデータをログ記録して処理します (これらのログは AmazonCloudWatch で利用可能)。request-response モデルでは、レスポンスでログデータを返すようリクエストできます。

• 次のサンプルイベントデータを使用して Lambda 関数を手動で呼び出すことにより、Lambda 関数にイベントを送信するユーザーアプリケーションをシミュレートします。

{ "key1": "value1", "key2": "value2", "key3": "value3"}

Note

この例は「ご利用開始にあたって」の実習に似ています (「ご利用開始にあたって (p. 3)」を参照)。「使用開始」の演習では、コンソールベースの操作が提供されることが異なります。コンソールでは、多くのことが自動的に実行され、操作が簡単になります。AWS CLI を使用する場合は、AWS Lambda の操作をより深く理解するために役立つ、API 呼び出しの生の経験が得られます。Lambda 関数の作成と呼び出しに加えて、その他の Lambda API についても学習できます。

次のステップステップ 1: 準備 (p. 282)

ステップ 1: 準備次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、「AWS アカウントのセットアップ (p. 4)」を参照してください。

• AWS CLI をインストールしてセットアップした。手順については、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

次のステップステップ 2: Lambda関数を作成し、手動で呼び出す (p. 282)

ステップ 2: Lambda関数を作成し、手動で呼び出すこのセクションでは、以下の作業を行います。

282

Page 289: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• デプロイパッケージを作成します。デプロイパッケージは、コードと依存関係を含む .zip ファイルです。このチュートリアルでは、依存関係を持たないシンプルなサンプルコードを使用します。

• IAM ロール (実行ロール) を作成します。デプロイパッケージのアップロード時には、ユーザーに代わって関数を実行するために Lambda が引き受けることができる IAM ロール (実行ロール) を指定する必要があります。

このロールには、Lambda 関数が必要とするアクセス権限も付与します。このチュートリアルのコードでは、Amazon CloudWatch Logs にログに書き込みます。従って、CloudWatch アクションのためのアクセス権限を付与する必要があります。詳細については、「AWS Lambda Watch ログ」を参照してください。

• CLI コマンド create-function を使用して、Lambda 関数 (HelloWorld) を作成します。基盤となるAPI および関連パラメータの詳細については、「CreateFunction (p. 425)」を参照してください。

トピック• ステップ 2.1: Lambda 関数デプロイパッケージを作成する (p. 283)• ステップ 2.2: 実行ロール (IAM ロール) を作成する (p. 283)• ステップ 2.3: Lambda 関数を作成する (p. 284)• 次のステップ (p. 285)

ステップ 2.1: Lambda 関数デプロイパッケージを作成する

AWS Lambda 関数デプロイパッケージを作成する手順に従います。

1. テキストエディターを開き、次のコードをコピーします。

console.log('Loading function');

exports.handler = function(event, context, callback) { console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); callback(null, "Success"); };

Note

コードサンプルは、Node.js ランタイム 4.3 以降に準拠しています。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2. helloworld.js という名前でファイルを保存します。3. helloworld.js ファイルを helloworld.zip という名前で ZIP 圧縮します。

Note

他の Lambda 関数の呼び出しなど、関数内で他の AWS サービスを使用するその他の例については、「AWS SDK for JavaScript」を参照してください。

ステップ 2.2: 実行ロール (IAM ロール) を作成する

このチュートリアルの Lambda 関数の実行時には、Amazon CloudWatch にログを書き込むアクセス権限が必要です。これらのアクセス権限は、IAM ロール (実行ロール) を作成して付与します。AWS Lambdaは、ユーザーに代わって Lambda 関数を実行するときにこのロールを引き受けます。このセクションでは、以下に示す定義済みのロールタイプとアクセスポリシーを使用して IAM ロールを作成します。

283

Page 290: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

• "AWS Lambda" タイプの AWS サービスロール。このロールは、ロールを引き受けるための AWSLambda アクセス権限を付与します。

• ロールにアタッチする "AWSLambdaBasicExecutionRole" アクセスポリシー。この既存のポリシーにより、Lambda 関数が必要とする Amazon CloudWatch アクション用のアクセス権限を含むアクセス権限が付与されます。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。

このセクションでは、以下に示す定義済みのロールタイプとアクセス権限ポリシーを使用して IAM ロールを作成します。

• AWS Lambda タイプの AWS サービスロール – このロールでは AWS Lambda ロールを引き受けるアクセス権限が付与されます。

• ロールにアタッチする AWSLambdaBasicExecutionRole アクセス権限ポリシー。

IAM ロールの詳細については、『IAM ユーザーガイド』の「IAM ロール」を参照してください。次の手順に従って IAM ロールを作成します。

IAM ロール (実行ロール) を作成するには

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAMロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Role Name] では、AWS アカウント内で一意の名前 (たとえば、lambda-custom-app-execution-role) を使用します。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。これにより、ロールを引き受けるアクセス権限を AWS Lambda サービスに付与します。

• [Attach Policy] で [AWSLambdaBasicExecutionRole] を選択します。3. ロールの ARN をメモします。これは、次のステップで Lambda 関数を作成するときに必要になりま

す。

ステップ 2.3: Lambda 関数を作成する

次の Lambda CLI create-function コマンドを実行して Lambda 関数を作成します。デプロイパッケージと IAM ロールの ARN をパラメータとして提供します。Runtime パラメータは nodejs6.10 を使用しますが、nodejs8.10 または nodejs4.3 も指定できることに注意してください。

$ aws lambda create-function \--region region \--function-name helloworld \--zip-file fileb://file-path/helloworld.zip \--role role-arn \--handler helloworld.handler \--runtime nodejs6.10 \--profile adminuser

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

284

Page 291: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

詳細については、「CreateFunction (p. 425)」を参照してください。次の例に示すように、AWS Lambdaが関数を作成し、関数設定情報を返します。

{ "FunctionName": "helloworld", "CodeSize": 351, "MemorySize": 128, "FunctionArn": "function-arn", "Handler": "helloworld.handler", "Role": "arn:aws:iam::account-id:role/LambdaExecRole", "Timeout": 3, "LastModified": "2015-04-07T22:02:58.854+0000", "Runtime": "nodejs6.10", "Description": ""}

次のステップステップ 3: Lambda 関数を呼び出す (AWS CLI) (p. 285)

ステップ 3: Lambda 関数を呼び出す (AWS CLI)このセクションでは、AWS CLI コマンド invoke を使用して Lambda 関数を手動で呼び出します。

$ aws lambda invoke \--invocation-type RequestResponse \--function-name helloworld \--region region \--log-type Tail \--payload '{"key1":"value1", "key2":"value2", "key3":"value3"}' \--profile adminuser \outputfile.txt

必要に応じて、ペイロードをファイル (たとえば、input.txt) に保存し、パラメータとしてファイル名を指定できます。

--payload file://input.txt \

前述の invoke コマンドでは、呼び出しタイプとして RequestResponse を指定します。これにより、関数を実行するとすぐにレスポンスが返されます。または、呼び出しタイプとして Event を指定すると、関数を非同期的に呼び出すことができます。

--log-type パラメータを指定することにより、コマンドは、関数によって生成されたログの末尾もリクエストします。レスポンスのログデータは、次のレスポンスの例に示すように、base64 でエンコードされています。

{ "LogResult": "base64-encoded-log", "StatusCode": 200 }

Linux および Mac では、base64 コマンドを使用してログをデコードできます。

$ echo base64-encoded-log | base64 --decode

ログの例のデコードされたバージョンを次に示します。

START RequestId: 16d25499-d89f-11e4-9e64-5d70fce44801

285

Page 292: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

2015-04-01T18:44:12.323Z 16d25499-d89f-11e4-9e64-5d70fce44801 value1 = value12015-04-01T18:44:12.323Z 16d25499-d89f-11e4-9e64-5d70fce44801 value2 = value22015-04-01T18:44:12.323Z 16d25499-d89f-11e4-9e64-5d70fce44801 value3 = value32015-04-01T18:44:12.323Z 16d25499-d89f-11e4-9e64-5d70fce44801 result: "value1"END RequestId: 16d25499-d89f-11e4-9e64-5d70fce44801REPORT RequestId: 16d25499-d89f-11e4-9e64-5d70fce44801 Duration: 13.35 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 9 MB

詳細については、「Invoke (p. 463)」を参照してください。

RequestResponse 呼び出しタイプを使用して関数を呼び出したため、関数が実行され、呼び出したときにリアルタイムで、context.succeed() に渡したオブジェクトが返されます。このチュートリアルでは、CLI コマンドで指定した outputfile.txt ファイルに次のテキストが書き込まれます。

"value1"

Note

Lambda 関数を作成し、呼び出すのと同じ AWS アカウントを使用しているため、この関数を実行することができます。ただし、関数を実行するために別の AWS アカウントにクロスアカウントアクセス権限を付与する場合、または別の AWS サービスにアクセス権限を付与する場合は、その関数に関連付けられたアクセス権限ポリシーにアクセス権限を追加する必要があります。Amazon S3 をイベントソースとして使用する Amazon S3 チュートリアル (「チュートリアル: Amazon S3 での AWS Lambda の使用 (p. 184)」を参照) では、関数を呼び出すためにこのようなアクセス権限が Amazon S3 に付与されます。

Lambda 関数のアクティビティは、AWS Lambda コンソールでモニタリングできます。

• AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWSLambda コンソールを開きます。

AWS Lambda コンソールでは、関数の [Cloudwatch Metrics at a glance] セクションで、一部のCloudWatch メトリクスのグラフィカル表現が表示されます。

• 各グラフでは、[logs] リンクをクリックして、CloudWatch ログを直接表示することもできます。

次のステップステップ 4: より多くの CLI コマンドを試す (AWS CLI) (p. 286)

ステップ 4: より多くの CLI コマンドを試す (AWS CLI)ステップ 4.1: アカウントの Lambda 関数をリストするこのセクションでは、AWS Lambda のリスト関数の操作を試します。次の AWS CLI コマンド list-functions を実行して、アップロードした関数のリストを取得します。

$ aws lambda list-functions \--max-items 10 \--profile adminuser

コマンドでは、ページ分割の使用について示すため、省略可能な --max-items パラメータを指定して、応答で返される関数の数を制限しています。詳細については、「ListFunctions (p. 477)」を参照してください。以下に、応答の例を示します。

{ "Functions": [ {

286

Page 293: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドチュートリアル

"FunctionName": "helloworld", "MemorySize": 128, "CodeSize": 412, "FunctionArn": "arn:aws:lambda:us-east-1:account-id:function:ProcessKinesisRecords", "Handler": "ProcessKinesisRecords.handler", "Role": "arn:aws:iam::account-id:role/LambdaExecRole", "Timeout": 3, "LastModified": "2015-02-22T21:03:01.172+0000", "Runtime": "nodejs6.10", "Description": "" }, { "FunctionName": "ProcessKinesisRecords", "MemorySize": 128, "CodeSize": 412, "FunctionArn": "arn:aws:lambda:us-east-1:account-id:function:ProcessKinesisRecords", "Handler": "ProcessKinesisRecords.handler", "Role": "arn:aws:iam::account-id:role/lambda-execute-test-kinesis", "Timeout": 3, "LastModified": "2015-02-22T21:03:01.172+0000", "Runtime": "nodejs6.10", "Description": "" }, ... ], "NextMarker": null

}

応答で、Lambda は最大 10 個の関数のリストを返します。取得できる関数がさらにある場合、NextMarker は、次の list-functions リクエストで使用できるマーカーを提供します。それ以外の場合、値は null です。次の list-functions AWS CLI コマンドは、--next-marker パラメータを示す例です。

$ aws lambda list-functions \--max-items 10 \--marker value-of-NextMarker-from-previous-response \--profile adminuser

ステップ 4.2: メタデータと URL を取得して、以前にアップロードした Lambda関数デプロイパッケージをダウンロードするLambda CLI get-function コマンドは、関数を作成するためにアップロードした関数の .zip ファイル(デプロイパッケージ) をダウンロードするために使用できる、Lambda 関数メタデータと署名付き URL を返します。詳細については、「GetFunction (p. 451)」を参照してください。

$ aws lambda get-function \--function-name helloworld \--region region \--profile adminuser

以下に、応答の例を示します。

{ "Code": { "RepositoryType": "S3", "Location": "pre-signed-url" }, "Configuration": {

287

Page 294: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda@Edge

"FunctionName": "helloworld", "MemorySize": 128, "CodeSize": 287, "FunctionArn": "arn:aws:lambda:us-west-2:account-id:function:helloworld", "Handler": "helloworld.handler", "Role": "arn:aws:iam::account-id:role/LambdaExecRole", "Timeout": 3, "LastModified": "2015-04-07T22:02:58.854+0000", "Runtime": "nodejs6.10", "Description": "" }

}

(署名済み URL ではなく) 関数の設定情報のみが必要な場合は、Lambda CLI の get-function-configuration コマンドを使用できます。

$ aws lambda get-function-configuration \ --function-name helloworld \ --region region \--profile adminuser

次のステップ

ステップ 5: Lambda 関数と IAM ロールを削除する (AWS CLI) (p. 288)

ステップ 5: Lambda 関数と IAM ロールを削除する (AWS CLI)次の delete-function コマンドを実行して、helloworld 関数を削除します。

$ aws lambda delete-function \ --function-name helloworld \ --region region \--profile adminuser

IAM ロールの削除

Lambda 関数を削除した後で、IAM コンソールで作成した IAM ロールを削除することもできます。ロールの削除の詳細については、IAM ユーザーガイドのロールまたはインスタンスプロファイルの削除を参照してください。

AWS Lambda@EdgeLambda@Edge では、Lambda 関数を実行して CloudFront が発信するコンテンツをカスタマイズし、ビューワーに近い AWS 地域でこの関数を実行できます。この関数は、プロビジョニングや管理の必要なく、CloudFront イベントに応答を実行します。Lambda 関数を使用して、次の時点で CloudFront リクエストとレスポンスを変更できます。

• CloudFront がビューワーからリクエストを受信した後 (ビューワーリクエスト)• CloudFront がリクエストをオリジンサーバーに転送する前 (オリジンリクエスト)• CloudFront がオリジンからレスポンスを受信した後 (オリジンレスポンス)• CloudFront がビューワーにレスポンスを転送する前 (ビューワーレスポンス)

288

Page 295: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda@Edge

オリジンにリクエストを一切送信することなく、ビューワーへのレスポンスを生成することもできます。

Node.js 6.10 で CloudFront 用の Lambda 関数を作成できます。Lambda@Edge を使用すると、さまざまなソリューションを構築できます。次に例を示します。

• A/B テスト用に、異なるバージョンのサイトに URL を書き換えるために Cookie を検査します。• リクエストを送信したデバイスに関する情報が含まれている、User-Agent ヘッダーに基づいてユー

ザーにさまざまなオブジェクトを送信します。たとえば、ユーザーのデバイスに応じて、さまざまな解像度のイメージをユーザーに送信できます。

• ヘッダーまたは認証トークンを検査し、対応するヘッダーを挿入して、リクエストをオリジンに転送する前にアクセス制御を有効にします。

• ヘッダーの追加、削除、変更、および URL パスの書き換えを行い、キャッシュの異なるオブジェクトにユーザーをダイレクトします。

• 未認証ユーザーをログインページにリダイレクトしたり、エッジから直に静的ウェブページを作成して配信したりといったことを行う新しい HTTP レスポンスを生成します。詳細については、AmazonCloudFront 開発者ガイドの「Lambda 関数を使用してビューワーおよびオリジンリクエストへの HTTPレスポンスを生成する」を参照してください。

以下のリンクは、『Amazon CloudFront 開発者ガイド』の「CloudFront と Lambda@Edge の使用」に移動したコンテンツに関連しています。ブックマークしたコンテンツがある場合は、このブックマークを更新してください。次の各セクションでは、更新したリンクを提供しています。

トピック• Lambda@Edge 用の Lambda 関数を作成および使用する方法 (p. 290)• Lambda 関数のレプリカを削除する方法 (p. 290)• Lambda@Edge 用の IAM アクセス権限とロールの設定 (p. 290)• Lambda@Edge 関数の作成 (p. 290)• Lambda@Edge 関数のトリガーの追加 (AWS Lambda コンソール) (p. 290)• Lambda@Edge 用の関数を記述する (p. 290)• Lambda@Edge 用の Lambda 関数の編集 (p. 290)• テストおよびデバッグ (p. 290)• Lambda@Edge の制限 (p. 290)

289

Page 296: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda@Edge 用の Lambda 関

数を作成および使用する方法

Lambda@Edge 用の Lambda 関数を作成および使用する方法このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 用の Lambda 関数を作成および使用する方法」に移動しました。

Lambda 関数のレプリカを削除する方法このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda 関数のレプリカを削除する方法」に移動しました。

Lambda@Edge 用の IAM アクセス権限とロールの設定このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 用の IAM アクセス権限とロールの設定」に移動しました。

Lambda@Edge 関数の作成このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 関数の作成」に移動しました。

Lambda@Edge 関数のトリガーの追加 (AWS Lambdaコンソール)このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 関数のトリガーの追加(AWS Lambda コンソール)」に移動しました。

Lambda@Edge 用の関数を記述するこのコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 用の関数を記述する」に移動しました。

Lambda@Edge 用の Lambda 関数の編集このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge 用の Lambda 関数を編集する」に移動しました。

テストおよびデバッグこのコンテンツは、『Amazon CloudFront 開発者ガイド』の「テストおよびデバッグ」に移動しました。

Lambda@Edge の制限このコンテンツは、『Amazon CloudFront 開発者ガイド』の「Lambda@Edge の制限」に移動しました。

290

Page 297: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

Lambda ベースのアプリケーションをデプロイする

Lambda ベースのアプリケーション (サーバーレスアプリケーション とも呼ばれる) は各イベントによってトリガーされる関数で構成されます。典型的なサーバーレスアプリケーションは、Amazon S3、AmazonSNS 通知、および API アクションへのオブジェクトのアップロードなどのイベントによってトリガーされる 1 つ以上の関数で構成されます。これらの関数はスタンドアローンとなるか、DynamoDB テーブルやAmazon S3 バケットなどの他のリソースを活用することができます。基本的なサーバーレスアプリケーションのほとんどは単一の関数です。

AWS Lambda は、デプロイメントパッケージを ZIP ファイルとして提供することによって Lambda 関数を作成および更新するために使用できる API オペレーションを提供します。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレス アプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。例えば、Amazon SNS トリガーをデプロイするには、関数、Amazon SNS トピック、関数とトピックの間のマッピング、および DynamoDB テーブルなどの、関数が必要とするその他のダウンストリームリソースを更新する必要があります。

サーバーレスアプリケーションは以下の方法でデプロイできます。

• AWS CLI - aws cloudformation deploy コマンドを使用できます。詳細については、サーバーレスアプリケーションの作成に関するチュートリアルの「デプロイメント (p. 317)」を参照してください。詳細については、「独自のサーバーレスアプリケーションを作成する (p. 316)」を参照してください。Lambda には、サーバーレスアプリケーションをデプロイするための他の AWS CLI オペレーションも用意されています。• CreateFunction (p. 425)• UpdateFunctionConfiguration (p. 515)

• AWS CloudFormation - AWS CloudFormation を使用して、サーバーレスアプリケーションを指定、デプロイ、設定できます。AWS CloudFormation は AWS リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS; で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。AWS リソースを個別に作成、設計して、それぞれの依存関係を考える必要はありません。 —AWS CloudFormation がすべてを処理します。詳細については、『AWSCloudFormation ユーザーガイド』の「AWS CloudFormation Concepts」を参照してください。

• AWS SAM - AWS SAM は、サーバーレスアプリケーションの関数、API、マッピング、およびDynamoDB テーブルの表現方法を簡素化する特別なリソースタイプをサポートしています。また、環境変数などのこれらのサービスのいくつかの機能もサポートしています。これらのリソースの AWSCloudFormation の記述は、「AWS サーバーレスアプリケーションモデル」に準拠しています。アプリケーションをデプロイするには、必要なリソースを、AWS CloudFormation テンプレートファイル(JSON または YAML で記述された) の関連するアクセス権限ポリシーと共にアプリケーションの一部として指定します。デプロイアーティファクトをパッケージ化し、テンプレートをデプロイします。詳細については、「AWS サーバーレスアプリケーションモデル (AWS SAM) の使用 (p. 311)」を参照してください。

AWS Serverless Model (AWS SAM) のセクションに進む前に、Lambda 関数のバージョニングとエイリアスについて、および関数リビジョンへのトラフィックの移行方法について説明する以下のセクションを参照してください。これらは、サーバーレスアプリケーションの開発に重要な側面となります。詳細については、「AWS Lambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

291

Page 298: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニングとエイリアス

AWS Lambda 関数のバージョニングとエイリアスバージョニングを使用すると、AWS Lambda での本稼働環境内の関数コードの管理が向上します。AWSLambda でバージョニングを使用すると、Lambda 関数の 1 つまたは複数のバージョンを発行できます。その結果、開発、ベータ、本稼働といった開発ワークフローにおいて異なるバリエーションの Lambda 関数で作業できます。

各 Lambda 関数のバージョンには、一意の Amazon リソースネーム (ARN) があります。バージョンの発行後、変更は不可です。

AWS Lambda は各 Lambda 関数バージョンごとのエイリアスの作成もサポートしています。概念的には、AWS Lambda エイリアスは Lambda 関数の特定のバージョンに対するポインタのようなものです。また、Lambda 関数に似ているリソースでもあり、各エイリアスには一意の ARN があります。各エイリアスは、それが指す関数のバージョンの ARN を維持しています。エイリアスは関数バージョンのみを指すことができ、別のエイリアスを指すことはできません。イミュータブルであるバージョンとは異なり、エイリアスはミュータブル (変更可能) です。関数の異なるバージョンを指すようにエイリアスを更新できます。

エイリアスを使用して、Lambda 関数バージョンのマッピングおよびそのイベントソースから、Lambda関数の新しいバージョンを本稼働環境に移行するプロセスを抽出できます。

たとえば、Amazon S3 が新しいオブジェクトがバケットに作成された場合に Lambda 関数を呼び出すイベントソースだとします。Amazon S3 がイベントソースである場合、イベントソースのマッピング情報はバケットの通知設定に保存されます。その設定では、Amazon S3 が呼び出すことができる Lambda 関数の ARN を特定することができます。ただし、この場合、Lambda 関数の新しいバージョンを発行するたびに、Amazon S3 が正しいバージョンを呼び出すことができるように通知設定を更新する必要があります。

それに対して、通知設定で関数 ARN を指定する代わりに、エイリアス ARN を指定するとします (たとえば、PROD エイリアス ARN)。Lambda 関数の新しいバージョンを本稼働環境に移行する際には、PRODエイリアスが最新の安定バージョンを指すように更新するだけです。Amazon S3 の通知設定を更新する必要はありません。

292

Page 299: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング

Lambda 関数を以前のバージョンにロールバックする必要がある場合も同様です。このシナリオでは、PROD エイリアスを別の関数バージョンを指すように更新するだけです。イベントソースマッピングを更新する必要はありません。

複数の依存関係や開発者が関わるアプリケーションを構築する際は、バージョニングおよびエイリアスを使用して Lambda 関数をデプロイすることをお勧めします。

詳細については、次のトピックを参照してください。

トピック• AWS Lambda バージョニングの紹介 (p. 293)• AWS Lambda エイリアスの紹介 (p. 297)• バージョニング、エイリアス、リソースポリシー (p. 305)• AWS マネジメントコンソール、AWS CLI、または Lambda API オペレーションを使用したバージョニ

ングの管理 (p. 307)• エイリアスを使用したトラフィックの移行 (p. 309)

AWS Lambda バージョニングの紹介以下では、Lambda 関数を作成し、そのバージョンを発行する方法を説明します。また、発行済みバージョンがある場合に、関数コードおよび設定情報を更新する方法も説明します。また、特定の関数バージョンまたは Lambda 関数全体 (すべてのバージョンおよび関連エイリアスを含む) を削除する方法についても説明します。

Lambda 関数 ($LATEST バージョン) の作成Lambda 関数を作成するとき、バージョンは 1 つ ($LATEST バージョン) です。

Amazon リソースネーム (ARN) を使用してこの関数を参照できます。この初期バージョンに関連付けられる ARN は 2 つです。

• 修飾 ARN - バージョンのサフィックスが付いた関数 ARN です。

arn:aws:lambda:aws-region:acct-id:function:helloworld:$LATEST

• 非修飾 ARN - バージョンのサフィックスが付いていない関数 ARN です。

この非修飾 ARN は関連するすべてのオペレーションで使用できます。ただし、これを使用してエイリアスを作成することはできません。詳細については、「AWS Lambda エイリアスの紹介 (p. 297)」を参照してください。

293

Page 300: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング

非修飾 ARN には、独自のリソースポリシーがあります。

arn:aws:lambda:aws-region:acct-id:function:helloworld

Note

複数バージョンの発行を選択しない限り、$LATEST バージョンが存在する唯一の Lambda 関数バージョンです。この $LATEST バージョンを呼び出すには、修飾 ARN と非修飾 ARN のいずれもイベントソースマッピングで使用できます。

以下に、CreateFunction API コールの応答の例を示します。

{ "CodeSize": 287, "Description": "test function." "FunctionArn": "arn:aws:lambda:aws-region:acct-id:function:helloworld", "FunctionName": "helloworld", "Handler": "helloworld.handler", "LastModified": "2015-07-16T00:34:31.322+0000", "MemorySize": 128, "Role": "arn:aws:iam::acct-id:role/lambda_basic_execution", "Runtime": "nodejs6.10", "Timeout": 3, "CodeSHA256": "OjRFuuHKizEE8tHFIMsI+iHR6BPAfJ5S0rW31Mh6jKg=", "Version": "$LATEST" }

詳細については、「CreateFunction (p. 425)」を参照してください。

この応答では、AWS Lambda は新しく作成された関数の非修飾 ARN と、そのバージョンである $LATESTを返します。また、応答には、Version ステータスが $LATEST であることも示されます。CodeSha256はアップロードしたデプロイパッケージのチェックサムです。

AWS Lambda 関数バージョンの発行バージョンを発行すると、AWS Lambda は $LATEST バージョンに Lambda 関数コード (および設定) のスナップショットのコピーを作成します。発行済みバージョンは変更不可能です。つまり、コーディングや設定情報を変更することはできません。新しいバージョンには、次に示すようにバージョン番号のサフィックスを含む一意の ARN があります。

以下のいずれかの方法を使用してバージョンを発行できます。

294

Page 301: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング

• 明示的にバージョンを発行 - PublishVersion API オペレーションを使用して明示的にバージョンを発行できます。詳細については、「PublishVersion (p. 485)」を参照してください。このオペレーションでは、$LATEST バージョンのコードと設定を使用して新しいバージョンを作成します。

• Lambda 関数の作成/発行時にバージョンを発行 - CreateFunction または UpdateFunctionCode リクエストを使用し、リクエストにオプションの publish パラメータを追加することで、バージョンを発行することもできます。• CreateFunction リクエストで publish パラメータを指定して、新しい Lambda 関数

($LATEST バージョン) を作成します。その後、スナップショットを作成し、バージョン 1 に割り当てることで、新しい関数を即座に発行できます。CreateFunction の詳細については、「CreateFunction (p. 425)」を参照してください。

• UpdateFunctionCode リクエストで publish パラメータを指定して、$LATEST バージョンでコードを更新します。次に、$LATEST からバージョンを発行できます。UpdateFunctionCode の詳細については、「UpdateFunctionCode (p. 508)」を参照してください。

Lambda 関数の作成時に publish パラメータを指定する場合、応答として AWS Lambda が返す関数設定情報に新しく発行済みバージョンの番号が表示されます。この例では、バージョンは 1 です。

{ "CodeSize": 287, "Description": "test function." "FunctionArn": "arn:aws:lambda:aws-region:acct-id:function:helloworld", "FunctionName": "helloworld", "Handler": "helloworld.handler", "LastModified": "2015-07-16T00:34:31.322+0000", "MemorySize": 128, "Role": "arn:aws:iam::acct-id:role/lambda_basic_execution", "Runtime": "nodejs6.10", "Timeout": 3, "CodeSHA256": "OjRFuuHKizEE8tHFIMsI+iHR6BPAfJ5S0rW31Mh6jKg=", "Version": "1" }

Note

Lambda は、$LATEST バージョンと比較して、コードがまだ発行されていない場合、またはコードが変更されている場合のみ、新しいバージョンを発行します。変更がない場合は、$LATEST 発行済みバージョンが返されます。

Lambda 関数の作成または Lambda 関数コードの更新と同時にバージョンを発行することをお勧めします。この推奨事項は、特に複数の開発者が同じ Lambda 関数の開発に関わっている場合に該当します。リクエストで publish パラメータを使用することでこれを実現できます。

プロジェクトで作業する開発者が複数いる場合、開発者 A が Lambda 関数 ($LATEST バージョン) を作成するシナリオが考えられます。開発者 A がこのバージョンを発行する前に、開発者 B が、$LATEST バージョンに関連付けられたコード (デプロイパッケージ) を更新するとします。この場合、開発者 A がアップロードした元のコードが失われます。両方の開発者が publish パラメータを追加することで、ここに説明した競合状態を防止できます。

Note

発行済みバージョンは変更不可能です。つまり、バージョンに関連付けられたコードや設定情報を変更することはできません。

Lambda 関数の各バージョンは Amazon リソースネーム (ARN) を持つ一意のリソースです。次の例は、helloworld Lambda 関数のバージョン番号 1 の ARN を示します。

arn:aws:lambda:aws-region:acct-id:function:helloworld:1

295

Page 302: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング

Note

これはバージョン番号がサフィックスである修飾 ARN です。発行済みバージョンは修飾 ARN のみを持ちます。

Lambda 関数のバージョンは複数発行できます。バージョンを発行するたびに、AWS Lambda は$LATEST バージョン (コードおよび設定情報) をコピーし、新しいバージョンを作成します。追加バージョンを発行すると、AWS Lambda は、関数が削除され再作成されても、一定間隔で増加するシーケンス番号をバージョニングに割り当てます。バージョン番号は、削除され再作成された関数に対しても、再利用されることはありません。この方法では、関数バージョンのコンシューマーは、そのバージョンの実行可能ファイルが変更されることはないことを信頼できます (削除された場合を除く)。

修飾子を再利用する場合は、バージョンとともにエイリアスを使用します。エイリアスは削除して、同じ名前で再作成できます。

Lambda 関数コードおよび設定の更新AWS Lambda は最新の関数コードを $LATEST バージョンに維持します。関数コードを更新すると、AWS Lambda は Lambda 関数の $LATEST バージョンのコードを置き換えます。詳細については、「UpdateFunctionCode (p. 508)」を参照してください。

発行済みバージョンは変更不可能です。発行済みバージョンに関連付けられたコードや設定情報は更新できません。

Lambda 関数コードを更新する際、新しいバージョンの発行に関する次のオプションがあります。

• 同じ更新コードリクエストでバージョンを発行する - UpdateFunctionCode API オペレーションを使用します (推奨)。

• まずコードを更新し、次に明示的にバージョンを発行する - PublishVersion API オペレーションを使用します。

Lambda 関数の $LATEST バージョンのコードおよび設定情報 (記述、メモリサイズ、実行タイムアウトなど) は更新できます。ただし、発行済みバージョンは変更不可能です。つまり、コーディングや設定情報を変更することはできません。

Lambda 関数および特定のバージョンの削除バージョニングでは、以下を選択できます。

• 特定のバージョンを削除する - DeleteFunction リクエストで削除するバージョンを指定して、Lambda 関数のバージョンを削除できます。このバージョンに依存するエイリアスがある場合、リ

296

Page 303: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

クエストは失敗します。AWS Lambda は、このバージョンに依存するエイリアスがない場合のみ、バージョンを削除します。エイリアスの詳細については、「AWS Lambda エイリアスの紹介 (p. 297)」を参照してください。

• Lambda 関数全体 (そのバージョンとエイリアスのすべて) を削除する - Lambda 関数とそのすべてのバージョンを削除するには、DeleteFunction リクエストでいずれのバージョンも指定しないでください。この操作を行うと、すべてのバージョンおよびエイリアスを含むその関数全体が削除されます。

Important

関数の特定のバージョンを削除できますが、$LATEST は削除できません。

関連トピックAWS Lambda エイリアスの紹介 (p. 297)

AWS マネジメントコンソール、AWS CLI、または Lambda API オペレーションを使用したバージョニングの管理 (p. 307)

AWS Lambda エイリアスの紹介Lambda 関数の 1 つ以上のエイリアスを作成できます。AWS Lambda エイリアスは Lambda 関数の特定のバージョンに対するポインタのようなものです。バージョニングの詳細については、「AWS Lambda バージョニングの紹介 (p. 293)」を参照してください。

エイリアスを使用することで、呼び出し元はエイリアスが指す特定のバージョンがどれかを知らなくても、それが指す Lambda 関数にアクセス (たとえば、関数の呼び出し) できます。

AWS Lambda エイリアスによって、以下のユースケースが可能となります。

• 必要に応じた Lambda 関数の新しいバージョンへの移行またはロールバックが容易 - Lambda 関数を作成した後 ($LATEST バージョン)、最初にそのバージョン 1 を発行できます。バージョン 1 を指すPROD という名前のエイリアスを作成することで、PROD エイリアスを使用して Lambda 関数のバージョン 1 を呼び出すことができます。

次に、コード ($LATEST バージョン) を改良して更新し、別の安定した改良バージョン (バージョン 2)を発行します。PROD エイリアスをバージョン 2 を指すように再マッピングすることで、バージョン 2を本稼働環境に移行できます。何か問題が出た場合は、PROD エイリアスがバージョン 1 を指すように再マッピングすることで、簡単に本稼働バージョンをロールバックできます。

Note

この文脈では、移行およびロールバックという用語は、エイリアスを関数の異なるバージョンに再マッピングすることです。

• イベントソースマッピングの管理を簡略化 – イベントソースマッピングで Amazon リソースネーム(ARN) を Lambda 関数に使用する代わりに、エイリアス ARN を使用できます。この方法では、新しいバージョンの昇格時または以前のバージョンへのロールバック時にイベントソースマッピングを更新する必要がありません。

AWS Lambda エイリアスは Lambda 関数に似たリソースです。ただし、エイリアスだけを作成することはできません。既存の Lambda 関数に対してエイリアスを作成します。Lambda 関数がリソースの場合、AWS Lambda エイリアスは Lambda 関数に関連付けられるサブリソースと考えることができます。

Lambda 関数およびエイリアスは AWS Lambda リソースであり、他のすべての AWS リソースのように、どちらにも一意の ARN があります。次の例は、1 つの発行済みバージョンを持つ Lambda 関数 ($LATESTバージョン) を示しています。各バージョンには、それを指すエイリアスがあります。

297

Page 304: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

関数 ARN またはエイリアス ARN のいずれかを使用して関数にアクセスできます。

• 修飾関数の関数バージョンは常に $LATEST にマップされるため、修飾 ARN または非修飾関数 ARN を使用してアクセスできます。$LATEST バージョンのサフィックスが付いた修飾関数 ARN を次に示します。

arn:aws:lambda:aws-region:acct-id:function:helloworld:$LATEST

• エイリアス ARN を使用する場合は、修飾 ARN を使用することになります。各エイリアス ARN にはエイリアス名のサフィックスがあります。

arn:aws:lambda:aws-region:acct-id:function:helloworld:PRODarn:aws:lambda:aws-region:acct-id:function:helloworld:BETAarn:aws:lambda:aws-region:acct-id:function:helloworld:DEV

エイリアスを作成および管理するために、AWS Lambda は以下の API オペレーションを提供します。

• CreateAlias (p. 416)• UpdateAlias (p. 500)• GetAlias (p. 445)• ListAliases (p. 471)• DeleteAlias (p. 433)

例: エイリアスを使用した Lambda 関数バージョンの管理以下のサンプルシナリオは、バージョニングおよびエイリアスを使用して Lambda 関数の新しいバージョンを本稼働に移行します。

298

Page 305: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

まず、Lambda 関数を作成します。

作成する関数は $LATEST バージョンです。また、新しく作成された関数を指すエイリアス (DEV、開発用) を作成します。開発者はこのエイリアスを使用して、開発環境でイベントソースを使用して関数をテストできます。

次に、新しいバージョンを開発しながら安定した方法で、ベータ環境でイベントソースを使用して関数バージョンをテストします。

$LATEST からバージョンを発行し、それを指す別のエイリアス (BETA) を持たせます。この方法により、ベータイベントソースをこの特定のエイリアスに関連付けることができます。イベントソースマッピングでは、BETA エイリアスを使用して Lambda 関数をイベントソースと関連付けます。

299

Page 306: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

次に、Lambda 関数バージョンを本稼働に移行して本稼働環境のイベントソースを使用するようにします。

関数の BETA バージョンをテストした後、バージョン 1 にマッピングされるエイリアスを作成して本稼働バージョンを定義できます。この方法では、本稼働イベントソースがこの特定のバージョンを指します。これを実行するには、PROD エイリアスを作成し、PROD エイリアス ARN をすべての本稼働イベントソースマッピングで使用します。

300

Page 307: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

開発を続け、より多くのバージョンを発行し、テストします。

コードの開発に合わせて、更新されたコードをアップロードして $LATEST バージョンを更新し、BETA エイリアスがそれを指すようにすることでベータテストに発行できます。このベータエイリアスの簡単な再マッピングで、Lambda 関数のバージョン 2 をイベントソースを変更することなくベータにすることができます。この方法では、エイリアスを使用して、開発環境で特定のイベントソースとともに使用する関数のバージョンを制御できます。

301

Page 308: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

AWS Command Line Interface を使用してこのセットアップを作成する場合は、「チュートリアル: AWSLambda エイリアスの使用 (p. 302)」を参照してください。

関連トピックAWS Lambda バージョニングの紹介 (p. 293)

エイリアスを使用したトラフィックの移行 (p. 309)

チュートリアル: AWS Lambda エイリアスの使用 (p. 302)

AWS マネジメントコンソール、AWS CLI、または Lambda API オペレーションを使用したバージョニングの管理 (p. 307)

チュートリアル: AWS Lambda エイリアスの使用この AWS CLI ベースのチュートリアルでは、「例: エイリアスを使用した Lambda 関数バージョンの管理 (p. 298)」で説明されているように Lambda 関数バージョンおよびそれを指すエイリアスを作成します。

この例では、us-west-2 (米国西部オレゴン) リージョンを使用して Lambda 関数およびエイリアスを作成します。

Lambda 関数 (helloworld) を作成します。

aws lambda create-function \--region region \--function-name helloworld \--zip-file fileb://file-path/helloworld.zip \--role arn:aws:iam::account-id:role/lambda_basic_execution \--handler helloworld.handler \--runtime nodejs6.10 \--profile adminuser

次の応答の例に示すように、関数バージョンとして $LATEST を示す設定情報が返されます。

{ "CodeSha256": "OjRFuuHKizEE8tHFIMsI+iHR6BPAfJ5S0rW31Mh6jKg=", "FunctionName": "helloworld", "CodeSize": 287, "MemorySize": 128, "FunctionArn": "arn:aws:lambda:us-west-2:account-id:function:helloworld", "Version": "$LATEST", "Role": "arn:aws:iam::account-id:role/lambda_basic_execution", "Timeout": 3, "LastModified": "2015-09-30T18:39:53.873+0000", "Handler": "helloworld.handler", "Runtime": "nodejs6.10", "Description": ""}

1. アップロードして Lambda 関数を作成できるデプロイパッケージを作成します。

a. テキストエディターを開き、次のコードをコピーします。

console.log('Loading function');

exports.handler = function(event, context, callback) { console.log('value1 =', event.key1); console.log('value2 =', event.key2);

302

Page 309: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

console.log('value3 =', event.key3); callback(null, "message"); };

b. helloworld.js という名前でファイルを保存します。c. helloworld.js ファイルを helloworld.zip という名前で ZIP 圧縮します。

2. Lambda 関数の作成時に指定できる AWS Identity and Access Management (IAM) ロール (実行ロール)を作成します。

a. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

b. IAM ユーザーガイドのIAM ロールのステップに従って、IAM ロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Select Role Type] で、[AWS Service Roles]、[AWS Lambda] の順に選択します。• [Attach Policy] で、AWSLambdaBasicExecutionRole という名前のポリシーを選択します。

c. IAM ロールの Amazon リソースネーム (ARN) をメモします。次のステップで Lambda 関数を作成するときに、この値が必要になります。

3. helloworld Lambda 関数の $LATEST バージョンを指すエイリアス (DEV) を作成します。

aws lambda create-alias \--region region \--function-name helloworld \--description "sample alias" \--function-version "\$LATEST" \--name DEV \--profile adminuser

応答が、エイリアスが指す関数バージョンおよびエイリアス ARN を含むエイリアス情報を返します。ARN は、エイリアス名がサフィックスとしてついた関数 ARN と同じです。以下に、応答の例を示します。

{ "AliasArn": "arn:aws:lambda:us-west-2:account-id:function:helloworld:DEV", "FunctionVersion": "$LATEST", "Name": "DEV", "Description": "sample alias"}

4. helloworld Lambda 関数のバージョンを発行します。

aws lambda publish-version \--region region \--function-name helloworld \--profile adminuser

レスポンスは、バージョン番号およびバージョンがサフィックスとしてついた関数 ARN を含む関数バージョンの設定情報を返します。以下に、応答の例を示します。

{ "CodeSha256": "OjRFuuHKizEE8tHFIMsI+iHR6BPAfJ5S0rW31Mh6jKg=", "FunctionName": "helloworld", "CodeSize": 287, "MemorySize": 128, "FunctionArn": "arn:aws:lambda:us-west-2:account-id:function:helloworld:1", "Version": "1", "Role": "arn:aws:iam::account-id:role/lambda_basic_execution",

303

Page 310: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド別名

"Timeout": 3, "LastModified": "2015-10-03T00:48:00.435+0000", "Handler": "helloworld.handler", "Runtime": "nodejs6.10 ", "Description": ""}

5. helloworld Lambda 関数バージョン 1 のエイリアス (BETA) を作成します。

aws lambda create-alias \--region region \--function-name helloworld \--description "sample alias" \--function-version 1 \--name BETA \--profile adminuser

これで、helloworld 関数に 2 つのエイリアスができます。DEV エイリアスは $LATEST 関数バージョンを指し、BETA エイリアスは Lambda 関数のバージョン 1 を指します。

6. helloworld 関数のバージョン 1 を本稼働環境に配置するとします。バージョン 1 を指す別のエイリアス (PROD) を作成します。

aws lambda create-alias \--region region \--function-name helloworld \--description "sample alias" \--function-version 1 \--name PROD \--profile adminuser

この時点で、BETA および PROD の両方のエイリアスが Lambda 関数のバージョン 1 を指すことになります。

7. これで、より新しいバージョン (たとえば、バージョン 2) を発行できますが、まずコードを更新して変更したデプロイパッケージをアップロードする必要があります。$LATEST バージョンが変更されていない場合は、複数のバージョンを発行できません。デプロイパッケージを更新した前提で、これをアップロードし、バージョン 2 を発行して初めて、Lambda 関数のバージョン 2 を指す BETA エイリアスを変更できます。

aws lambda update-alias \--region region \--function-name helloworld \--function-version 2 \--name BETA \--profile adminuser

これで、Lambda 関数の異なるバージョンを指す 3 つのエイリアス (Lambda 関数の $LATEST バージョンを指す DEV、バージョン 2 を指す BETA、バージョン 1 を指すPROD) ができました。

AWS Lambda コンソールを使用したバージョニング管理については、「AWS マネジメントコンソール、AWS CLI、または Lambda API オペレーションを使用したバージョニングの管理 (p. 307)」を参照してください。

プッシュモデルにおけるアクセス権限の付与プッシュモデル (「イベントソースマッピング (p. 157)」を参照」では、Amazon S3 などのイベントソースが Lambda 関数を呼び出します。これらのイベントソースは、イベントが発生した際に呼び出す関数のバージョンまたはエイリアスを識別するマッピングを維持します。次の点に注意してください。

304

Page 311: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング、エイリアス、リソースポリシー

• マッピング設定で既存の Lambda 関数のエイリアスを指定することをお勧めします (「AWS Lambda エイリアスの紹介 (p. 297)」を参照)。たとえば、イベントソースが Amazon S3 の場合、バケット通知設定でエイリアス ARN を指定して、Amazon S3 が特定のイベントを検出した場合にそのエイリアスを呼び出すようにできます。

• プッシュモデルでは、Lambda 関数にアタッチされたリソースポリシーを使用して、イベントソースにアクセス権限を付与します。バージョニングでは、追加したアクセス権限は AddPermissionリクエストで指定された修飾子に固有のものです (「バージョニング、エイリアス、リソースポリシー (p. 305)」を参照)。

たとえば、以下の AWS CLI コマンドは Amazon S3 に helloworld Lambda 関数の PROD エイリアスを呼び出すためのアクセス権限を付与します (--qualifier パラメータがエイリアス名を指定することに注意してください)。

aws lambda add-permission \--region region \--function-name helloworld \--qualifier PROD \--statement-id 1 \--principal s3.amazonaws.com \--action lambda:InvokeFunction \--source-arn arn:aws:s3:::examplebucket \--source-account 111111111111 \--profile adminuser

この場合、Amazon S3 が PROD エイリアスを呼び出せるようになり、従って AWS Lambda が PRODエイリアスが指す helloworld Lambda 関数バージョンを実行できます。これを機能させるには、S3 バケットの通知設定で PROD エイリアス ARN を使用する必要があります。

Amazon S3 イベントの処理方法については、「チュートリアル: Amazon S3 での AWS Lambda の使用 (p. 184)」を参照してください。

Note

AWS Lambda コンソールを使用して Lambda 関数のイベントソースを追加する場合は、コンソールが必要なアクセス権限を追加します。

バージョニング、エイリアス、リソースポリシーバージョニングとエイリアスを使用すると、さまざまな ARN を使用して Lambda 関数にアクセスできます。たとえば、次のシナリオを考えてみます。

305

Page 312: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング、エイリアス、リソースポリシー

たとえば、以下の 2 つの ARN のいずれかを使用して helloworld 関数のバージョン 1 を呼び出すことができます。

• 以下のように修飾関数 ARN を使用します。

arn:aws:lambda:aws-region:acct-id:function:helloworld:1

Note

非修飾関数 ARN (バージョンまたはエイリアスのサフィックスがない関数 ARN) は、$LATESTバージョンにマッピングされます。

• 以下のように BETA エイリアス ARN を使用します。

arn:aws:lambda:aws-region:acct-id:function:helloworld:BETA

プッシュモデルでは、イベントソース (Amazon S3 やカスタムアプリケーション) は、Lambda 関数に関連付けられたアクセスポリシーを使用して必要なアクセス権限を付与されてさえいれば、Lambda 関数のどのバージョンでも呼び出すことができます。プッシュモデルの詳細については、「イベントソースマッピング (p. 157)」を参照してください。

アクセス権限を付与したとして、次の問題は、「イベントソースが、関連付けられた ARN を使用して関数バージョンを呼び出すことができるか」です。答えは、アクセス権限の追加リクエスト内での関数の識別方法によって異なります (「AddPermission (p. 411)」を参照)。これを理解するために重要なことは、付与されたアクセス権限は、アクセス権限の追加リクエストで使用された ARN にのみ適用されるということです。

• 修飾関数名 (helloworld:1など) を使用した場合、アクセス権限はその修飾 ARN を使用したhelloworld 関数のバージョン 1 の呼び出しのみに有効です (他の ARN を使用するとアクセス権限エラーになります)。

306

Page 313: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング管理

• エイリアス名 (helloworld:BETA など) を使用した場合は、アクセス権限は BETA エイリアス ARN を使用した helloworld 関数の呼び出しのみに有効です (エイリアスが指す関数バージョン ARN を含む他の ARN を使用するとアクセス権限エラーになります)。

• 非修飾関数名 (helloworld など) を使用した場合は、アクセス権限は非修飾関数 ARN を使用したhelloworld 関数の呼び出しのみに有効です (他の ARN を使用するとアクセス権限エラーになります)。

Note

アクセスポリシーは非修飾 ARN のみであっても、呼びだされた Lambda 関数のコードと設定はやはり関数バージョン $LATEST からのものであることに注意してください。非修飾関数ARN は $LATEST バージョンにマッピングされますが、追加されるアクセス権限は ARN 固有です。

• $LATEST バージョン (helloworld:$LATEST) を使用した修飾関数名を使用する場合、アクセス権限は修飾 ARN を使用した helloworld 関数のバージョン $LATEST の呼び出しのみで有効です (非修飾ARN を使用するとアクセス権限エラーになります)。

AWS マネジメントコンソール、AWS CLI、またはLambda API オペレーションを使用したバージョニングの管理AWS SDK を使用してプログラムで (または必要に応じて AWS Lambda API 呼び出しで直接)、AWSCommand Line Interface (AWS CLI) を使用して、あるいは AWS Lambda コンソールを使用して、Lambda関数のバージョニングを管理できます。

AWS Lambda はバージョニングとエイリアスを管理するために以下の API を提供します。

PublishVersion (p. 485)

ListVersionsByFunction (p. 482)

CreateAlias (p. 416)

UpdateAlias (p. 500)

DeleteAlias (p. 433)

GetAlias (p. 445)

ListAliases (p. 471)

これらの API に加え、既存の関連 API もバージョニング関連のオペレーションをサポートしています。

AWS CLI の使用例については、「チュートリアル: AWS Lambda エイリアスの使用 (p. 302)」を参照してください。

このセクションでは、AWS Lambda コンソールを使用したバージョニングの管理方法を説明します。AWS Lambda コンソールで関数を選択し、[Qualifiers] を選択します。

307

Page 314: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドバージョニング管理

[Qualifiers] メニューを展開すると、以下のスクリーンショットに示すように [Versions] および [Aliases] タブが表示されます。[Versions] ペインで、選択した関数のバージョンのリストが確認できます。選択した関数のバージョンがまだ発行されていない場合、[Versions] ペインには以下に示すように $LATEST バージョンのみが示されます。

関数のエイリアスのリストを表示するには、[Aliases] タブを選択します。最初は、次に示すようにエイリアスはありません。

308

Page 315: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドエイリアスを使用したトラフィックの移行

これで、[Actions] メニューを使用して選択した Lambda 関数のバージョンの発行またはエイリアスの作成ができるようになりました。

にバージョニングとエイリアスについては、「AWS Lambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

エイリアスを使用したトラフィックの移行デフォルトでは、エイリアスは単一の Lambda 関数バージョンを指します。エイリアスが別の関数バージョンを指すように更新されると、受信リクエストトラフィックは更新されたバージョンにすぐに指します。これにより、そのエイリアスは、新しいバージョンによる潜在的な不安定さの影響を受ける可能性があります。この影響を最小限に抑えるには、Lambda 関数の 2 つの異なるバージョンを指し、受信トラ

309

Page 316: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドエイリアスを使用したトラフィックの移行

フィックが各バージョンに送信される割合 (%) を決定できる Lambda エイリアスの routing-config パラメータを実装できます。

たとえば、本稼働環境への対応状況を分析する際に、受信トラフィックの 2 パーセントのみが新しいバージョンにルーティングされ、残りの 98 パーセントは元のバージョンにルーティングされることを指定できます。新しいバージョンが成熟して安定するまでは、必要に応じて比率を徐々に更新できます。その後、エイリアスを更新し、すべてのトラフィックを新しいバージョンにルーティングできます。

Note

エイリアスは最大 2 つの Lambda 関数バージョンを指すことができます。加えて:

• 両方のバージョンが同じ デッドレターキュー (p. 398) 設定 (または DLQ 設定) を持つ必要があります。

• 両方のバージョンは同じ IAM 実行ロールを持つ必要があります。• エイリアスで複数のバージョンを指す場合、エイリアスは $LATEST を指すことはできませ

ん。

エイリアスを使用したトラフィックの移行 (CLI)CreateAlias (p. 416) オペレーションを使用してウェイトに基づいて 2 つのパラメータ間でトラフィックを移行するようにエイリアスを設定するには、routing-config パラメータを設定する必要があります。次の例では、エイリアスで 2 つの異なる Lambda 関数バージョンを指し、バージョン 2 が 2 パーセントの呼び出しトラフィックを受信して、残りの 98 パーセントがバージョン 1 を呼び出します。

aws lambda create-alias --name alias name --function-name function-name \ --function-version 1--routing-config AdditionalVersionWeights={"2"=0.02}

着信トラフィックの割合 (%) は、UpdateAlias (p. 500) オペレーションを使用して新しいバージョン(バージョン 2) に更新できます。たとえば、次に示すように、新しいバージョンの呼び出しトラフィックを 5 パーセントに高めることができます。

aws lambda update-alias --name alias name --function-name function-name \--routing-config AdditionalVersionWeights={"2"=0.05}

すべてのトラフィックをバージョン 2 にルーティングするには、再び UpdateAlias オペレーションを使用して、バージョン 2 を指すように function-version プロパティを変更します。次に、以下のようにrouting-config パラメータを空の文字列に設定します。

aws lambda update-alias --name alias name --function-name function-name \ --function-version 2 --routing-config ''

エイリアスを使用したトラフィックの移行 (コンソール)以下に示すように Lambda コンソールを使用して、トラフィックの移行を設定できます。

1. Lambda 関数を開き、少なくとも 2 つの以前に発行されたバージョンがあることを確認します。それ以外の場合は、バージョニングの詳細について「AWS Lambda バージョニングの紹介 (p. 293)」を参照し、最初の関数バージョンを発行することができます。

2. [Actions] の [Create alias] を選択します。3. [Create a new alias] ウィンドウで、[Name*] の値を指定し、必要に応じて、エイリアスが指す

Lambda 関数の [Description] および [Version*] の値を指定します。ここでは、バージョンは 1 です。4. [Additional version] で、次のように指定します。

310

Page 317: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS サーバーレスアプリケー

ションモデル (AWS SAM) の使用

a. 2 番目の Lambda 関数のバージョンを指定します。b. 関数のウェイト値を入力します。ウェイトとは、エイリアスが呼び出されたときにそのバージョ

ンに割り当てられるトラフィックの割合 (%) です。最初のバージョンは残余ウェイトを受け取ります。たとえば、[Additional version] に 10 パーセントを指定した場合、最初のバージョンには自動的に 90 パーセントが割り当てられます。

5. [Create] を選択します。

起動されたバージョンの特定エイリアスで 2 つの関数バージョン間でトラフィックを移行している場合、どちらの Lambda 関数バージョンが呼び出されたかを特定するための 2 つの方法があります。

1. CloudWatch Logs – Lambda は、すべての関数呼び出しで、CloudWatch Logs に対して呼び出されたバージョン ID を含む START ログエントリを自動的に発信します。以下に例を示します。

19:44:37 START RequestId: request id Version: $version

Lambda は Executed Version ディメンションを使用して、実行されたバージョンでメトリクスデータをフィルタリングします。これはエイリアスの呼び出しのみに適用されます。詳細については、「AWS Lambda CloudWatch ディメンション (p. 334)」を参照してください。

2. 応答のペイロード (同期呼び出し) – 同期関数呼び出しの応答には、呼び出された関数バージョンを示すx-amz-executed-version ヘッダーが含まれます。

トピック• AWS サーバーレスアプリケーションモデル (AWS SAM) の使用 (p. 311)• Lambda ベースのアプリケーションのデプロイメントを自動化する (p. 318)

AWS サーバーレスアプリケーションモデル (AWSSAM) の使用

AWS サーバーレスアプリケーションモデル (AWS SAM) はサーバーレスアプリケーションを定義するモデルです。AWS SAM は、AWS CloudFormation によりネイティブにサポートされ、サーバーレスリソースを表すための簡易構文を定義します。現在の仕様では、API、Lambda 関数、Amazon DynamoDB テーブルを対象としています。SAM は、AWS パートナーと顧客が独自のツールセット内で採用し、拡張するために Apache 2.0 で利用可能となっています。詳細な仕様については、「AWS サーバーレスアプリケーションモデル」を参照してください。

AWS SAM を使用するサーバーレスリソースAWS SAM モデルに準拠したサーバレスリソースを持つ AWS CloudFormation テンプレートは、SAMファイルまたはテンプレートと呼ばれます。

以下の例はサーバーレスアプリケーションの一般的なコンポーネントを宣言するために AWS SAM を利用する方法を説明します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

Lambda 関数次に、Lambda 関数の表記法を紹介します:

311

Page 318: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS SAM を使用するサーバーレスリソース

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources:

FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: runtime CodeUri: s3://bucketName/codepackage.zip

Lambda 関数のコーディングを含むモジュールを指定する Handler プロパティの handler 値は呼び出し時に実行されます。Handler プロパティの index 値は、コードを含むファイルの名前を示します。サーバーレスアプリケーションで必要な数の関数を宣言できます。

また、アプリケーションで設定できる設定に環境変数を宣言できます。次の例では、2 つの Lambda 関数と DynamoDB テーブルを指す環境変数を持つサーバーレスアプリケーションを示しています。 Lambda関数コードの変更、再パッケージ、または再デプロイする必要なく、環境変数を更新できます。詳細については、「Environment Variables (p. 391)」を参照してください。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON

DynamoDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5

312

Page 319: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS SAM を使用するサーバーレスリソース

WriteCapacityUnits: 5 StreamSpecification: StreamViewType: streamview type

上記の表記に注意してください:

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31

これは AWS CloudFormation テンプレート内に AWS サーバーレスアプリケーションモデルによって定義されたオブジェクトを含めるために必要です。

SimpleTableSimpleTable は単一属性のプライマリキーで DynamoDB テーブルを作成するリソースです。サーバレスアプリケーションがやり取りしているデータに単一値のキーのみでアクセスする必要がある場合は、この簡易版を使用できます。以下で示すように、SimpleTable を使用するために前の例を更新できます:

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: TableName: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

イベントイベントは Amazon API Gateway エンドポイントまたは Amazon SNS 通知などの Lambda 関数をトリガーする AWS リソースです。Events プロパティは関数につき複数のイベントを設定できるようにする配列です。次に、DynamoDB テーブル付属の Lambda 関数をイベントソースとして記述する表記法を紹介します:

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON TableName: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions:

313

Page 320: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS SAM を使用するサーバーレスリソース

- AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

前述の通り、Lambda 関数をトリガーするイベントソースを複数設定できます。以下の例では、HTTP PUTまたは POST イベントのいずれかでトリガー可能な Lambda 関数を示します。

APIAWS SAM を使用して API を定義する方法は二つあります。以下では、Swagger を使用して基礎となるAmazon API Gateway リソースを設定します。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: Api: Type: AWS::Serverless::Api Properties: StageName: prod DefinitionUri: swagger.yml

次の例では、AWS::Serverless::Api リソースタイプは、AWS::Serverless::Function リソースで定義された API イベントの組み合わせから暗黙的に追加されます。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: GetFunction: Type: AWS::Serverless::Function Properties: Handler: index.get Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBReadOnlyAccess Environment: Variables: TABLE_NAME: !Ref Table Events: GetResource: Type: Api Properties: Path: /resource/{resourceId} Method: get PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.put Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events:

314

Page 321: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS SAM を使用するサーバーレスリソース

PutResource: Type: Api Properties: Path: /resource/{resourceId} Method: put DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.delete Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events: DeleteResource: Type: Api Properties: Path: /resource/{resourceId} Method: delete Table: Type: AWS::Serverless::SimpleTable

上記の例では、AWS CloudFormation が Amazon API Gateway API を、"/resource/{resourceId}"パス、および GET、PUT、DELETE メソッドで作成します。

アクセス許可以下に示すように、この関数の実行ロールとして使用する AWS Identity and Access Management (IAM)ロールに、Amazon リソースネーム (ARN) を指定できます。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: FunctionName: Type: AWS::Serverless::Function Properties: Role:role arn

また、Lambda 関数リソースに一つ以上のフルマネージドログ管理ポリシーを指定できます。AWSCloudFormation は、管理ポリシーにデフォルトの Lambda ベーシック実行ポリシーを加えた新しいロールを作成します。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: FunctionName: Type: AWS::Serverless::Function Properties: Policies: AmazonDynamoDBFullAccess

これらのいずれも指定しない場合、デフォルト実行ロールは Lambda ベーシック実行権限で作成されます。

315

Page 322: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド次のステップ

Note

サーバーレスリソースを使用するほかに、従来の AWS CloudFormation 構文を使用しても同じテンプレートでリソースを表現できます。現在の SAM モデルに含まれないリソースでも、AWS CloudFormation 構文を使って AWS CloudFormation テンプレートで作成できます。さらに、AWS CloudFormation 構文を使用して、SAM モデルを使用する代わりにサーバーレスリソースを表現することもできます。従来の CloudFormation 構文を使用して SAM テンプレートの一部として Lambda 関数を指定する方法については、『AWS CloudFormation ユーザーガイド』の「AWS::Lambda::Function」を参照してください。

完全なサーバーレスアプリケーション例のリストは「AWS Lambda の使用方法の例 (p. 182)」を参照してください。

次のステップ独自のサーバーレスアプリケーションを作成する (p. 316)

独自のサーバーレスアプリケーションを作成する次のチュートリアルでは、環境変数として指定した Amazon S3 バケットの名前を返す単一の Node.js 関数からなる単純なサーバーレスアプリケーションを作成します。以下の手順に従ってください:

1. 以下の Node.js をコピーしてテキストファイルに貼り付け、index.js という名前で保存します。これは Lambda 関数を表しています。

var AWS = require('aws-sdk');

exports.handler = function(event, context, callback) { var bucketName = process.env.S3_BUCKET; callback(null, bucketName); }

2. 以下をテキストファイルに貼り付け、example.yaml という名前で保存します。Runtime パラメータは nodejs6.10 を使用しますが、nodejs8.10 または nodejs4.3 も指定できることに注意してください。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: TestFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Environment: Variables: S3_BUCKET: bucket-name

3. examplefolder という名前のフォルダを作成し、example.yaml ファイルと index.js ファイルをフォルダ内に置きます。

example フォルダには次の二つのファイルが含まれています。これらのファイルを使用して、サーバーレスアプリケーションをパッケージ化することができます:• example.yaml

• index.js

316

Page 323: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド独自のサーバーレスアプリケーションを作成する

パッケージ化とデプロイLambda 関数ハンドラーと example.yaml ファイルを作成したら、AWS CLI を使用してサーバレスアプリケーションをパッケージ化してデプロイできます。

梱包

アプリケーションをパッケージ化するには、package コマンドが ZIP デプロイパッケージのアップロードに使用する Amazon S3 バケットを作成します (example.yaml ファイル内で指定していない場合)。Amazon S3 バケットを作成するには、以下のコマンドを使用できます:

aws s3 mb s3://bucket-name --region region

次に、コマンドプロンプトを開いて以下のように入力します:

aws cloudformation package \ --template-file file path/example.yaml \ --output-template-file serverless-output.yaml \ --s3-bucket s3-bucket-name

パッケージコマンドは AWS SAM テンプレートを、この場合には serverless-output.yaml を返します 。これには指定したAmazon S3 バケットのテプロイメント zip を指定する CodeUri が含まれます。このテンプレートはサーバーレスアプリケーションを表します。これで、デプロイする準備ができました。

デプロイメント

アプリケーションをデプロイするには、次のコマンドを実行します:

aws cloudformation deploy \ --template-file serverless-output.yaml \ --stack-name new-stack-name \ --capabilities CAPABILITY_IAM

--template-file パラメーターに指定する値がそのパッケージコマンドによって返される SAM テンプレートの名前であることに注意してください。さらに、--capabilities パラメーターはオプションです。AWS::Serverless::Function リソースは、テンプレートで指定されていない場合、暗黙的にLambda 関数を実行するロールを作成します。--capabilitiesパラメーターを使用して、AWSCloudFormation がユーザーの代わりにロールを作成できることを明示的に確認します。

aws cloudformation deploy コマンドを実行すると、AWS CloudFormation スタックへの変更リストである AWS CloudFormation ChangeSet が作成され、その後デプロイします。一部のスタックテンプレートには、新しい AWS Identity and Access Management (IAM) ユーザーを作成するなど、AWS アカウントのアクセス許可に影響するリソースが含まれている場合があります。このようなスタックの場合は、--capabilities パラメーターを指定して、それらの機能を明示的に確認する必要があります。詳細については、『AWS CloudFormation API Reference』の「CreateChangeSet」を参照してください。

結果を確認するには、新たに作成した AWS CloudFormation スタックを閲覧するための AWSCloudFormation コンソールと、関数を確認するための Lambda コンソールを開きます。

完全なサーバーレスアプリケーション例のリストは「AWS Lambda の使用方法の例 (p. 182)」を参照してください。

サーバーレスアプリケーションのエクスポート

サーバーレスアプリケーションをエクスポートすることで、Lambda コンソールを使用して、別の AWSリージョンや開発ステージなどに再デプロイすることができます。Lambda 関数をエクスポートすると、

317

Page 324: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda ベースのアプリケーションのデプロイメントを自動化する

サーバーレスアプリケーションを表す ZIP デプロイメントパッケージと SAM テンプレートが提供されます。再デプロイについては、前のセクションで記述した package と deploy コマンドを使用できます。

Lambda 設計図の一つを選択してパッケージ化してデプロイするための ZIP パッケージを作成することもできます。これを行うには、以下のステップに従います。

Lambda コンソールを使用してサーバーレスアプリケーションをエクスポートする方法

1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にあるAWS Lambda コンソールを開きます。

2. 次のいずれかを行ってください。

• Lambda 設計図を使用して関数を作成する – 設計図を選んでステップに従い Lambda 関数を作成します。例については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。レビューページが表示されたら、関数のエクスポートを選択します。

• 関数を作成する – 関数の作成を選択して関数を作成します。Lambda 関数を作成したら、その関数を選択してエクスポートできます。アクションを選択してから、関数のエクスポートを選択します。

• 既存の Lambda 関数を開く – [Function name]、[Actions]、[Export function] の順に選択して関数を開きます。

3. 関数のエクスポートウィンドウには次のオプションが用意されています:

• AWS SAM ファイルのダウンロードを選択します。このファイルはサーバレスアプリケーションを構成する Lambda 関数やその他のリソースを定義します。

• デプロイメントパッケージのダウンロードを選択します。これには、Lambda 関数コードと依存ライブラリが含まれます。

AWS SAM ファイルと ZIP 展開パッケージを使用し、パッケージ化とデプロイ (p. 317) の手順に従ってサーバーレスアプリケーションを再デプロイします。

Lambda ベースのアプリケーションのデプロイメントを自動化する

前のセクションでは、SAM テンプレートを作成し、デプロイメントパッケージを生成し、AWS CLI を使用してサーバーレスアプリケーションを手動でデプロイする使用方法について学習しました。このセクションでは、次の AWS サービスを活用してデプロイメントプロセスを完全に自動化します。

• CodePipeline: CodePipeline を使用して、サーバーレスアプリケーションをリリースするために必要なステップをモデル化し、視覚化し、自動化します。詳細については、「AWS CodePipeline とは何か」を参照してください

• CodeBuild: CodeBuild を使用して、サーバーレスアプリケーションを構築、ローカルテスト、およびパッケージ化します。詳細については、「AWS Codebuild とは何か」を参照してください

• AWS CloudFormation: AWS CloudFormation を使用してアプリケーションをデプロイします。詳細については、「AWS CloudFormation とは何か」を参照してください

• CodeDeploy: AWS CodeDeploy を使用して、サーバーレスアプリケーションに更新プログラムを段階的にデプロイします。方法の詳細については、コードの段階的なデプロイ (p. 324) を参照してください。

以下のセクションでは、サーバーレスアプリケーションを導入するためにこれらのツールをすべて組み込む方法を示しています。

318

Page 325: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド次のステップ

次のステップサーバーレスアプリケーションのパイプラインを構築する (p. 319)

サーバーレスアプリケーションのパイプラインを構築する次のチュートリアルでは、サーバーレスアプリケーションのデプロイメントを自動化する AWSCodePipeline を作成します。 まず、パイプラインをトリガーするためにソースステージを設定する必要があります。このチュートリアルでは、以下のことを行います。

• GitHub を使用します。GitHub リポジトリを作成する手順については、「GitHub でリポジトリを作成する」を参照してください。

• 次に示すように、AWS CloudFormation ロールを作成し、そのロールに AWSLambdaExecute ポリシーを追加します。

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドの「AWS のサービスにアクセス許可を委任するロールの作成」のステップに従って IAM ロール (実行ロール) を作成し、「AWS サービスのロールを作成するには」セクションに移動してください。ロールを作成するステップに従うときに、次のことに注意してください。• [ロールタイプの選択] で [AWS サービスロール] を選択し、続いて [CloudFormation] を選択しま

す。[Next: Permissions] を選択します。• [アクセス権限ポリシーをアタッチする] では、検索バーを使用して検索し、

[AWSLambdaExecute] を選択します。[Next: Review] を選択します。• [Role Name] では、AWS アカウント内で一意の名前 (たとえば、cloudformation-lambda-

execution-role) を使用し、[Create role] を選択します。• 作成したロールを開き、[アクセス許可] タブで [インラインポリシーの追加] を選択します。• [ポリシーの作成] で [JSON] タブを選択し、次を入力します。

Note

region と id のプレースホルダーはお客様のリージョンとアカウント ID に置き換えてください。

{ "Statement": [ { "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::codepipeline*" ], "Effect": "Allow" }, { "Action": [

319

Page 326: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサーバーレスアプリケーションのパイプラインを構築する

"lambda:*" ], "Resource": [ "arn:aws:lambda:region:id:function:*" ], "Effect": "Allow" }, { "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:region::*" ], "Effect": "Allow" }, { "Action": [ "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy" ], "Resource": [ "arn:aws:iam::id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy" ], "Resource": [ "arn:aws:iam::id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:PassRole" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Action": [ "cloudformation:CreateChangeSet" ], "Resource": [ "arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31" ], "Effect": "Allow" }, { "Action": [ "codedeploy:CreateApplication", "codedeploy:DeleteApplication", "codedeploy:RegisterApplicationRevision" ], "Resource": [ "arn:aws:codedeploy:region:id:application:*" ],

320

Page 327: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサーバーレスアプリケーションのパイプラインを構築する

"Effect": "Allow" }, { "Action": [ "codedeploy:CreateDeploymentGroup", "codedeploy:CreateDeployment", "codedeploy:GetDeployment" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentgroup:*" ], "Effect": "Allow" }, { "Action": [ "codedeploy:GetDeploymentConfig" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentconfig:*" ], "Effect": "Allow" } ], "Version": "2012-10-17"}

• [Validate Policy] を選択して、[Apply Policy] を選択します。

ステップ 1: リポジトリの設定リポジトリの設定には、Lambda がサポートする任意のランタイムを使用できます。次の例では、Node.jsを使用します。

リポジトリを設定するには、次の通りに実行します:

• 以下のコードを含む index.js file を追加します。

var time = require('time');exports.handler = (event, context, callback) => { var currentTime = new time.Date(); currentTime.setTimezone("America/Los_Angeles"); callback(null, { statusCode: '200', body: 'The time in Los Angeles is: ' + currentTime.toString(), });};

• 以下のコンテンツを含む samTemplate.yaml ファイルを追加します。これはアプリケーションのリソースを定義する SAM テンプレートです。この SAMの テンプレートは API Gateway によってトリガーされる Lambda 関数を定義します。runtime パラメータは nodejs6.10 を使用しますが、nodejs4.3も指定できることに注意してください。AWS SAM についての詳細は、「AWS サーバーレスアプリケーションモデル化」を参照してください。

AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Description: Outputs the timeResources: TimeFunction: Type: AWS::Serverless::Function Properties:

321

Page 328: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサーバーレスアプリケーションのパイプラインを構築する

Handler: index.handler Runtime: nodejs6.10 CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET

• buildspec.yml ファイルを追加します。ビルド仕様とは、AWS CodeBuild がビルドを実行するために使用する YAML 形式のビルドコマンドと関連設定のコレクションです。詳細については、「AWSCodeBuildの ビルド仕様リファレンス」を参照してください。この例では、ビルドアクションは次のとおりです:• npm を使用して時間パッケージをインストールします。• Package コマンドを実行して、パイプラインの段階的なデプロイメントステップでデプロイパッケー

ジを準備します。パッケージコマンドの詳細については、「S3 バケットへのローカルアーティファクトのアップロード」を参照してください

version: 0.1phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --s3-bucket bucket-name --output-template-file outputSamTemplate.yamlartifacts: type: zip files: - samTemplate.yaml - outputSamTemplate.yaml

SAM でデプロイメントパッケージを手動でパッケージ化する場合の手順と同様に、--s3-bucket パラメーターの値と Amazon S3 バケットの名前を指定する必要があることに注意してください。 前のチュートリアルの 梱包 (p. 317) ステップでこれについて説明しています。

ステップ 2: パイプラインの作成

AWS CodePipeline を作成するには、次のステップに従ってください。

1. AWS マネジメントコンソール にサインインして、AWS CodePipeline コンソールを開きます。2. [Get Started Now] を選択します。3. [パイプラインの名前] ボックスにパイプラインの名前を入力し、[次のステップ] を選択します。4. ソースプロバイダー: で GitHub を選択します。5. Connect to GitHub に接続: を選択したら、接続するリポジトリとブランチを選択します。選択したブ

ランチへの git はパイプラインをトリガーします。[Next step] を選択します。6. AWS CodeBuild を ビルドプロバイダ として選択します。7. ビルドプロジェクトの新規作成 を選択してプロジェクト名を入力します。8. Ubuntu をオペレーションシステムに選択します。9. Node.js をランタイムに選択します。10. バージョン で aws/codebuild/nodejs:version を選択します11. [ビルド仕様] で Use the buildspec.yml in the source code root directory を選択しま

す。

322

Page 329: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドサーバーレスアプリケーションのパイプラインを構築する

12. ビルドプロジェクトの保存 を選択します。

Note

AWS CodeBuild のサービスロールがユーザーに代わり自動的に作成されます。

[Next step] を選択します。13. [デプロイプロバイダ*] で [AWS CloudFormation] を選択します。

このオプションを選択すると、AWS CloudFormation コマンドが SAM テンプレートのデプロイに使用されます。詳細については、「AWS SAM を使用するサーバーレスリソース (p. 311)」を参照してください。

14. アクションモード: で 変更セットの作成または置換 を選択します。15. [スタックの名前:] で「MyBetaStack」と入力します。16. セット名の変更: で MyChangeSet と入力します。17. テンプレートファイルで outputSamTemplate.yaml と入力します。18. 設備 で CAPABILITY_IAM を選択します。19. [Role] で、このチュートリアルの最初に作成した AWS CloudFormation ロールを選択し、[Next step]

を選択します。20. [Create role] を選択します。次へ を選択して、許可を選択します。[Next step] を選択します。21. パイプラインを確認し、パイプラインの作成 を選択します。

ステップ 3: 生成されたサービスポリシーを更新する

以下のステップを完了して、CodeBuild が Amazon S3 バケットにビルドアーティファクトをアップロードできるようにします。

1. IAM マネジメントコンソールに移動します。2. [Roles] を選択します。3. プロジェクト用に生成されたサービスロール (通常は code-build-project-name-service-role) を開き

ます。4. [アクセス許可] タブで [インラインポリシーの追加] を選択します。5. [サービス] で [サービスの選択] を選択します。6. [以下のサービスを選択してください] で [S3] を選択します。7. [アクション] で [アクションの選択] を選択します。8. [アクセスレベルグループ] で [書き込み] を展開し、[PutObject] を選択します。9. [リソース] を選択し、[すべて] チェックボックスを選択します。10. [ポリシーの確認] を選択します。11. [名前*] を入力し、[ポリシーの作成] を選択します。続いて、前のセクションで作成したパイプライン

に戻ります。

ステップ 4: ベータデプロイメント段階を完了する

ベータ段階を完了するには次のステップを使用します。

1. [Edit] を選択します。2. 次の

323

Page 330: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドコードの段階的なデプロイ

アイコンを [MyBetaStack] の横から選択します。3. [アクションカテゴリー:] で [デプロイ] が選択されていない場合には、選択します。4. [デプロイプロバイダ*] で [AWS CloudFormation] が選択されていない場合には、選択します。5. [アクションモード*] で [変更セットの実行] を選択します。 これは、前回のチュートリアルの デプロ

イメント (p. 317) のステップで説明したように、手動でパッケージをデプロイする場合のステップと類似しています。CreateChangeSet は SAM テンプレートを完全な AWS CloudFormation 形式に変換し、deployChangeSet がその AWS CloudFormation テンプレートをデプロイします。

6. [スタックの名前*] で「MyBetaStack」を入力または選択します。7. [セット名の変更*] で [MyChangeSet] と入力します。8. [Add action] を選択します。9. [パイプラインの変更を保存する] を選択します。10. [Save and continue] を選択します。

パイプラインの準備が完了しました。このパイプラインに接続するブランチへの git プッシュはデプロイをトリガーします。パイプラインをテストし、アプリケーションを初めてデプロイする場合、次のいずれかを実行します:

• パイプラインに接続されているブランチに git プッシュを実行します。• AWS CodePipeline コンソールに移動して、作成したパイプラインの名前を選択し、[変更のリリース] を

選択します。

次のステップコードの段階的なデプロイ (p. 324)

コードの段階的なデプロイAWS SAM を使用してサーバーレスアプリケーションを作成する場合は、Lambda の安全なデプロイのために、組み込みの AWS CodeDeploy を使用できます。数行の設定だけで、SAM は以下の処理を実行します。

• Lambda 関数の新しいバージョンをデプロイし、新しいバージョンを参照するエイリアスを自動的に作成する。

• 顧客のトラフィックを新しいバージョンに段階的に移行し、想定どおりに動作しているかを確認して、動作していない場合は更新プログラムをロールバックする。

• 事前トラフィックおよび事後トラフィックテスト機能を定義して、新しくデプロイしたコードが正しく設定され、アプリケーションが想定どおりに動作していることを確認する。

• CloudWatch アラームがトリガーされた場合にデプロイをロールバックする。

これらの処理はすべて、SAM テンプレートを更新することで実行できます。以下の例では、Code Deployを使用して、新しくデプロイしたバージョンに顧客を段階的に移行するシンプルなバージョンを示しています。

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler

324

Page 331: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドコードの段階的なデプロイ

Runtime: nodejs4.3 CodeUri: s3://bucket/code.zip

AutoPublishAlias: live

DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before & after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction

SAM テンプレートの上記のリビジョンは以下の処理を実行します。

• AutoPublishAlias - このプロパティを追加し、エイリアス名を指定することで、AWS SAM は以下の処理を実行します。• Lambda 関数の Amazon S3 URI に対する変更に基づいて新しいコードがいつデプロイされるかを検出

する。• 最新のコードでその関数の最新バージョンを作成して発行する。• Lambda 関数の最新バージョンを参照するエイリアスを指定された名前で作成する (エイリアスがまだ

ない場合)。関数の呼び出しでエイリアスを利用するには、エイリアス修飾子を使用する必要があります。Lambda 関数のバージョニングとエイリアスに慣れていない場合は、「AWS Lambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

• デプロイ設定タイプ - 上記の例では、顧客トラフィックの 10% が新しいバージョンにすぐに移行され、10 分後にすべてのトラフィックが新しいバージョンに移行されます。ただし、事前と事後のフックテストに失敗したり、CloudWatch アラームがトリガーされたりすると、CodeDeploy はデプロイをロールバックします。以下の表では、上記の例で使用しているトラフィック移行オプションのほかにも使用可能なオプションを示しています。次の点に注意してください。• Canary: トラフィックは 2 回の増分で移行されます。残りのトラフィックが 2 回目の増分で移行され

る前に、最初の増分および間隔で更新された Lambda 関数のバージョンに移行されるトラフィックの割合 (%) を分単位で指定する、事前定義された Canary オプションから選択できます。

• Linear: トラフィックは毎回同じ間隔 (分) の等しい増分で移行されます。増分ごとに移行するトラフィックの割合 (%) と、増分間の間隔 (分) を指定する、事前定義済み線形オプションから選択できます。

• All-at-once: すべてのトラフィックは元の Lambda 関数から最新バージョンの Lambda 関数に一度に移行されます。

 

デプロイ設定タイプ

Canary10Percent30Minutes

Canary10Percent5Minutes

Canary10Percent10Minutes

Canary10Percent15Minutes

Linear10PercentEvery10Minutes

Linear10PercentEvery1Minute

Linear10PercentEvery2Minutes

325

Page 332: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドコードの段階的なデプロイ

デプロイ設定タイプ

Linear10PercentEvery3Minutes

AllAtOnce

• アラーム - デプロイ時に発生したエラーによってトリガーされる CloudWatch アラームであり、デプロイが自動的にロールバックされます。たとえば、デプロイ時に更新されたコードによりアプリケーション内でエラーが発生した場合や、指定した AWS Lambda メトリクスまたはカスタム CloudWatch メトリクスがアラームしきい値を超えた場合にトリガーされます。

• フック - 新しいバージョンへのトラフィックの移行が開始する前にサニティチェックを実行する、事前トラフィック機能と、新しいバージョンへのトラフィックの移行が完了した後にサニティチェックを実行する、事後トラフィックテスト機能があります。• PreTraffic: トラフィックの移行が開始する前に、CodeDeploy は事前トラフィックフック Lambda 関

数を呼び出します。この Lambda 関数は CodeDeploy にコールバックして、成功または失敗をレポートします。失敗の場合は、移行を中止し、エラーを AWS CloudFormation にレポートします。成功の場合、CodeDeploy はトラフィックの移行に進みます。

• PostTraffic: トラフィックの移行が完了した後に、CodeDeploy は事後トラフィックフック Lambda 関数を呼び出します。事前トラフィックフックの場合と同様、この関数は CodeDeploy にコールバックして、成功または失敗をレポートします。事後トラフィックフックを使用して、統合テストやその他の検証アクションを実行します。

詳細については、「安全なデプロイのための SAM レファレンス」を参照してください。

326

Page 333: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAmazon CloudWatch の使用

Lambda ベースのアプリケーションのモニタリングとトラブルシューティング

AWS Lambda は、Lambda 関数の呼び出し動作を自動的に追跡し、モニタリング可能なフィードバックを提供します。また、イベントソースの統合についてや、ダウンストリームリソースが想定どおりに実行されるかどうかについてなど、完全な関数呼び出しスペクトルを分析するためのメトリクスを提供します。以下のセクションでは、Lambda 関数の呼び出し動作の分析に使用できるツールに関するガイダンスを示しています。

トピック• Amazon CloudWatch の使用 (p. 327)• AWS X-Ray を使用する (p. 335)

Amazon CloudWatch の使用AWS Lambda はお客様の代わりに自動的に Lambda 関数をモニタリングし、Amazon CloudWatch を通じてメトリクスを報告します。コードの実行をモニタリングできるようにするため、Lambda はリクエスト数、リクエストあたりのレイテンシー、エラーを引き起こしたリクエスト数を自動的に追跡し、関連するCloudWatch のメトリクスを発行します。これらのメトリクスを利用して、CloudWatch カスタムアラームを設定できます。CloudWatch の詳細については、Amazon CloudWatch ユーザーガイド を参照してください。

AWS Lambda コンソール、CloudWatch コンソール、他の Amazon Web Services (AWS) リソースを使用して、各 Lambda 関数のリクエストレートとエラーレートを表示できます。以下のトピックでは、Lambda CloudWatch メトリクスと、それらへのアクセス方法について説明します。

• AWS Lambda の Amazon CloudWatch メトリクスへのアクセス (p. 329)• AWS Lambda のメトリクス (p. 332)

コードが正常に動作しているかどうかを検証できるように、ログ記録ステートメントをコードに挿入できます。Lambda は、自動的に Amazon CloudWatch Logs と統合され、Lambda 関数と関連付けられたCloudWatch Logs グループ (/aws/lambda/<例例例>) にすべてのログをコードからプッシュできます。ロググループの詳細と、CloudWatch コンソールを通じてロググループにアクセスする方法の詳細については、『Amazon CloudWatch ユーザーガイド』の「システム、アプリケーション、カスタムログファイルのモニタリング」を参照してください。CloudWatch ログエントリにアクセスする方法については、「AWSLambda の Amazon CloudWatch ログへのアクセス (p. 331)」を参照してください。

Note

Lambda 関数コードが実行されているが、数分経過してもログデータがまったく生成されない場合は、Lambda 関数の実行ロールでログデータを CloudWatch Logs に書き込むアクセス権限が付与されていない可能性があります。これらのアクセス権限が付与されるように実行ロールを正しくセットアップしていることを確認する方法については、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

327

Page 334: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドトラブルシューティングシナリオ

AWS Lambda のトラブルシューティングシナリオこのセクションでは、CloudWatch のログおよびモニタリング機能を使用して Lambda 関数をモニタリングおよびトラブルシューティングする方法について説明します。

トラブルシューティングシナリオ 1: Lambda 関数が正常に機能しないこのシナリオは、ちょうど「チュートリアル: Amazon S3 での AWS Lambda の使用 (p. 184)」を終えたところです。ただし、S3 オブジェクトを作成したときに Amazon S3 にサムネイルイメージをアップロードするために作成した Lambda 関数が正常に機能しません。Amazon S3 にオブジェクトをアップロードすると、サムネイルイメージがアップロードされていないことがわかります。この問題は、次のようにトラブルシューティングできます。

Lambda 関数が正常に機能しない理由を特定するには

1. コードを確認し、正常に動作していることを確認します。エラーレートが高い場合は正常に動作していないことを示している可能性があります。

他の Node.js 関数と同様にコードをローカルでテストするか、コンソールのテスト呼び出し機能を使用して Lambda コンソール内でテストできます。または、AWS CLI コマンド Invoke を使用できます。イベントに対する応答としてコードが実行されるたびに、Lambda 関数に関連付けられたロググループ (/aws/lambda/<例例例>) にログエントリが書き込まれます。

ログに記録される可能性のあるエラーの例を以下に示します。

• ログにスタックトレースがある場合、コード内のエラーと考えられます。コードを見直し、スタックトレースが示しているエラーをデバッグします。

• ログに permissions denied エラーがある場合は、実行ロールとして指定した IAM ロールに、必要なアクセス権限がない可能性があります。IAM ロールに、コードで参照されているすべてのAWS リソースにアクセスするために必要なアクセス権限があることを確認します。実行ロールを正しくセットアップしたことを確認するには、「アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)」を参照してください。

• ログに timeout exceeded エラーがある場合は、タイムアウト設定が関数コードの実行時間を超えています。これは、タイムアウトが短すぎるか、コードの実行に時間がかかりすぎているための可能性があります。

• ログに memory exceeded エラーがある場合は、メモリ設定が低すぎます。大きい値に設定します。メモリ容量制限の詳細については、「CreateFunction (p. 425)」を参照してください。メモリ設定を変更すると、AWS Lambda product website の期間に対する請求方法も変わる場合があります。

料金については、「AWS Lambda 製品のウェブサイト」を参照してください。2. Lambda 関数がリクエストを受信していることを確認します。

関数コードが正常に動作していて、テストの呼び出しに正しく応答している場合でも、関数がAmazon S3 からリクエストを受信していない可能性があります。Amazon S3 が関数を呼び出すことができる場合、CloudWatch リクエストのメトリクスが増加します。CloudWatch リクエストが増加していない場合は、関数に関連付けられているアクセス権限ポリシーを確認します。

トラブルシューティングシナリオ 2: Lambda 関数の実行時のレイテンシーが増加するこのシナリオは、ちょうど「チュートリアル: Amazon S3 での AWS Lambda の使用 (p. 184)」を終えたところです。ただし、S3 オブジェクトを作成したときに Amazon S3 にサムネイルイメージをアップロー

328

Page 335: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCloudWatch メトリクスへのアクセス

ドするために作成した Lambda 関数が正常に機能しません。Amazon S3 にオブジェクトをアップロードする際、サムネイルイメージがアップロードされていることがわかりますが、コードの実行に予想よりも時間がかなりかかっています。この問題は、いくつかの方法でトラブルシューティングすることができます。たとえば、Lambda 関数の CloudWatch メトリクス "latency" をモニタリングして、レイテンシーが増加しているかどうかを確認できます。または、Lambda 関数の CloudWatch メトリクス "errors" が増加している場合は、タイムアウトエラーが原因である可能性があります。

Lambda 関数の実行時にレイテンシーが増加する理由を特定するには

1. 異なるメモリ設定でコードをテストします。

コードの実行に時間がかかりすぎる場合、そのロジックを実行するのに十分なコンピューティングリソースがない可能性があります。Lambda コンソールのテスト呼び出し機能を使用して、関数に割り当てられるメモリを増やし、もう一度コードをテストしてみてください。関数のログエントリでは、使用されたメモリ量、コードの実行時間、割り当てられたメモリを確認できます。メモリ設定を変更すると、期間中の課金方法が変更される可能性があります。料金については、「AWS Lambda」を参照してください。

2. ログを使用して、実行ボトルネックの原因を調査します。

他の Node.js 関数と同様にコードをローカルでテストするか、Lambda コンソールでテスト呼び出し機能を使用して Lambda コンソール内でテストできます。または、AWS CLI で asyncInvoke コマンドを使用できます。イベントに対する応答としてコードが実行されるたびに、Lambda 関数に関連付けられたロググループ (aws/lambda/<例例例>) にログエントリが書き込まれます。他のサービスへのコールアウトなど、コードのさまざまな部分にログ記録ステートメントを追加し、コードのさまざまな部分の実行にかかる時間を確認します。

AWS Lambda の Amazon CloudWatch メトリクスへのアクセスAWS Lambda はお客様の代わりに自動的に関数をモニタリングし、Amazon CloudWatch を通じてメトリクスを報告します。これらのメトリクスには、合計リクエスト、レイテンシー、およびエラー発生率が含まれます。Lambda メトリクスの詳細については、「AWS Lambda のメトリクス (p. 332)」を参照してください。CloudWatch の詳細については、Amazon CloudWatch ユーザーガイド を参照してください。

Lambda コンソール、CloudWatch コンソール、AWS CLI、または CloudWatch API を使用して、Lambdaのメトリクスをモニタリングしてログを表示できます。次の手順は、これらのさまざまなメソッドを使用してメトリクスにアクセスする方法を示しています。

Lambda コンソールを使用してメトリクスにアクセスするには

1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にあるAWS Lambda コンソールを開きます。

2. [Functions] ページで、関数名を選択し次に [Monitoring] タブを選択します。

329

Page 336: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCloudWatch メトリクスへのアクセス

Lambda 関数のメトリクスが図で表示されます。3. [ログにジャンプ] を選択して、ログを表示します。

CloudWatch コンソールを使用してメトリクスにアクセスするには

1. https://console.aws.amazon.com/cloudwatch/にある CloudWatch コンソールを開きます。2. ナビゲーションバーでリージョンを選択します。3. ナビゲーションペインで メトリクスを選択します。4. [CloudWatch Metrics by Category] ペインで [Lambda Metrics] を選択します。5. (オプション) グラフペインで、統計と期間を選択し、これらの設定を使用して CloudWatch アラーム

を作成します。

AWS CLI を使用してメトリクスにアクセスするには

list-metrics コマンドおよび get-metric-statistics コマンドを使用します。

CloudWatch CLI を使用してメトリクスにアクセスするには

mon-list-metrics コマンドおよび mon-get-stats コマンドを使用します。

330

Page 337: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCloudWatch ログへのアクセス

CloudWatch API を使用してメトリクスにアクセスするには

ListMetrics オペレーションと GetMetricStatistics オペレーションを使用します。

AWS Lambda の Amazon CloudWatch ログへのアクセスAWS Lambda はお客様の代わりに自動的に Lambda 関数をモニタリングし、Amazon CloudWatch を通じてメトリクスを報告します。関数の失敗をトラブルシューティングするため、Lambda は関数で処理されたすべてのリクエストをログに記録し、Amazon CloudWatch Logs ログを通じてコードで生成されたログを自動的に保存します。

コードが正常に動作しているかどうかを検証できるように、ログ記録ステートメントをコードに挿入できます。Lambda は、自動的に CloudWatch Logs と統合され、Lambda 関数に関連付けられた CloudWatchLogs グループ (/aws/lambda/<例例例> という名前) にすべてのログをコードからプッシュできます。ロググループの詳細と、CloudWatch コンソールを通じてロググループにアクセスする方法の詳細については、『Amazon CloudWatch ユーザーガイド』の「システム、アプリケーション、カスタムログファイルのモニタリング」を参照してください。

Lambda コンソール、CloudWatch コンソール、AWS CLI、または CloudWatch API を使用して、Lambdaのログを表示できます。次の手順は、Lambda コンソールを使用してログを表示する方法を示しています。<step>

以前に Lambda 関数を作成していない場合は、「ご利用開始にあたって (p. 3)」を参照してください。</step>

Note

Lambda ログの使用には追加料金はかかりませんが、標準の CloudWatch Logs 料金が適用されます。詳細については、CloudWatch 料金表をご覧ください。

Lambda コンソールを使用してログを表示するには

1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にあるAWS Lambda コンソールを開きます。

2. [Functions] ページで、関数名を選択し次に [Monitoring] タブを選択します。

331

Page 338: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドメトリクス

Lambda 関数のメトリクスが図で表示されます。3. [ログにジャンプ] を選択して、ログを表示します。

CloudWatch Logs へのアクセスの詳細については、以下のガイドをご覧ください。

• Amazon CloudWatch ユーザーガイド• Amazon CloudWatch Logs API Reference• 『Amazon CloudWatch ユーザーガイド』の「ログファイルのモニタリング」

AWS Lambda のメトリクスこのトピックでは、AWS Lambda の名前空間、メトリクス、ディメンションについて説明します。AWSLambda はお客様の代わりに自動的に関数をモニタリングし、Amazon CloudWatch を通じてメトリクスを報告します。これらのメトリックスには、呼び出し合計、エラー、所要時間、スロットリング、DLQ エラーおよびストリームベースの呼び出しのイテレータの有効期限が含まれます。

CloudWatch は、基本的にはメトリクスのレポジトリーです。メトリクスは CloudWatch の基本的概念で、時系列に並んだデータポイントのセットを表しています。ユーザー (または AWS サービス) がメト

332

Page 339: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドメトリクス

リクスのデータポイントを CloudWatch にパブリッシュし、ユーザーはこのデータポイントに関する統計を、時系列順に並べられたデータのセットとして取得できます。

メトリクスは名前、名前空間、1 つ以上のディメンションで一意に定義されます。各データポイントには、タイムスタンプと、オプションとして測定単位があります。統計を要求した場合、返されるデータストリームは、名前空間、メトリクス名、ディメンションによって識別されます。CloudWatch の詳細については、『Amazon CloudWatch ユーザーガイド』を参照してください。

AWS Lambda CloudWatch のメトリクスAWS/Lambda 名前空間には、次のメトリクスが含まれます。

メトリクス 説明

Invocations イベントまたは API 呼び出しに応じて呼び出される関数の回数を測定します。廃止された RequestCount メトリックが置き換えられます。これは、成功したまたは失敗した呼び出しが含まれますが、調整された試行は含まれません。これは、関数の課金されるリクエストと等しくなります。AWSLambda は、ゼロ以外の値を持つメトリクスのみを CloudWatch 送信することに注意してください。

単位: Count

Errors 関数 (応答コード 4XX) エラーが原因で失敗した呼び出しの数を測定します。これは、廃止された ErrorCount メトリックが置き換えられます。失敗した呼び出しは、成功する再試行のトリガーとなる場合があります。ここでは次の点について説明します。

• 処理された例外 (context.fail(error) など)• コードの終了を起こす処理されない例外• メモリ不足例外• タイムアウト• 権限エラー

これには、デフォルトの同時オペレーションの制限を超える呼び出しレートによる呼び出し失敗 (エラーコード 429) または内部サービスエラー (エラーコード 500) による呼び出し失敗は含まれません。

単位: Count

Dead Letter Error Lambda が、失敗したイベントペイロードを設定済みのデッドレターキューに書き込むことができない場合に増分されます。これは、次のことが原因の可能性があります。

• 権限エラー• ダウンストリームサービスからのスロットリング• リソースの設定が不適切• タイムアウト

単位: Count

Duration 呼び出しの結果として関数コードが実行を開始してから関数の実行が停止されるまでの実時間を測定します。廃止されるレイテンシーメトリックが置き換えられます。データポイントの最大値は関数のタイムアウト設定で設定可能です。課金期間は、100 ミリ秒を単位として切り上げられます。AWS

333

Page 340: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドメトリクス

メトリクス 説明Lambda は、ゼロ以外の値を持つメトリクスのみを CloudWatch 送信することに注意してください。

単位: ミリ秒

Throttles お客様の同時オペレーションを超える呼び出しレートのために調整されたLambda 関数の呼び出し試行の回数を測定します (エラーコード 429)。失敗した呼び出しは、成功する再試行のトリガーとなる場合があります。

単位: Count

IteratorAge ストリームベースの呼び出しのみに対して出力されます (Amazon DynamoDBストリームまたは Kinesis ストリームによってトリガーされる関数)。 処理されたレコードの各バッチの最後のレコードの経過日数を測定します。経過日数は、Lambda がバッチを受け取った時間と、バッチの最後のレコードがストリームに書き込まれた時間の差です。

単位: ミリ秒

ConcurrentExecutionsアカウント内のすべての関数とカスタム同時実行制限が指定されている関数の集計メトリクスとして発行されます。バージョンまたはエイリアスは該当しません。特定の時点でにおける特定の関数の同時実行の合計を測定します。ある期間で集計された場合、平均メトリクスとして表示する必要があります。

単位: Count

UnreservedConcurrentExecutionsアカウント内のすべての関数の集約メトリクスとしてのみ送信されます。機能、バージョン、またはエイリアスは該当しません。カスタム同時実行制限が指定されていない関数の同時実行数の合計を表します。

単位: Count

エラー/呼び出し率

Lambda 関数呼び出し時のエラー率を計算する際は、呼び出しのリクエストと実際の呼び出しを区別することが重要です。エラー率は、課金される Lambda 関数の呼び出しの数を超える可能性があります。Lambda は、Lambda 関数コードが実行された場合にのみ呼び出しのメトリクスをレポートします。呼び出しのリクエストによってスロットリングなどの初期化エラーが生じ、Lambda 関数コードが呼び出されない場合、Lambda はエラーをレポートしますが、呼び出しメトリクスを記録しません。

• Lambda は、関数が実行されると Invocations=1 を送信します。Lambda 関数が実行されない場合は、何も送信されません。

• Lambda は、各呼び出しリクエストについて、Errors のデータポイントを送信します。Errors=0 は、関数実行エラーが存在しないことを意味します。Errors=1 は、関数エラーが存在することを意味します。

• Lambda は、各呼び出しリクエストについて、Throttles のデータポイントを送信します。Throttles=0 は、呼び出しのスロットルが存在しないことを意味します。Throttles=1は、呼び出しのスロットルが存在することを意味します。

AWS Lambda CloudWatch ディメンション次の表のディメンションを使用すると、Lambda 関数に対して返されるメトリクスを絞り込むことができます。

334

Page 341: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS X-Ray を使用する

ディメンション 説明

FunctionName Lambda 関数によってメトリクスデータをフィルタリングします。

Resource 関数のバージョンまたはエイリアスなど、Lambda 関数リソースによってメトリクスデータをフィルタリングします。

Version Lambda バージョンにリクエストしたデータをフィルタリングします。

Alias Lambda エイリアスにリクエストしたデータをフィルタリングします。

Executed Version Lambda 関数のバージョンによってメトリクスデータをフィルタリングします。これはエイリアスの呼び出しのみに適用されます。

AWS X-Ray を使用する典型的な Lambda ベースのアプリケーションは、Amazon S3 へのオブジェクトのアップロード、AmazonSNS 通知、および API アクションなどのイベントによってトリガーされる 1 つ以上の関数で構成されます。これらの関数がトリガーされると、通常、DynamoDB テーブルや Amazon S3 バケットなどのダウンストリームリソースが呼び出されるか、別の API 呼び出しが実行されます。AWS Lambda では、AmazonCloudWatch を利用して関数のすべての呼び出しのメトリックスとログを自動的に出力します。ただし、Lambda 関数を呼び出したイベントソースをトレースしたり、関数が実行したダウンストリーム呼び出しをトレースするには、このメカニズムがない方が便利な場合もあります。トレースがどのように機能するかについての完全な概要については、「AWS X-Ray」を参照してください。

AWS X-Ray を使用した Lambda ベースのアプリケーションのトレースAWS X-Ray は、AWS Lambda アプリケーションのパフォーマンスに関する問題を検出、分析、および最適化できる AWS のサービスです。X-Ray は、アプリケーションを構成する Lambda のサービスやアップストリームまたはダウンストリームサービスからメタデータを収集します。X-Ray はこのメタデータを使用して詳細なサービスグラフを生成します。これによりパフォーマンスのボトルネック、レイテンシーのスパイク、その他 Lambda アプリケーションに影響を及ぼす問題が図示されます。

「AWS X-Ray サービスマップ上の Lambda (p. 335)」を使用して問題のあるリソースやコンポーネントを識別したら、そのリクエストが視覚的に表現された部分を拡大して確認できます。この視覚化には、イベントソースが Lambda 関数をトリガーした時から関数の実行が完了されるまでが含まれます。X-Rayでは、Lambda 関数が他のサービスに対して実行したダウンストリーム呼び出しに関する情報など、関数のオペレーションの内訳が提供されます。さらに、X-Ray を Lambda に統合することで、AWS Lambdaサービスのオーバーヘッドが視認できるようになります。これは、リクエストのドウェル時間や呼び出し数などの詳細を表示することで行われます。

Note

現在 X-Ray と統合されているサービスのみが、Lambda トレースとは別にスタンドアロントレースとして表示されます。X-Ray を現在サポートしているサービスの一覧については、「AWS X-Ray を他の AWS のサービスと統合する」を参照してください。

AWS X-Ray サービスマップ上の LambdaX-Ray では、Lambda で処理されるリクエストのサービスマップに 3 つのタイプのノードが表示されます。

335

Page 342: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS X-Ray を使用した Lambda ベー

スのアプリケーションのトレース

• Lambda サービス (AWS::Lambda) – このタイプのノードは、Lambda サービスでリクエストの処理にかかった時間を表します。時間は Lambda が最初にリクエストを受信したときに開始され、リクエストがLambda サービスを離れたときに終了します。

• Lambda 関数 (AWS::Lambda::Function) – このタイプのノードは Lambda 関数の実行時間を表します。• ダウンストリームサービス呼び出し – このタイプでは、Lambda 関数内からのお各ダウンストリーム

サービス呼び出が個別のノードで表されます。

次の図では、ノードは (左から右に) Lambda サービス、ユーザー関数、および Amazon S3 に対するダウンストリーム呼び出しを表します。

詳細については、サービスマップの表示を参照してください。

AWS X-Ray トレースとしての Lambdaサービスマップから拡大して Lambda 関数のトレースビューを表示できます。トレースには、関数呼び出しに関する詳細情報が、セグメントおよびサブセグメントとして表示されます。

• Lambda サービスセグメント – このセグメントは、関数の呼び出しに使用されるイベントソースに応じて異なる情報を表します。• 同期とストリームイベントソース – サービスセグメントは Lambda サービスがリクエストやイベント

を受信したときからリクエストが Lambda サービスを離脱したとき (リクエストの最後の呼び出しが完了した後) までを計測します。

• 非同期 - サービスセグメントは応答時間を表します。つまり、Lambda サービスが 202 レスポンスをクライアントに返すまでにかかった時間です。

Lambda サービスセグメントには、2 つのタイプのサブセグメントを含めることができます。• ドウェル時間 (非同期呼び出しのみ) – 関数が呼び出される前に Lambda サービス内で経過した時間を

表します。このサブセグメントは Lambda サービスがリクエストやイベントを受信したときに開始され、Lambda 関数が最初に呼び出されたときに終了します。

• 試行 – 単一の呼び出し試行を表します。Lambda サービスによって導入されたオーバーヘッドを含みます。オーバーヘッドの例としては、関数のコードの初期化にかかった時間や関数の実行時間があります。

• Lambda 関数セグメント - 指定された呼び出し試行における関数の実行時間を表します。関数ハンドラが実行を開始したときから始まり、関数が終了すると終了します。このセグメントには 3 タイプのサブセグメントを含めることができます。• 初期化 - 関数の initialization コードの実行で経過した時間です。Lambda 関数ハンドラまたは

静的イニシャライザ外部のコードとして定義されます。• ダウンストリーム呼び出し - Lambda 関数のコードから他の AWS のサービスに対する呼び出しです。• カスタムサブセグメント - X-Ray SDK を使用して Lambda 関数セグメントに追加できるカスタムサブ

セグメントまたはユーザーの注釈です。

Note

トレースされる各呼び出しについて、Lambda は Lambda サービスセグメントとそのすべてのサブセグメントを発行します。これらのセグメントはランタイムに関係なく出力され、AWS API 呼び出し用の XRay SDK の使用が必要となります。

336

Page 343: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS X-Ray の Lambda でのセットアップ

AWS X-Ray の Lambda でのセットアップ以下は、Lambda で X-Ray をセットアップする方法の詳細情報です。

開始する前にLambda CLI を使用した Lambda 関数のトレースを有効にするには、まず関数の実行ロールにトレース用のアクセス権限を追加する必要があります。これを行うには、次のステップを実行します。

• AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

• Lambda 関数の実行ロールを見つけます。• 次の管理ポリシーをアタッチします。AWSXrayWriteOnlyAccess

これらのポリシーの詳細については、AWS X-Ray を参照してください。

Lambda コンソールを使用してトレースモードをアクティブに変更する場合は、トレース用アクセス権限が自動的に追加されます。詳しくは次のセクションを参照してください。

トレースアプリケーションを経由するリクエストのパスは、トラック ID を使用して追跡されます。トレースでは、1 つのリクエスト (通常は HTTP GET または POST リクエスト) で生成されたセグメントをすべて収集します。

Lambda 関数のトレースには 2 つのモードがあります。

• パススルー: 関数の実行ロールにトレース用のアクセス権限を追加している場合は、これがすべてのLambda 関数のデフォルト設定になります。この手法では、Lambda 関数は、AWS Elastic Beanstalk などのアップストリームサービスで X-Ray が有効になっている場合にのみトレースされます。

• アクティブ: Lambda 関数にこの設定がある場合、Lambda は X-Ray によって指定されるサンプリングアルゴリズムに基づいて呼び出しリクエストを自動的にサンプリングします。

Note

X-Ray はサンプリングアルゴリズムを適用することで、トレースを効率的にしつつ、アプリケーションが処理するリクエストの代表的なサンプルを提供できるようにします。デフォルトのサンプリングアルゴリズムは 1 分間につき 1 リクエストで、この制限を超えた場合はリクエストの 5 パーセントがサンプリングされます。ただし、関数へのトラフィックのボリュームが低い場合、サンプリングレートが高くなる場合があります。

Lambda 関数のトレースモードは、Lambda マネジメントコンソールを使用するか、LambdaCreateFunction (p. 425) API アクションまたは UpdateFunctionConfiguration (p. 515) API アクションを使用して変更できます。

Lambda コンソールを使用する場合は、次のようになります。

• 関数のトレースモードをアクティブに変更すると、トレース用のアクセス権限が自動的に関数の実行ロールにアタッチされます。Lambda が [AWSXrayWriteOnlyAccess] ポリシーを関数の実行ロールに追加できなかったというエラーを受け取った場合は、https://console.aws.amazon.com/iam/ の IAM コンソールにサインインして、手動でポリシーを追加してください。

• アクティブな追跡を有効にするには、関数の [Configuration] タブに移動し、[Enable active tracing] ボックスをオンにします。

337

Page 344: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

Lambda CreateFunction (p. 425) API アクションまたは UpdateFunctionConfiguration (p. 515) API アクションを使用する場合:

• トレースモードをアクティブにする場合は、TracingConfig パラメータの Mode プロパティを Active. に設定します。繰り返しになりますが、新規関数のトレースモードはデフォルトでPassThrough に設定されます。

• 新規または更新された Lambda 関数は、指定された値に設定された $LATEST バージョンがあります。

Note

関数の実行ロールにトレース用のアクセス権限が追加されていない場合は、エラーが発生します。詳細については、「開始する前に (p. 337)」を参照してください。

Lambda 関数からのトレースセグメントの発行トレースされる各呼び出しについて、Lambda は Lambda サービスセグメントとそのすべてのサブセグメントを発行します。さらに、Lambda は Lambda 関数セグメントと init サブセグメントを発行します。これらのセグメントは関数のランタイムに関係なく発行され、コードの変更や追加のライブラリは必要ありません。Lambda 関数の X-Ray トレースにダウンストリーム呼び出しのカスタムセグメント、注釈、サブセグメントを含める場合は、追加のライブラリまたはコードの注釈を含める必要がある場合があります。

測定コードは、初期化コードの一部としてではなく、Lambda 関数ハンドラ内部に実装する必要があります。

以下の例では、サポートされているランタイムでこれを実行する方法を説明します。

• Node.js (p. 339)• Java (p. 340)• Python (p. 341)• Go (p. 343)

338

Page 345: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

Node.jsNode.js では、Lambda によってサブセグメントを X-Ray に発行して、関数が行った他の AWS サービスへのダウンストリーム呼び出しに関する情報を表示できます。これを行うには、最初に AWS X-Ray SDKfor Node.js をデプロイパッケージに含める必要があります。さらに、AWS SDK の require ステートメントを以下の方法でラップします。

var AWSXRay = require('aws-xray-sdk-core');var AWS = AWSXRay.captureAWS(require('aws-sdk'));

次に、前の例で定義された AWS 変数を使用して、X-Ray でトレースするサービスクライアントを初期化します。次に例を示します。

s3Client = AWS.S3();

これらのステップに従うと、s3Client を使用して関数から行われた呼び出しがその呼び出しを表す X-Ray サブセグメントになります。例として、以下の Node.js 関数を実行し X-Ray でのトレースの様子を確認できます。

var AWSXRay = require('aws-xray-sdk-core');var AWS = AWSXRay.captureAWS(require('aws-sdk'));

s3 = new AWS.S3({signatureVersion: 'v4'});

exports.handler = (event, context, callback) => { var params = {Bucket: BUCKET_NAME, Key: BUCKET_KEY, Body: BODY}; s3.putObject(params, function(err, data) { if (err) { console.log(err) } else { console.log('success!') } });};

前述のコードによって発行されたトレースは以下のようになります (非同期呼び出し)。

339

Page 346: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

JavaJava では、Lambda によってサブセグメントを X-Ray に発行して、関数が行った他の AWS サービスへのダウンストリーム呼び出しに関する情報を表示できます。この機能を利用するには、AWS X-Ray SDK forJava をデプロイパッケージに含めます。コードの変更は必要ありません。AWS SDK バージョン 1.11.48以降を使用している限り、トレースする関数からのダウンストリーム呼び出しにコード行を追加する必要はありません。

AWS SDK は X-Ray SDK を動的にインポートして、関数によって行われたダウンストリーム呼び出しのサブセグメントを発行します。X-RaySDK for Java を使用することで、カスタムサブセグメントの発行または X-Ray セグメントへの注釈の追加のためにコードを計測できます。

次の例では、X-Ray SDK for Java を使用して Lambda 関数を計測し、カスタムサブセグメントを発行してX-Ray にカスタム注釈を送信します。

package uptime;

import java.io.IOException;import java.time.Instant;import java.util.HashMap;import java.util.Map;

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;

import com.amazonaws.regions.Regions;import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;import com.amazonaws.services.dynamodbv2.model.AttributeValue;

340

Page 347: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.xray.AWSXRay;import com.amazonaws.xray.proxies.apache.http.HttpClientBuilder;

public class Hello { private static final Log logger = LogFactory.getLog(Hello.class);

private static final AmazonDynamoDB dynamoClient; private static final HttpClient httpClient;

static { dynamoClient = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); httpClient = HttpClientBuilder.create().build(); } public void checkUptime(Context context) { AWSXRay.createSubsegment("makeRequest", (subsegment) -> {

HttpGet request = new HttpGet("https://aws.amazon.com/"); boolean is2xx = false;

try { HttpResponse response = httpClient.execute(request); is2xx = (response.getStatusLine().getStatusCode() / 100) == 2; subsegment.putAnnotation("responseCode", response.getStatusLine().getStatusCode()); } catch (IOException ioe) { logger.error(ioe); } Map<String, AttributeValue> item = new HashMap<>(); item.put("Timestamp", new AttributeValue().withN("" + Instant.now().getEpochSecond())); item.put("2xx", new AttributeValue().withBOOL(is2xx)); dynamoClient.putItem("amazon-2xx", item); }); }}

前述のコードによって発行されたトレースは以下のようになります (同期呼び出し)。

PythonPython では、Lambda によってサブセグメントを X-Ray に発行して、関数が行った他の AWS サービスへのダウンストリーム呼び出しに関する情報を表示できます。これを行うには、最初に AWS X-Ray SDK for

341

Page 348: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

Python をデプロイパッケージに含める必要があります。さらに、boto3 (セッションを使用している場合は botocore) にパッチを適用して、AWS のサービスにアクセスするクライアントを作成すると自動的にX-Ray によって追跡されるようにできます。

import boto3from aws_xray_sdk.core import xray_recorderfrom aws_xray_sdk.core import patch

patch(['boto3'])

クライアント作成に使用するモジュールにパッチを適用すると、それを使用して追跡対象のクライアントを作成できます。次の例の場合は Amazon S3 です。

s3_client = boto3.client('s3')

X-Ray SDK for Python によって呼び出しのサブセグメントが作成され、リクエストとレスポンスの情報が記録されます。aws_xray_sdk_sdk.core.xray_recorder を使用して自動的にサブセグメントを作成できます。これを行うには、次の Lambda 関数に示すように、Lambda 関数をデコレートするか、関数内に xray_recorder.begin_subsegment() および xray_recorder.end_subsegment() を手動で呼び出します。

import boto3from aws_xray_sdk.core import xray_recorderfrom aws_xray_sdk.core import patch

patch(['boto3'])

s3_client = boto3.client('s3')

def lambda_handler(event, context): bucket_name = event['bucket_name'] bucket_key = event['bucket_key'] body = event['body']

put_object_into_s3(bucket_name, bucket_key, body) get_object_from_s3(bucket_name, bucket_key)

# Define subsegments manuallydef put_object_into_s3(bucket_name, bucket_key, body): try: xray_recorder.begin_subsegment('put_object') response = s3_client.put_object(Bucket=bucket_name, Key=bucket_key, Body=body) status_code = response['ResponseMetadata']['HTTPStatusCode'] xray_recorder.current_subsegment().put_annotation('put_response', status_code) finally: xray_recorder.end_subsegment()

# Use decorators to automatically set the subsegments@xray_recorder.capture('get_object')def get_object_from_s3(bucket_name, bucket_key): response = s3_client.get_object(Bucket=bucket_name, Key=bucket_key) status_code = response['ResponseMetadata']['HTTPStatusCode'] xray_recorder.current_subsegment().put_annotation('get_response', status_code)

Note

X-Ray SDK for Python では、次のモジュールにパッチを適用できます。

• botocore

342

Page 349: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

• boto3• リクエストでオプションで指定するパラメータです。• sqlite3• mysql

patch_all() を使用してこれらのすべてに一括でパッチを適用できます。

前述のコードによって発行されたトレースは以下のようになります (同期呼び出し)。

GoLambda 関数で Go 用 X-Ray SDK を使用できます。ハンドラに最初の引数として コンテキストオブジェクト (Go) (p. 70) が含まれている場合には、このオブジェクトを X-Ray SDK に渡すことができます。Lambda は、Lambda 呼び出しサービスセグメントにアタッチするサブセグメントに SDK が使用できるこのコンテキストを介して値を渡します。SDK で作成されたサブセグメントは、Lambda トレースの一部として表示されます。

Go 用 X-Ray SDK のインストール

次のコマンドを使用して Go 用 X-Ray SDK をインストールします(SDK の非テスト依存関係が含まれます)。go get -u github.com/aws/aws-xray-sdk-go/...

テスト依存関係を含める場合には、次のコマンドを使用します。go get -u -t github.com/aws/aws-xray-sdk-go/...

Glide を使用して依存関係を管理することもできます。glide install

343

Page 350: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数からのトレースセグメントの発行

Go 用 X-Ray SDK の設定

次のコードサンプルでは、Lambda 関数で Go 用 X-Ray SDK を設定する方法を示しています。

import ( "github.com/aws/aws-xray-sdk-go/xray") func myHandlerFunction(ctx context.Context, sample string) { xray.Configure(xray.Config{ LogLevel: "info", // default ServiceVersion: "1.2.3", }) ... //remaining handler code}

サブセグメントを作成する

次のコードでは、サブセグメントを開始する方法を示しています。

// Start a subsegment ctx, subSeg := xray.BeginSubsegment(ctx, "subsegment-name") // ... // Add metadata or annotation here if necessary // ... subSeg.Close(nil)

キャプチャ

次のコードでは、重要なコードパスをトレースしてキャプチャする方法を示しています。

func criticalSection(ctx context.Context) { // This example traces a critical code path using a custom subsegment xray.Capture(ctx, "MyService.criticalSection", func(ctx1 context.Context) error { var err error

section.Lock() result := someLockedResource.Go() section.Unlock()

xray.AddMetadata(ctx1, "ResourceResult", result) })}

HTTP リクエストのトレース

次に示すように、HTTP クライアントをトレースするには、xray.Client() メソッドを使用することもできます。

func myFunction (ctx context.Context) ([]byte, error) { resp, err := ctxhttp.Get(ctx, xray.Client(nil), "https://aws.amazon.com") if err != nil { return nil, err } return ioutil.ReadAll(resp.Body), nil}

344

Page 351: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 環境の AWS X-Ray デーモン

Lambda 環境の AWS X-Ray デーモンAWS X-Ray デーモンは、未加工セグメントデータを収集して AWS X-Ray サービスに受け渡すソフトウェアアプリケーションです。デーモンは SDK によって送信されたデータが X-Ray サービスに到達するように AWS X-Ray SDK と連動します。

Lambda 関数をトレースする場合、X-Ray デーモンが Lambda 環境で自動的に実行され、トレースデータが収集されて X-Ray に送信されます。トレース時は、X-Ray デーモンによって最大 16 MB または関数のメモリ割り当ての 3 パーセントが消費されます。たとえば、Lambda 関数に 128 MB のメモリを割り当てている場合、X-Ray デーモンが関数のメモリ割り当てのうち 16 MB を使用します。Lambda 関数に 1024MB が割り当てられている場合、X-Ray デーモンには 31 MB (3 パーセント) が割り当てられます。詳細については、AWS X-Ray デーモンを参照してください。

Note

Lambda は関数のメモリ制限を超えないよう、X-Ray デーモンを終了しようとします。たとえば、Lambda 関数に 128 MB が割り当てられている場合、X-Ray デーモンには 16 MB が割り当てられます。つまり、Lambda 関数には 112 MB のメモリ割り当てが残ります。ただし、関数が112 MB を超える場合、メモリ不足エラーがスローされないように X-Ray デーモンは終了されます。

環境変数を使用した AWS X-Ray との通信AWS Lambda は自動的に X-Ray デーモンとの通信を容易にするために 3 つの環境変数を生成し、X-RaySDK の構成を設定します。

• _X_AMZN_TRACE_ID: サンプリングデシジョン、トレース ID および親セグメント ID が含まれるトレースヘッダーが含まれます。(これらのプロパティの詳細については、トレースヘッダーを参照してください。)関数が呼び出されたときに Lambda がトレースヘッダーを受信すると、ヘッダーは _X_AMZN_TRACE_ID 環境変数の入力に使用されます。トレースヘッダーが受信されない場合、Lambda がそれを生成します。

• AWS_XRAY_CONTEXT_MISSING: X-Ray SDK はこの変数を使用して、関数が X-Ray データを記録しようとしたがトレーシングヘッダーを使用できない場合の動作を決定します。Lambda は、デフォルトでこの値を LOG_ERROR に設定します。

• AWS_XRAY_DAEMON_ADDRESS: この環境変数は、X-Ray デーモンのアドレスを IP_ADDRESS:PORT形式で表示します。X-Ray デーモンのアドレスを使用して、X-Ray SDK を使用せず X-Ray デーモンにトレースデータを直接送信できます。

AWS X-Ray コンソールでの Lambda トレース: 例以下に、2 つの異なる Lambda 関数の Lambda トレースを示します。各トレースで、異なる呼び出しタイプ (同期と非同期) のトレース構造を説明します。

• 非同期 - 以下は、正常呼び出し 1 回および DynamoDB へのダウンストリーム呼び出し 1 回を行う非同期 Lambda リクエストの例です。

345

Page 352: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS X-Ray コンソールでの Lambda トレース: 例

Lambda サービスセグメントは応答時間をカプセル化します。応答時間とは、クライアントにレスポンス (例: 202) を返すまでにかかった時間です。これには、Lambda サービスキューで経過した時間(ドウェル時間) および各呼び出し試行のサブセグメントが含まれます。(前述の例では呼び出し試行は1 つのみ表示されています。)サービスセグメント内の各試行サブセグメントには、対応するユーザー関数セグメントがあります。この例では、ユーザー関数セグメントには 2 つのサブセグメントがあります。ハンドラ前に実行される関数の初期化コードを表す初期化サブセグメントと、DynamoDB へのListTables 呼び出しを表すダウンストリーム呼び出しサブセグメントです。

各呼び出しセグメントおよび各ダウンストリーム呼び出しごとにステータスコードおよびエラーメッセージが表示されます。

• 同期 - 以下に Amazon S3 へのダウンストリーム呼び出し 1 回を行う同期リクエストの例を示します。

Lambda サービスセグメントはリクエストが Lambda サービスで経過した時間全体をキャプチャします。サービスセグメントには、対応するユーザー関数セグメントがあります。この例では、ユーザー関数セグメントに関数の初期化コード (ハンドラ前に実行されるコード) を表すサブセグメントおよびAmazon S3 への PutObject 呼び出しを表すサブセグメントが含まれます。

Note

HTTP 呼び出しをトレースする場合は、HTTP クライアントを使用する必要があります。詳細については、X-Ray SDK for Java を使用してダウンストリーム HTTP ウェブサービスの呼び出しをトレースするまたは X-Ray SDK for Node.js を使用してダウンストリーム HTTP ウェブサービスの呼び出しをトレースするを参照してください。

346

Page 353: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数へのタグ付け

Lambda ベースのアプリケーションの管理

AWS Lambda は、AWS タグ付け、AWS CloudTrail、AWS IAM など、AWS の多くの管理ツールと統合されています。以下のセクションでは、タグを使用して Lambda ベースのアプリケーションを整理する方法、CloudTrail を使用して AWS でアクティビティを監査する方法など、Lambda ベースのアプリケーションを管理する方法に関するガイダンスを示します。また、AWS Security Model を紹介し、Lambda ベースのアプリケーションを保護する方法について説明します。さらに、Lambda 関数の同時実行動作を管理する、AWS Lambda に固有の管理タスクについても説明します。

以下のセクションでは、Lambda 関数の呼び出しを整理して追跡する方法について説明します。また、AWS Security Model を紹介し、Lambda ベースのアプリケーションを保護する方法について説明します。

Lambda 関数へのタグ付けLambda 関数は、複数のアプリケーションを別々のリージョンにまたがって展開できます。各関数呼び出しの頻度とコストの追跡プロセスを単純化するために、タグを使用できます。タグは AWS リソースにアタッチするキーと値のペアであり、リソースをうまく整理できます。特に、同じタイプのリソース (AWSLambda の場合は関数) が多い場合に便利です。タグを使用することで、何百もの Lambda 関数を使用していても、同じタグを持つものでフィルタリングすることで特定のセットに簡単にアクセスし、分析することができます。Lambda 関数にタグ付けする 2 つの主要なメリットは次のとおりです。

• グループ化とフィルタリング: タグを適用することで、Lambda コンソールまたは CLI を使用して特定のアプリケーションまたは請求部門に含まれる Lambda 関数のリストを隔離できます。詳細については、「タグ付けされた Lambda 関数のフィルタリング (p. 349)」を参照してください。

• コスト配分: Lambda のタグ付けのサポートは AWS の請求と統合されているため、請求書を動的カテゴリに明細化して関数を特定のコストセンターにマッピングできます。たとえば、すべての Lambda 関数に「Department」というキーでタグ付けすると、すべての AWS Lambda コストを部門別に明細化できます。その後、「Department 1」や「Department 2」など個別の部門の値を出し、関数呼び出しのコストを適切なコストセンターに振り分けることができます。コスト配分が請求明細レポートで明示されるため、より簡単に AWS のコストを分類して追跡できます。

トピック• 請求用の Lambda 関数へのタグ付け (p. 347)• Lambda 関数へのタグの適用 (p. 348)• タグ付けされた Lambda 関数のフィルタリング (p. 349)• タグの制限 (p. 350)

請求用の Lambda 関数へのタグ付けタグを使用して AWS 請求書を整理し、自分のコスト構造を反映することができます。これを行うには、コスト割り当てレポートに含まれる値を持つタグキーを追加します。選択したタグキーがレポートの明細

347

Page 354: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数へのタグの適用

項目として含まれるコスト配分レポートの設定の詳細については、AWS アカウント請求についての月別コスト配分レポートを参照してください。

リソースを組み合わせたコストを確認するには、同じタグキー値を持つ関数に基づいて、請求情報を整理します。たとえば、複数の Lambda 関数に特定のアプリケーション名のタグを付け、請求情報を整理することで、複数のサービスを利用しているアプリケーションの合計コストを確認することができます。詳細については、AWS 請求とコスト管理ユーザーガイドのコスト配分タグの使用を参照してください。

Important

AWS Lambda では、関数がタグ付けできる唯一のリソースです。エイリアスまたは特定の関数バージョンにタグを付けることはできません。関数のエイリアスまたはバージョンの呼び出しは、元の関数の呼び出しとして課金されます。

Lambda 関数へのタグの適用Lambda 関数のタグ付け方法は、関数の作成方法によって異なります。以下のセクションで説明するように、Lambda コンソールまたは CLI を使用してタグを適用できます。

• コンソールを使用した Lambda 関数へのタグの適用 (p. 348)• CLI を使用した Lambda 関数へのタグの適用 (p. 348)

コンソールを使用した Lambda 関数へのタグの適用[Tags] セクションの [configuration] タブで関数にタグを追加できます。

既存の関数からタグを削除するには、関数を開き、[Tags] セクションを選択してキーと値のペアの隣にある [Remove] ボタンを選択します。

CLI を使用した Lambda 関数へのタグの適用CreateFunction (p. 425) コマンドを使用して新しい Lambda 関数を作成するときは、Tags パラメータを入力することでタグを追加できます。次に示すように、複数のタグ値を引用符で囲んで指定します。

Note

adminuser プロファイルをまだ作成していない場合は、「AWS Command Line Interface のセットアップ (AWS CLI) (p. 6)」を参照してください。

$ aws lambda create-function \

348

Page 355: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドタグ付けされた Lambda 関数のフィルタリング

--region region \--function-name function-name--role role-arn \--handler handler-name \--runtime runtime-value \--runtime runtime \--tags "DEPARTMENT=Department A, Department B" \--profile adminuser \--timeout 10 \--memory-size 1024

既存の関数にタグを適用または追加するには、TagResource (p. 496) API を使用して、Lambda 関数ARN (Amazon リソースネーム) を、タグを構成するキーと値のペアとともに指定します。

$ aws lambda tag-resource \--resource function arn \--tags DEPARTMENT="Department C, Department D"

逆に、Lambda 関数から一部またはすべてのタグを削除するには、UntagResource (p. 498) API を使用し、同様に関数 ARN (Amazon リソースネーム) を、関数から削除するタグキーのリストとともに指定します。

$ aws lambda untag-resource \--resource function arn \--tagkeys list of tag keys to be removed

タグ付けされた Lambda 関数のフィルタリングタグを使用して Lambda 関数をグループ化すると、Lambda コンソールまたは AWS CLI によって提供されるフィルタリング機能を活用して、固有の要件に基づいて関数を表示できます。

コンソールを使用した Lambda 関数のフィルタリングLambda コンソールには検索フィールドがあり、[Tags] を含む一連の指定された関数の属性に基づいて関数のリストをフィルタ処理できます。[Department] という [Tags] キーを持っている 2 つの関数[MyFunction] と [MyFunction2] があるとします。これらの関数を表示するには、検索フィールドを選択し、[Tags] キーのリストが含まれる自動フィルタリングを見つけます。

[Department] キーを選択します。Lambda からそのキーを含む関数が返されます。

ここで、[MyFunction] のタグのキー値が「Department A」であり、MyFunction2 のキー値が「DepartmentB」であるとします。次のように、[Department] キーの値 (この場合は [Department A]) を選択することで、検索を絞り込むことができます。

349

Page 356: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドタグの制限

これは、[MyFunction] だけを返します。

受け入れられる他の [Function attributes] ([Description]、[Function name]、[Runtime] など) を含めて、検索範囲をさらに絞り込むことができます。

Note

タグは Lambda 関数あたり最大 50 個に制限されています。Lambda 関数を削除すると、関連付けられたタグも削除されます。

CLI を使用した Lambda 関数のフィルタリング特定の Lambda 関数に適用されているタグを表示する場合は、次のいずれかの Lambda API コマンドを使用できます。

• ListTags (p. 480): Lambda 関数の ARN (Amazon リソースネーム) を指定すると、この関数に関連付けられているタグのリストが表示されます。

$ aws lambda list-tags \--resource function arn \--region region \--profile adminuser

• GetFunction (p. 451): Lambda 関数名を指定すると、この関数に関連付けられているタグのリストが表示されます。

$ aws lambda get-function \--function-name function name \--region region \--profile adminuser

AWS Tagging Service の GetResources API を使用してリソースをタグでフィルタリングすることもできます。GetResources API は最大 10 個のフィルタを受け取り、各フィルタにはタグキーと最大 10 個のタグ値が含まれます。GetResources に「ResourceType」を指定することで、特定のリソースタイプでフィルタリングします。AWS Tagging Service の詳細については、リソースグループを使用するを参照してください。

タグの制限タグには以下の制限があります。

• リソースあたりのタグの最大数 – 50• キーの最大長 - 128 文字 (Unicode) (UTF-8)• 値の最大長 - 256 文字 (Unicode) (UTF-8)• タグのキーと値は大文字と小文字が区別されます。

350

Page 357: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS CloudTrail による API ログ作成

• タグの名前または値に aws: プレフィックスは使用しないでください。このプレフィックスは AWS 用に予約されています。このプレフィックスが含まれるタグの名前または値は編集または削除できません。このプレフィックスを持つタグは、リソースあたりのタグ数の制限時には計算されません。

• 複数のサービス間およびリソース間でタグ付けスキーマを使用する場合、他のサービスでも許可される文字に制限が適用されることがあるのでご注意ください。一般的に使用が許可される文字は、UTF-8 で表現できる文字、スペース、および数字と、+、-、=、.、_、:、/、@ などの特殊文字です。

AWS CloudTrail を使用して AWS Lambda API 呼び出しのログを記録する

AWS Lambda は AWS CloudTrail と統合されています。これは、AWS アカウントで AWS Lambda によって行われたか、それに代わって行われた API 呼び出しを記録し、指定した Amazon S3 バケットにログファイルを渡すサービスです。CloudTrail は、AWS Lambda コンソールまたは AWS Lambda API から行われた API 呼び出しをキャプチャします。CloudTrail によって収集された情報を使用して、AWS Lambdaに対してどのようなリクエストが行われたか (リクエストの実行元 IP アドレス、実行者、実行日時など)を判断できます。CloudTrail の詳細 (設定して有効にする方法など) については、AWS CloudTrail UserGuideを参照してください。

CloudTrail での AWS Lambda 情報AWS アカウントで CloudTrail のログ記録を有効にすると、AWS Lambda アクションに対する API 呼び出しがログファイルに記録されます。AWS Lambda レコードは、他の AWS サービスレコードと一緒にログファイルに記録されます。CloudTrail は、期間とファイルサイズに基づいて、新しいファイルをいつ作成して書き込むかを決定します。

以下のアクションがサポートされています。

• AddPermission (p. 411)• CreateEventSourceMapping (p. 420)• CreateFunction (p. 425)

(ZipFile パラメーターは、CreateFunction では CloudTrail ログから省略されます。)• DeleteEventSourceMapping (p. 435)• DeleteFunction (p. 438)• GetEventSourceMapping (p. 448)• GetFunction (p. 451)• GetFunctionConfiguration (p. 455)• GetPolicy (p. 460)• ListEventSourceMappings (p. 474)• ListFunctions (p. 477)• RemovePermission (p. 493)• UpdateEventSourceMapping (p. 504)• UpdateFunctionCode (p. 508)

(ZipFile パラメーターは、UpdateFunctionCode では CloudTrail ログから省略されます。)• UpdateFunctionConfiguration (p. 515)

各ログエントリには、誰がリクエストを生成したかに関する情報が含まれます。ログのユーザー ID 情報は、リクエストが、ルートまたは IAM ユーザーの認証情報を使用して送信されたか、ロールまたはフェデレーションユーザーの一時的なセキュリティ認証情報を使用して送信されたか、あるいは AWS の別の

351

Page 358: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda ログファイルエントリの概要

サービスによって送信されたかを確認するのに役立ちます。詳細については、CloudTrail Event Referenceの userIdentity フィールドを参照してください。

ログファイルは無期限に保管できますが、ログファイルを自動的にアーカイブまたは削除するようにAmazon S3 ライフサイクルルールを定義することもできます。 デフォルトでは Amazon S3 のサーバー側の暗号化 (SSE) を使用して、ログファイルが暗号化されます。

ログファイルの配信時にすぐにアクションを実行する場合、新しいログファイルの配信時に CloudTrailにより Amazon SNS 通知を発行することを選択できます。詳細については、「CloudTrail 用の AmazonSNS 通知の構成」を参照してください。

また、複数の AWS リージョンと複数の AWS アカウントの AWS Lambda ログファイルを 1 つの S3 バケットに集約することもできます。詳細については、「Working with CloudTrail Log Files」を参照してください。

AWS Lambda ログファイルエントリの概要CloudTrail ログファイルには、複数の JSON 形式イベントで構成される 1 つ以上のログエントリを記録できます。ログエントリは任意の送信元からの単一のリクエストを表し、リクエストされたアクション、パラメータ、アクションの日時などに関する情報を含みます。ログエントリは、特定の順序になるように生成されるわけではありません。つまり、パブリック API 呼び出しの順序付けられたスタックトレースではありません。

次の例では、GetFunction および DeleteFunction アクション用の CloudTrail ログエントリを示します。

{ "Records": [ { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::999999999999:user/myUserName", "accountId": "999999999999", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:03:36Z", "eventSource": "lambda.amazonaws.com", "eventName": "GetFunction", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "errorCode": "AccessDenied", "errorMessage": "User: arn:aws:iam::999999999999:user/myUserName" is not authorized to perform: lambda:GetFunction on resource: arn:aws:lambda:us-west-2:999999999999:function:other-acct-function", "requestParameters": null, "responseElements": null, "requestID": "7aebcd0f-cda1-11e4-aaa2-e356da31e4ff", "eventID": "e92a3e85-8ecd-4d23-8074-843aabfe89bf", "eventType": "AwsApiCall", "recipientAccountId": "999999999999" }, { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::999999999999:user/myUserName", "accountId": "999999999999",

352

Page 359: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCloudTrail を使用した関数の呼び出しの追跡

"accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:04:42Z", "eventSource": "lambda.amazonaws.com", "eventName": "DeleteFunction", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "requestParameters": { "functionName": "basic-node-task" }, "responseElements": null, "requestID": "a2198ecc-cda1-11e4-aaa2-e356da31e4ff", "eventID": "20b84ce5-730f-482e-b2b2-e8fcc87ceb22", "eventType": "AwsApiCall", "recipientAccountId": "999999999999" } ]}

Note

eventNameには、"GetFunction20150331" のように日付やバージョン情報が含まれることがありますが、同じパブリック API を指しています。

CloudTrail を使用した関数の呼び出しの追跡CloudTrail はデータイベントもログに記録します。Lambda 関数が呼び出されるたびにイベントをログに記録するように、データイベントのログ記録を有効にすることができます。この機能は、関数の呼び出し元の ID とその呼び出しの頻度を把握するのに役立ちます。デフォルトでは有効になっていません。有効になると、追加料金が発生します。有効にするには、AWS CloudTrail コンソールまたは Invoke (p. 463)CLI オペレーションを使用します。このオプションの詳細については、「証跡のデータイベントと管理イベントのログ記録」を参照してください。

AWS Lambda に対する認証とアクセスコントロール

AWS Lambda へのアクセスには、AWS によってリクエストの認証に使用される認証情報が必要です。これらの認証情報には、AWS Lambda 関数または Amazon S3 バケットなどの AWS リソースへのアクセス権限が必要です。次のセクションでは、AWS Identity and Access Management (IAM) と Lambda を使用して、リソースにアクセスできるユーザーを制御することで、リソースをセキュリティで保護する方法について詳しく説明します。

• 認証 (p. 353)• アクセスコントロール (p. 354)

認証AWS には、次のタイプのアイデンティティでアクセスできます。

• AWS アカウントのルートユーザー – AWS アカウントを初めて作成する場合は、すべての AWS サービスとリソースに対して完全なアクセス権限を持つシングルサインイン ID で始めます。このアイデンティティは ルートユーザーと呼ばれ、AWS アカウントの作成に使用したメールアドレスとパスワードでのサインインによりアクセスされます。強くお勧めしているのは、日常的なタスクには、それが管理者タ

353

Page 360: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセスコントロール

スクであっても、ルートユーザーを使用しないことです。代わりに、最初の IAM ユーザーを作成するためだけに ルートユーザーを使用するというベストプラクティスに従います。その後、ルートユーザー認証情報を安全な場所に保管し、それらを使用して少数のアカウントおよびサービス管理タスクのみを実行します。

• IAM ユーザー – IAM ユーザーは、特定のカスタム権限 (たとえば、Lambda で a function を作成するアクセス権限) を持つ AWS アカウント内のアイデンティティです。IAM のユーザー名とパスワードを使用して、AWS マネジメントコンソール、AWS ディスカッションフォーラム、AWS Support Center などのセキュリティ保護された AWS ウェブページにサインインできます。

 

ユーザー名とパスワードに加えて、各ユーザーのアクセスキーを生成することもできます。いくつかのSDK の 1 つまたは AWS Command Line Interface (CLI) を使ってプログラムで AWS サービスにアクセスするときに、これらのキーを使用します。SDK と CLI ツールでは、アクセスキーを使用してリクエストが暗号で署名されます。AWS ツールを使用しない場合は、リクエストに自分で署名する必要があります。Lambda supports では、署名バージョン 4 がサポートされています。これは、インバウンドAPI リクエストを認証するためのプロトコルです。リクエストの認証の詳細については、AWS GeneralReferenceの「署名バージョン 4 の署名プロセス」を参照してください。

 • IAM ロール – IAM ロールは、特定のアクセス権限を持ち、アカウントで作成できる IAM アイデンティ

ティです。これは IAM ユーザーに似ていますが、特定のユーザーに関連付けられていません。IAM ロールでは、AWS サービスおよびリソースにアクセスするために使用できる一時的なアクセスキーを取得することができます。 IAM ロールと一時的な認証情報は以下の状況で役立ちます。

 • フェデレーティッドユーザーアクセス – IAM ユーザーを作成するのではなく、AWS Directory

Service、エンタープライズユーザーディレクトリ、またはウェブ ID プロバイダの既存のユーザー IDを使用することもできます。このようなユーザーはフェデレーティッドユーザーと呼ばれます。AWSでは、ID プロバイダーを通じてアクセスがリクエストされたとき、フェデレーティッドユーザーにロールを割り当てます。フェデレーティッドユーザーの詳細については、IAM ユーザーガイドの「フェデレーティッドユーザーとロール」を参照してください。

 • AWS サービスアクセス – アカウントの IAM ロールを使用して、アカウントのリソースにアクセスす

るための権限を AWS のサービスに付与できます。たとえば、Amazon Redshift がお客様に代わってAmazon S3 バケットにアクセスし、バケットからデータを Amazon Redshift クラスターにロードすることを許可するロールを作成できます。 詳細については、『IAM ユーザーガイド』の「AWS ユーザーにアクセス権限を委任するロールの作成」を参照してください。

 • Amazon EC2で実行されているアプリケーション – IAM ロールを使用して、EC2 インスタンスで実行

され、AWS API リクエストを作成しているアプリケーションの一時的な認証情報を管理できます。これは、EC2 インスタンス内でのアクセスキーの保存に推奨されます。AWS ロールを EC2 インスタンスに割り当て、そのすべてのアプリケーションで使用できるようにするには、インスタンスにアタッチされたインスタンスプロファイルを作成します。インスタンスプロファイルにはロールが含まれ、EC2 インスタンスで実行されるプログラムは一時認証情報を取得することができます。詳細については、IAM ユーザーガイドの「Amazon EC2 インスタンスで実行されるアプリケーションに IAMロールを使用してアクセス権限を付与する」を参照してください。

アクセスコントロール有効な認証情報があればリクエストを認証できますが、AWS Lambda リソースを作成したり、それらのリソースにアクセスしたりするには、そのためのアクセス権限が必要です。たとえば、Lambda 関数の作成、イベントソースの追加、Lambda 関数のバージョンの発行にアクセス権限が必要です。

354

Page 361: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス管理の概要

以下のセクションでは、AWS Lambda のアクセス権限を管理する方法について説明します。最初に概要のセクションを読むことをお勧めします。

• AWS Lambda リソースへのアクセス権限の管理の概要 (p. 355)• AWS Lambda でアイデンティティベースのポリシー (IAM ポリシー) を使用する (p. 359)• AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー) (p. 371)

AWS Lambda リソースへのアクセス権限の管理の概要すべての AWS リソースは AWS アカウントによって所有され、となり、リソースの作成またはアクセスは、アクセス権限のポリシーによって管理されます。アカウント管理者は、アクセス権限ポリシーを IAMアイデンティティ (ユーザー、グループ、ロール) にアタッチできます。一部のサービス (AWS Lambda など) では、アクセス権限ポリシーをリソースにアタッチすることもできます。

Note

アカウント管理者 (または管理者ユーザー) は、管理者権限を持つユーザーです。詳細については、IAM ユーザーガイド の「IAM のベストプラクティス」を参照してください。

アクセス権限を付与する場合、アクセス権限を取得するユーザー、取得するアクセス権限の対象となるリソース、およびそれらのリソースに対して許可される特定のアクションを決定します。

トピック• AWS Lambda リソースおよびオペレーション (p. 355)• リソース所有権について (p. 356)• リソースへのアクセスの管理 (p. 356)• ポリシー要素の指定 : アクション、効果、リソース、プリンシパル (p. 358)• ポリシーでの条件の指定 (p. 359)

AWS Lambda リソースおよびオペレーションAWS Lambda では、プライマリリソースは Lambda 関数およびイベントソースマッピングです。AWSLambda プルモデルでイベントソースマッピングを作成し、Lambda 関数をイベントソースに関連付けます。詳細については、「イベントソースマッピング (p. 157)」を参照してください。

AWS Lambda では、エイリアスとバージョンという追加リソースタイプもサポートしています。ただし、既存の Lambda 関数のコンテキストでのみ、エイリアスやバージョンを作成できます。これらはサブリソースと呼ばれます。

これらのリソースとサブリソースには、次の表に示すとおり、一意の Amazon リソースネーム (ARN) が関連付けられています。

リソースタイプ ARN 形式

関数 arn:aws:lambda:例例例例例:例例例例例 ID:関数:例例例

関数のエイリアス arn:aws:lambda:例例例例例:例例例例例 ID:関数:例例例:例例例例例例

Function version arn:aws:lambda:例例例例例:例例例例例 ID:関数:例例例:例例例例例

イベントソースマッピング arn:aws:lambda:region:account-id:event-source-mapping:event-source-mapping-id

355

Page 362: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス管理の概要

AWS Lambda には、Lambda リソースを操作するための一連のオペレーションが用意されています。使用可能なオペレーションのリストについては、「Actions (p. 410)」を参照してください。

リソース所有権についてリソース所有者は、リソースを作成した AWS アカウントです。つまり、リソース所有者は、リソースの作成リクエストを認証するプリンシパルエンティティ (ルートアカウント、IAM ユーザー、または IAMロール) の AWS アカウントです。以下の例では、このしくみを示しています。

• AWS アカウントのルートアカウント認証情報を使用して Lambda 関数を作成する場合、この AWS アカウントがリソースの所有者です (Lambda では、リソースは Lambda 関数です)。

• AWS アカウントに IAM ユーザーを作成し、そのユーザーに Lambda 関数を作成するためのアクセス権限を付与する場合、そのユーザーは Lambda 関数を作成できます。ただし、ユーザーが属する AWS アカウントは Lambda 関数リソースを所有しています。

• Lambda 関数を作成するためのアクセス権限を持つ AWS アカウントに IAM ロールを作成する場合は、ロールを引き受けることのできるいずれのユーザーも Lambda 関数を作成できます。ロールが属するAWS アカウントは Lambda 関数リソースを所有しています。

リソースへのアクセスの管理アクセスポリシーでは、誰が何にアクセスできるかを記述します。以下のセクションで、アクセス権限のポリシーを作成するために使用可能なオプションについて説明します。

Note

このセクションでは、AWS Lambda のコンテキストでの IAM の使用について説明します。これは、IAM サービスに関する詳細情報を取得できません。完全な IAM ドキュメントについては、「IAM とは?」 (IAM ユーザーガイド ) を参照してください。IAM ポリシー構文の詳細および説明については、IAM ユーザーガイド の「AWS IAM ポリシーリファレンス」を参照してください。

IAM アイデンティティにアタッチされたポリシーはアイデンティティベースのポリシー (IAM ポリシー) と呼ばれ、リソースにアタッチされたポリシーはリソースベースのポリシーと呼ばれます。AWS Lambda では、アイデンティティベースのポリシー (IAM ポリシー) とリソースベースのポリシーの両方がサポートされています。

トピック• アイデンティティベースのポリシー (IAM ポリシー) (p. 356)• リソースベースのポリシー (Lambda 関数ポリシー) (p. 357)

アイデンティティベースのポリシー (IAM ポリシー)ポリシーを IAM アイデンティティにアタッチできます。たとえば、次の操作を実行できます。

• アカウントのユーザーまたはグループにアクセス権限ポリシーを添付する – アカウント管理者は、特定のユーザーに関連付けられるアクセス権限ポリシーを使用して、そのユーザーに Lambda 関数の作成を許可するアクセス権限を付与することができます。

• アクセス権限ポリシーをロールにアタッチする (クロスアカウントのアクセス権限を付与) – アイデンティティベースのアクセス権限ポリシーを IAM ロールにアタッチして、クロスアカウントのアクセス権限を付与することができます。たとえば、アカウント A の管理者は、次のように他のまたは AWS にクロスアカウントのアクセス権限を別の AWS アカウント (アカウント B) または AWS サービスに付与するロールを作成することができます。1. アカウント A の管理者は、IAM ロールを作成して、アカウント A のリソースに権限を付与するロー

ルに権限ポリシーをアタッチします。2. アカウント A の管理者は、アカウント B をそのロールを引き受けるプリンシパルとして識別する

ロールに、信頼ポリシーをアタッチします。

356

Page 363: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス管理の概要

3. アカウント B の管理者は、アカウント B のユーザーにロールを引き受ける権限を委任できるようになります。これにより、アカウント B のユーザーにアカウント A のリソースの作成とアクセスが許可されます。AWS サービスのアクセス権限を付与してロールを引き受けさせたい場合は、信頼ポリシー内のプリンシパルも、AWS サービスのプリンシパルとなることができます。

IAM を使用したアクセス権限の委任の詳細については、IAM ユーザーガイド の「アクセス管理」を参照してください。

すべてのリソースの lambda:ListFunctions アクションのアクセス権限を付与するポリシーの例を次に示します。現在の実装では、Lambda で一部の API アクションについて、リソース ARN (リソースレベルのアクセス権限と呼ばれる) を使用した特定のリソースの識別がサポートされていません。そのため、ワイルドカード文字 (*) を指定する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListExistingFunctions", "Effect": "Allow", "Action": [ "lambda:ListFunctions" ], "Resource": "*" } ]}

Lambda でアイデンティティベースのポリシーを使用する方法の詳細については、「AWS Lambda でアイデンティティベースのポリシー (IAM ポリシー) を使用する (p. 359)」を参照してください。ユーザー、グループ、ロール、アクセス権限の詳細については、「アイデンティティ (ユーザー、グループ、ロール)」 (IAM ユーザーガイド) を参照してください。

リソースベースのポリシー (Lambda 関数ポリシー)

それぞれの Lambda 関数は、その関数に関連付けられたリソースベースの権限ポリシーを持つことができます。Lambda の場合、Lambda 関数がプライマリリソースであり、これらのポリシーは Lambda 関数ポリシーと呼ばれます。IAM ロールでアイデンティティベースのポリシーを使用する代わりに、Lambda 関数ポリシーを使用して、クロスアカウントのアクセス権限を付与できます。たとえば、IAM ロールを作成する代わりに、単純に Lambda 関数ポリシーにアクセス権限を追加することで、Amazon S3 アクセス権限を付与して Lambda 関数を呼び出すことができます。

Important

Lambda 機能ポリシーは基本的に、AWS Lambda にイベントソースをセットアップして、サービスまたはイベントソースに対して Lambda 関数を呼び出すアクセス権限を付与する場合に使用します (「Invoke (p. 463)」を参照)。例外はイベントソース (たとえば Amazon DynamoDB やKinesis) がプルモデルを使用している場合で、アクセス権限は Lambda 関数の例外ロールで管理されます。詳細については、「イベントソースマッピング (p. 157)」を参照してください。

以下に、1 つのステートメントがある Lambda 関数ポリシーの例を示します。ステートメントは、Amazon S3 サービスプリンシパルに、HelloWorld という Lambda 関数に対するlambda:InvokeFunction アクションを許可します。条件によって、イベントが発生するバケットがLambda 関数を所有するアカウントと同じアカウントによって所有されていることが確認されます。

{ "Policy":{ "Version":"2012-10-17", "Statement":[

357

Page 364: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス管理の概要

{ "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"lambda:InvokeFunction", "Resource":"arn:aws:lambda:region:account-id:function:HelloWorld", "Sid":"65bafc90-6a1f-42a8-a7ab-8aa9bc877985", "Condition":{ "StringEquals":{ "AWS:SourceAccount":"account-id" }, "ArnLike":{ "AWS:SourceArn":"arn:aws:s3:::ExampleBucket" } } } ] }}

Lambda でリソースベースのポリシーを使用する方法の詳細については、「AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー) (p. 371)」を参照してください。リソースベースのポリシーとは異なる IAM ロール (アイデンティティベースのポリシー) の使用の詳細については、IAM ユーザーガイドのIAM ロールとリソースベースのポリシーとの相違点を参照してください。

ポリシー要素の指定 : アクション、効果、リソース、プリンシパルAWS Lambda リソースごとに (「AWS Lambda リソースおよびオペレーション (p. 355)」を参照)、サービスは一連の API オペレーションを定義します (「Actions (p. 410)」を参照)。これらの API オペレーションを実行するためのアクセス権限を付与するために、Lambda ではポリシーに一連のアクションを定義できます。API オペレーションを実行する場合に、複数のアクションで権限が必要となる場合があることに注意してください。特定のアクションのアクセス権限を付与した場合は、アクションを許可または拒否するリソースを識別します。

以下は、最も基本的なポリシーの要素です。

• リソース ‐ ポリシーで Amazon Resource Name (ARN) を使用して、ポリシーを適用するリソースを識別します。詳細については、「AWS Lambda リソースおよびオペレーション (p. 355)」を参照してください。

• アクション – アクションのキーワードを使用して、許可または拒否するリソースオペレーションを識別します。たとえば、lambda:InvokeFunction アクセス権限は、AWS Lambda Invoke オペレーションの実行をユーザーに許可します。

• 効果 ‐ ユーザーが特定のアクションをリクエストする際の効果を指定します。許可または拒否のいずれかになります。リソースへのアクセスを明示的に許可していない場合、アクセスは暗黙的に拒否されます。また、明示的にリソースへのアクセスを拒否すると、別のポリシーによってアクセスが許可されている場合でも、ユーザーはそのリソースにアクセスできなくなります。

• プリンシパル ‐ アイデンティティベースのポリシー (IAM ポリシー) で、ポリシーがアタッチされているユーザーが黙示的なプリンシパルとなります。リソースベースのポリシーでは、権限 (リソースベースのポリシーにのみ適用) を受け取りたいユーザー、アカウント、サービス、またはその他のエンティティを指定します。

IAM ポリシーの構文と記述の詳細については、IAM ユーザーガイド の「AWS IAM ポリシーの参照」を参照してください。

すべての AWS Lambda API アクションとそれらが適用されるリソースの表については、「Lambda API のアクセス権限: アクション、リソース、条件リファレンス (p. 377)」を参照してください。

358

Page 365: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

ポリシーでの条件の指定アクセス権限を付与するとき、IAM ポリシー言語を使用して、ポリシーが有効になる必要がある条件を指定できます。たとえば、特定の日付の後にのみ適用されるポリシーが必要になる場合があります。ポリシー言語での条件の指定の詳細については、IAM ユーザーガイドの「条件」を参照してください。

条件を表すには、あらかじめ定義された条件キーを使用します。Lambda に固有の条件キーはありません。ただし、AWS 全体の条件キーがあり、必要に応じて使用できます。AWS 全体を対象とするすべてのキーのリストについては、IAM ユーザーガイド の「条件に利用可能なキー」を参照してください。

AWS Lambda でアイデンティティベースのポリシー(IAM ポリシー) を使用するこのトピックでは、アカウント管理者が IAM アイデンティティ (ユーザー、グループ、ロール) へのアクセス権限ポリシーをアタッチする、アイデンティティベースのポリシーの例を示します。

Important

初めに、AWS Lambda リソースへのアクセスを管理するための基本概念と使用可能なオプションについて説明する概要トピックを読むことをお勧めします。詳細については、「AWS Lambda リソースへのアクセス権限の管理の概要 (p. 355)」を参照してください。

このセクションでは、次のトピックを対象としています。

• AWS Lambda コンソールを使用するために必要なアクセス権限 (p. 360)• AWS Lambda での AWS 管理 (事前定義) ポリシー (p. 360)• お客様が管理するポリシーの例 (p. 360)

以下に示しているのは、アクセス権限ポリシーの例です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CreateFunctionPermissions", "Effect": "Allow", "Action": [ "lambda:CreateFunction" ], "Resource": "*" }, { "Sid": "PermissionToPassAnyRole", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::account-id:role/*" } ]}

このポリシーには以下の 2 つのステートメントがあります。

• 最初のステートメントでは、Lambda 関数の Amazon リソースネーム (ARN) を使用してリソースに対し AWS Lambda アクション (lambda:CreateFunction) のアクセス権限を付与します。現在、AWSLambda では、リソースレベルでこの特定のアクションを実行するためのアクセス権限はサポートされていません。したがって、ポリシーでは Resource の値としてワイルドカード文字 (*) を指定します。

359

Page 366: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

• 2 番目のステートメントは、IAM ロールに対して IAM アクション (iam:PassRole) を実行するためのアクセス権限を付与します。このステートメントで Resource 値の末尾のワイルドカード文字 (*) は、任意の IAM ロールに対して iam:PassRole アクションを実行するためのアクセス権限を付与することを意味します。このアクセス権限を特定のロールに制限するには、リソース ARN 内のワイルドカード文字 (*) を特定のロール名に置き換えます。

アイデンティティベースのポリシーでアクセス権限を得るプリンシパルを指定していないため、ポリシーでは Principal 要素を指定していません。ユーザーにポリシーをアタッチすると、そのユーザーが暗黙のプリンシパルになります。IAM ロールにアクセス権限ポリシーをアタッチすると、ロールの信頼ポリシーで識別されたプリンシパルがアクセス権限を得ることになります。

すべての AWS Lambda API アクションとそれらが適用されるリソースと条件の表については、「LambdaAPI のアクセス権限: アクション、リソース、条件リファレンス (p. 377)」を参照してください。

AWS Lambda コンソールを使用するために必要なアクセス権限AWS Lambda コンソールは、Lambda 関数の作成および管理のための統合された環境を提供します。コンソールには、「Lambda API のアクセス権限: アクション、リソース、条件リファレンス (p. 377)」に説明されている API 固有のアクセス権限に加えて、Lambda 関数の作成権限を必要とすることが多い機能やワークフローが多数あります。コンソールのこれらその他のアクセス権限の詳細については、「AWSLambda コンソールを使用するために必要なアクセス権限 (p. 364)」を参照してください。

AWS Lambda での AWS 管理 (事前定義) ポリシーAWS は、AWS によって作成され管理されるスタンドアロンの IAM ポリシーが提供する多くの一般的ユースケースに対応します。管理ポリシーは、一般的ユースケースに必要なアクセス権限を付与することで、どの権限が必要なのかをユーザーが調査する必要をなくすることができます。詳細については、IAM ユーザーガイド の「AWS 管理ポリシー」を参照してください。

アカウントのユーザーに添付可能な以下の AWS 管理ポリシーは、AWS Lambda に固有のもので、ユースケースシナリオ別にグループ化されます。

• AWSLambdaReadOnlyAccess – AWS Lambda リソースへの読み取り専用アクセスを付与します。このポリシーは、lambda:InvokeFunction アクションに対する権限を付与しないことに注意してください。ユーザーが Lambda 関数を呼び出す場合は、AWSLambdaRole AWS 管理ポリシーを添付します。

• AWSLambdaFullAccess – AWS Lambda リソースへのフルアクセスを付与します。• AWSLambdaRole – 任意の Lambda 関数を呼び出す権限を付与します。

Note

IAM コンソールにサインインし、特定のポリシーを検索することで、これらのアクセス権限ポリシーを確認することができます。

そのほか、Lambda 関数の作成時に指定された IAM ロール (実行ロール) を使用するのが適当な AWS 管理ポリシーもあります。詳細については、「AWS Lambda アクセス権限モデル (p. 374)」を参照してください。

独自のカスタム IAM ポリシーを作成して、AWS Lambda API アクションとリソースのためのアクセス権限を許可することもできます。これらのカスタムポリシーを、それらの権限を必要としている、またはLambda 関数で作成したロール (IAM ロール) のカスタム実行を行う IAM ユーザーまたはグループに添付できます。

お客様が管理するポリシーの例このセクションの例では、ユーザーに添付できるサンプルポリシーのグループが用意されています。ポリシーの作成が初めての場合は、このセクションの手順で説明されているように、お客様のアカウントにIAM ユーザーを作成し、ポリシーをユーザーにシーケンシャルに添付することをお勧めします。

360

Page 367: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

コンソールを使用して、ユーザーにポリシーを添付しながら各ポリシーの効果を確認できます。最初は、ユーザーにアクセス権限が付与されてないため、コンソール使用して何もできません。ユーザーにポリシーを添付することで、ユーザーがコンソールで多様なアクションを実行できることを確認できます。 

2 つのブラウザウィンドウを使用することをお勧めします。1 つでユーザーを作成してアクセス権限を付与し、もう 1 つでユーザーの認証情報を使用して AWS マネジメントコンソール にサインインして、アクセス権限をユーザーに付与するごとに確認します。

Lambda 関数の実行ロールとして使用する IAM ロールの作成方法の例については、IAM ユーザーガイドのIAM ロールの作成を参照してください。

手順例• ステップ 1: IAM ユーザーを作成する (p. 361)• ステップ 2: ユーザーに Lambda 関数のリストを許可する (p. 361)• ステップ 3: ユーザーに Lambda 関数の詳細の表示を許可する (p. 361)• ステップ 4: ユーザーに Lambda 関数の呼び出しを許可する (p. 362)• ステップ 5: ユーザーに Lambda 関数のモニタリングと CloudWatch Logs の表示を許可する (p. 362)• ステップ 6: ユーザーに Lambda 関数の作成を許可する (p. 363)

ステップ 1: IAM ユーザーを作成する

まず、IAM ユーザーを作成し、管理者アクセス権限を持つ IAM グループにユーザーを追加したら、作成した IAM ユーザーに管理者アクセス権限を付与する必要があります。その後、特別な URL とその IAM ユーザーの認証情報を使用して AWS にアクセスできます。

手順については、IAM ユーザーガイドの最初の IAM ユーザーと管理者グループの作成を参照してください。

ステップ 2: ユーザーに Lambda 関数のリストを許可する

アカウントの IAM ユーザーに lambda:ListFunctions アクションに対する権限がないと、コンソールには何も表示されません。これらのアクセス権限を付与すると、コンソールに、ユーザーが属する特定のAWS リージョンに作成された AWS アカウントの Lambda 関数のリストが表示できるようになります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListExistingFunctions", "Effect": "Allow", "Action": [ "lambda:ListFunctions" ], "Resource": "*" } ]}

ステップ 3: ユーザーに Lambda 関数の詳細の表示を許可する

ユーザーが以下の AWS Lambda アクションの権限を持っている場合、Lambda 関数を選択してその関数の詳細 (エイリアス、バージョン、その他設定情報など) を表示できます。

{

361

Page 368: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

"Version": "2012-10-17", "Statement": [ { "Sid": "DisplayFunctionDetailsPermissions", "Effect": "Allow", "Action": [ "lambda:ListVersionsByFunction", "lambda:ListAliases", "lambda:GetFunction", "lambda:GetFunctionConfiguration", "lambda:ListEventSourceMapping", "lambda:GetPolicy" ], "Resource": "*" } ]}

ステップ 4: ユーザーに Lambda 関数の呼び出しを許可する

ユーザーが手動で関数を呼び出すことを許可するには、以下のように lambda:InvokeFunction アクションに対する権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "InvokePermission", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } ]}

ステップ 5: ユーザーに Lambda 関数のモニタリングと CloudWatch Logs の表示を許可する

ユーザーが Lambda 関数を呼び出すと、AWS Lambda はそれを実行し、結果を返します。Lambda 関数をモニタリングするには、追加のアクセス権限が必要です。

ユーザーがコンソールの [Monitoring] タブまたはコンソールのホームページにあるグリッドビューでLambda 関数の CloudWatch メトリクスを閲覧できるようにするには、次のアクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchPermission", "Effect": "Allow", "Action": [ "cloudwatch:GetMetricStatistics" ], "Resource": "*" } ]}

362

Page 369: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

ユーザーが AWS Lambda コンソールにある CloudWatch Logs へのリンクをクリックして CloudWatchLogs でログ出力を閲覧できるようにするには、次のアクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchLogsPerms", "Effect": "Allow", "Action": [ "cloudwatchlog:DescribeLogGroups", "cloudwatchlog:DescribeLogStreams", "cloudwatchlog:GetLogEvents"

], "Resource": "arn:aws:logs:region:account-id:log-group:/aws/lambda/*" } ]}

ステップ 6: ユーザーに Lambda 関数の作成を許可するユーザーが Lambda 関数を作成できるようにするには、次のアクセス権限を付与する必要があります。IAM に関連するアクションのアクセス権限は、ユーザーが Lambda 関数を作成する場合、Lambda 関数を実行するために AWS Lambda に割り当てられる IAM 実行ロールを選択する必要があるために必要です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListExistingRolesAndPolicies", "Effect": "Allow", "Action": [ "iam:ListRolePolicies", "iam:ListRoles" ], "Resource": "*" }, { "Sid": "CreateFunctionPermissions", "Effect": "Allow", "Action": [ "lambda:CreateFunction" ], "Resource": "*" }, { "Sid": "PermissionToPassAnyRole", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::account-id:role/*" } ]}

ユーザーが Lambda 関数を作成する際に IAM ロールを作成できるようにするには、次のようにiam:PutRolePolicy アクションを実行する権限が必要です。

{

363

Page 370: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

"Sid": "CreateARole", "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:CreatePolicy", "iam:PutRolePolicy "iam:AttachRolePolicy" ], "Resource": "arn:aws:iam::account-id:role/*"}

Important

各 IAM ロールにはアクセス権限ポリシーが添付されており、これらによってロールに特定のアクセス権限が付与されています。ユーザーが新しいロールを作成する場合でも、既存のロールを使用する場合でも、ユーザーにはそのロールに関連付けられたアクセス権限ポリシーで付与されているすべてのアクションに対するアクセス権限が必要です。したがって、ユーザーに追加のアクセス権限を付与する必要があります。

AWS Lambda コンソールを使用するために必要なアクセス権限AWS Lambda コンソールが提供する統合された操作性の利点を生かすためには、ユーザーに許可する操作によって、リファレンステーブルに記述された API 固有アクセス権限よりも多くのアクセス権限をユーザーが持つ必要があることが多くあります。Lambda API オペレーションの詳細については、「LambdaAPI のアクセス権限: アクション、リソース、条件リファレンス (p. 377)」を参照してください。

たとえば、アカウントの IAM ユーザーに、Lambda 関数を作成し Amazon S3 オブジェクト作成イベントを処理するアクセス権限を許可するとします。ユーザーが Amazon S3 をイベントソースとして設定できるように、コンソールのドロップダウンリストにバケットのリストが表示されます。ただし、コンソールにバケットリストが表示されるのは、サインインユーザーが関連 Amazon S3 アクションのアクセス権限を持つ場合のみです。

以下のセクションでは、さまざまな統合ポイントで必要とされる追加のアクセス権限について説明します。

アクセス権限を初めて管理する場合は、IAM ユーザーの作成、ユーザーへの段階的なアクセス権限の付与、AWS Lambda コンソールを使用したアクセス権限の確認を行うウォークスルー例から開始することをお勧めします (「お客様が管理するポリシーの例 (p. 360)」を参照)。

トピック• Amazon API Gateway (p. 365)• Amazon CloudWatch Events (p. 365)• Amazon CloudWatch Logs (p. 366)• Amazon Cognito (p. 367)• Amazon DynamoDB (p. 367)• Amazon Kinesis Data Streams (p. 368)• Amazon S3 (p. 369)• Amazon SNS (p. 370)• AWS IoT (p. 370)

Note

これらのアクセス権限ポリシーはすべて、特定の AWS サービスに Lambda 関数を呼び出すアクセス権限を付与します。この統合を設定するユーザーには、Lambda 関数を呼び出すアクセス権限が必要です。そうしないと、ユーザーが構成を設定することはできません。ユーザーにこれら

364

Page 371: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

のアクセス権限を提供するために、AWSLambdaRole を AWS が管理する (定義済みの) アクセス権限ポリシーに添付できます。

Amazon API Gatewayコンソールで API エンドポイントを設定すると、コンソールはいくつかの API Gateway API コールを行います。この呼び出しには、以下のように apigateway:* アクションのためのアクセス権限が必要です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ApiGatewayPermissions", "Effect": "Allow", "Action": [ "apigateway:*" ], "Resource": "*" }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "ListEventSourcePerm", "Effect": "Allow", "Action": [ "lambda:ListEventSourceMappings" ], "Resource": "*" } ]}

Amazon CloudWatch EventsLambda 関数をいつ呼び出すかスケジュールできます。既存の CloudWatch イベント ルールが選択 (または新規作成) されると、AWS Lambda は新しいターゲットを Lambda 関数を呼び出す CloudWatch に作成します。ターゲットが作成できるように、次のアクセス権限を追加で付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EventPerms", "Effect": "Allow", "Action": [ "events:PutRule", "events:ListRules", "events:ListRuleNamesByTarget", "events:PutTargets", "events:RemoveTargets", "events:DescribeRule", "events:TestEventPattern", "events:ListTargetsByRule", "events:DeleteRule"

365

Page 372: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

], "Resource": "arn:aws:events:region:account-id:*" }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" } ]}

Amazon CloudWatch LogsAmazon CloudWatch Logs サービスでイベントを発行し、Lambda 関数を呼び出すことができます。イベントソースとしてこのサービスを設定すると、コンソールでアカウントのロググループがリストされます。このリスト作成を実行するには、次のように logs:DescribeLogGroups アクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchLogsPerms", "Effect": "Allow", "Action": [ "logs:FilterLogEvents", "logs:DescribeLogGroups", "logs:PutSubscriptionFilter", "logs:DescribeSubscriptionFilters", "logs:DeleteSubscriptionFilter", "logs:TestMetricFilter" ], "Resource": "arn:aws:logs:region:account-id:*" }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "ListEventSourceMappingsPerms", "Effect": "Allow", "Action": [ "lambda:ListEventSourceMappings" ], "Resource": "*" } ]}

Note

これらの追加のアクセス権限は、サブスクリプションフィルタの管理に必要です。

366

Page 373: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

Amazon Cognitoコンソールには、アカウントの ID プールが表示されます。プールを選択すると、イベントソースタイプとして [Cognito sync trigger] を持つようにプールを設定できるようになります。これを行うには、次の追加アクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CognitoPerms1", "Effect": "Allow", "Action": [ "cognito-identity:ListIdentityPools" ], "Resource": [ "arn:aws:cognito-identity:region:account-id:*" ] }, { "Sid": "CognitoPerms2", "Effect": "Allow", "Action": [ "cognito-sync:GetCognitoEvents", "cognito-sync:SetCognitoEvents" ], "Resource": [ "arn:aws:cognito-sync:region:account-id:*" ] }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "ListEventSourcePerms", "Effect": "Allow", "Action": [ "lambda:ListEventSourceMappings" ], "Resource": "*" } ]}

Amazon DynamoDBコンソールには、アカウントのすべてのテーブルが表示されます。テーブルを選択すると、コンソールはDynamoDB ストリームがそのテーブルで存在するかどうかを確認します。存在しない場合は、ストリームが作成されます。ユーザーが Lambda 関数のイベントソースとして DynamoDB ストリームを設定できるようにするには、次の追加のアクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DDBpermissions1",

367

Page 374: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

"Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:DescribeTable", "dynamodb:UpdateTable" ], "Resource": "arn:aws:dynamodb:region:account-id:table/*" }, { "Sid": "DDBpermissions2", "Effect": "Allow", "Action": [ "dynamodb:ListStreams", "dynamodb:ListTables" ], "Resource": "*" }, { "Sid": "LambdaGetPolicyPerm", "Effect": "Allow", "Action": [ "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "LambdaEventSourcePerms", "Effect": "Allow", "Action": [ "lambda:CreateEventSourceMapping", "lambda:DeleteEventSourceMapping", "lambda:GetEventSourceMapping", "lambda:ListEventSourceMappings", "lambda:UpdateEventSourceMapping" ], "Resource": "*" } ]}

Important

Lambda 関数が DynamoDB ストリームから読み取るには、Lambda 関数に関連付けられた実行ロールに正しいアクセス権限が必要です。そのため、ユーザーは、実行ロールにアクセス権限を付与する前に、同じアクセス権限を持っている必要があります。これらのアクセス権限はAWSLambdaDynamoDBExecutionRole 事前定義済みポリシーをまずユーザーに、次に実行ロールに添付することで付与できます。

Amazon Kinesis Data Streamsコンソールには、アカウントのすべての Kinesis ストリームが表示されます。ストリームを選択すると、コンソールで AWS Lambda にイベントソースマッピングを作成できるようになります。この処理を行うには、次の追加アクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PermissionForDescribeStream", "Effect": "Allow", "Action": [ "kinesis:DescribeStream" ], "Resource": "arn:aws:kinesis:region:account-id:stream/*"

368

Page 375: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

}, { "Sid": "PermissionForListStreams", "Effect": "Allow", "Action": [ "kinesis:ListStreams" ], "Resource": "*" }, { "Sid": "PermissionForGetFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "LambdaEventSourcePerms", "Effect": "Allow", "Action": [ "lambda:CreateEventSourceMapping", "lambda:DeleteEventSourceMapping", "lambda:GetEventSourceMapping", "lambda:ListEventSourceMappings", "lambda:UpdateEventSourceMapping" ], "Resource": "*" } ]}

Amazon S3

コンソールには、AWS アカウントのバケットのリストが事前に設定されており、各バケットのバケットロケーションを検索します。Amazon S3 をイベントソースとして設定した場合、コンソールでバケット通知設定が更新されます。この処理を行うには、次の追加アクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Permissions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetBucketNotification", "s3:PutBucketNotification", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission" ], "Resource": "arn:aws:lambda:region:account-id:function:*" } ]}

369

Page 376: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアイデンティティベースのポリシー (IAM ポリシー) を使用する

Amazon SNS

コンソールには、アカウントの Amazon Simple Notification Service (Amazon SNS) トピックの一覧が表示されます。トピックが選択されると、AWS Lambda はその Amazon SNS トピックに Lambda 関数をサブスクライブします。この処理を行うには、次の追加アクセス権限を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SNSPerms", "Effect": "Allow", "Action": [ "sns:ListSubscriptions", "sns:ListSubscriptionsByTopic", "sns:ListTopics", "sns:Subscribe", "sns:Unsubscribe" ], "Resource": "arn:aws:sns:region:account-id:*" }, { "Sid": "AddPermissionToFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" }, { "Sid": "LambdaListESMappingsPerms", "Effect": "Allow", "Action": [ "lambda:ListEventSourceMappings" ], "Resource": "*" } ]}

AWS IoT

コンソールには、すべての AWS IoT ルールが表示されます。ルールを選択すると、コンソールはユーザーインターフェイスのそのルールと関連付けられる残りの情報を入力します。既存のルールを選択すると、コンソールは、イベントが AWS Lambda に送信されるように、そのルールの情報を更新します。また、新しいルールを作成することもできます。これらの操作を行う際、ユーザーには次のアクセス権限が必要です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "IoTperms", "Effect": "Allow", "Action": [ "iot:GetTopicRule", "iot:CreateTopicRule", "iot:ReplaceTopicRule" ], "Resource": "arn:aws:iot:region:account-id:*"

370

Page 377: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドリソースベースのポリシーを使用する (Lambda 関数ポリシー)

}, { "Sid": "IoTlistTopicRulePerms", "Effect": "Allow", "Action": [ "iot:ListTopicRules" ], "Resource": "*" }, { "Sid": "LambdaPerms", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission", "lambda:GetPolicy" ], "Resource": "arn:aws:lambda:region:account-id:function:*" } ]}

AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー)Lambda 関数は、AWS Lambda のリソースの 1 つです。Lambda 関数に関連付けられるポリシーに権限を追加できます。Lambda 関数に添付されたアクセス権限ポリシーは、リソースベースのポリシー (またはLambda の Lambda 関数ポリシー) と呼ばれます。Lambda 関数ポリシーを使用して、Lambda 関数の呼び出し権限を管理できます (「Invoke (p. 463)」を参照)。

Important

リソースベースのポリシーを作成する前に、AWS Lambda リソースへのアクセスを管理するための基本概念と使用可能なオプションについて説明する概要トピックをお読みになることをお勧めします。詳細については、「AWS Lambda リソースへのアクセス権限の管理の概要 (p. 355)」を参照してください。

Lambda 機能ポリシーは基本的に、AWS Lambda にイベントソースをセットアップして、サービスまたはイベントソースに対して Lambda 関数を呼び出すアクセス権限を付与する場合に使用します(「Invoke (p. 463)」を参照)。例外はイベントソース (たとえば Amazon DynamoDB や Kinesis) がプルモデルを使用している場合で、アクセス権限は Lambda 関数の例外ロールで管理されます。詳細については、「イベントソースマッピング (p. 157)」を参照してください。

Lambda 関数ポリシーにより、Lambda 関数を呼び出すクロスアカウント権限の付与も簡単になります。Lambda 関数を呼び出すクロスアカウント権限 (たとえば、Amazon S3 へのアクセス権限) を付与するとします。IAM ロールを作成してクロスアカウント権限を付与する代わりに、Lambda 関数ポリシーに関連アクセス権限を追加できます。

Note

カスタムアプリケーションとそれが呼び出す Lambda 関数が同じ AWS アカウントに属している場合は、Lambda 関数に添付されたポリシーを使用して明示的にアクセス権限を付与する必要はありません。

AWS Lambda では、Lambda 関数に関連するアクセス権限ポリシーを管理する以下の API オペレーションを提供しています。

• AddPermission (p. 411)• GetPolicy (p. 460)• RemovePermission (p. 493)

371

Page 378: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドリソースベースのポリシーを使用する (Lambda 関数ポリシー)

Note

AWS Lambda コンソールは、イベントソースと、その Lambda 関数ポリシーのアクセス権限を管理する最も簡単な方法です。イベントのソースの AWS サービスコンソールがイベントソースマッピングの設定をサポートしている場合は、そのコンソールを使用することもできます。新しいイベントソースを設定するか、既存のイベントソースを変更すると、コンソールが自動的にLambda 関数に関連付けられているアクセス権限ポリシーを変更します。

コンソールを使用して関数ポリシーを表示するには、関数の詳細ページで [Triggers] タブを選択し、次に[View function policy] を選択します。コンソールは、関数ポリシーのアクセス権限を直接変更する機能はサポートしていません。AWS CLI または AWS SDK を使用する必要があります。以下は、このトピックの前半でリスト API オペレーションの AWS CLI の例です。

例• 例 1: Amazon S3 に Lambda 関数の呼び出しを許可する (p. 372)• 例 2: Amazon API Gateway に Lambda 関数の呼び出しを許可する (p. 373)• 例 3: 別の AWS アカウントによって作成されたユーザーアプリケーションに Lambda 関数の呼び出し

を許可する (クロスアカウントのシナリオ) (p. 373)• 例 4: Lambda 関数ポリシーを取得する (p. 374)• 例 5: Lambda 関数ポリシーからアクセス権限を削除する (p. 374)• 例 6: Lambda 関数のバージョニング、エイリアス、アクセス権限を使用する (p. 374)

例 1: Amazon S3 に Lambda 関数の呼び出しを許可するAmazon S3 に Lambda 関数を呼び出す権限を付与するには、次のようにアクセス権限を設定します。

• s3.amazonaws.com を principal 値に指定します。• アクセス権限を付与する action として lambda:InvokeFunction を指定します。

イベントが特定の AWS アカウントが所有する特定のバケットから生成されるようにするには、次を指定します。

• source-arn 値としてバケット ARN を指定し、特定のバケットからのイベントを制限します。• バケットを所有する AWS アカウント ID を指定し、指定されたバケット名がそのアカウントに所有され

ていることを確認します。

以下 AWS CLI コマンドの例では、helloworld Lambda 関数ポリシーに権限を追加して、Amazon S3 に関数を呼び出すアクセス権限を付与します。

aws lambda add-permission \--region region \--function-name helloworld \--statement-id 1 \--principal s3.amazonaws.com \--action lambda:InvokeFunction \--source-arn arn:aws:s3:::examplebucket \--source-account 111111111111 \--profile adminuser

例では、adminuser (フルアクセス権限あり) がこのアクセス権限を追加しています。したがって、--profile パラメーターは adminuser プロファイルを指定します。

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

372

Page 379: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドリソースベースのポリシーを使用する (Lambda 関数ポリシー)

{ "Statement": "{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"111111111111\"}, \"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::examplebucket\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:111111111111:function:helloworld\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"}, \"Sid\":\"1\"}"}

プッシュモデルについては、「イベントソースマッピング (p. 157)」を参照してください。

例 2: Amazon API Gateway に Lambda 関数の呼び出しを許可するLambda 関数を呼び出すために Amazon API Gateway にアクセス権限を付与するには、以下の作業を行います。

• apigateway.amazonaws.com を principal 値に指定します。• アクセス権限を付与するアクションとして「lambda:InvokeFunction」を指定します。• source-arn 値として API Gateway エンドポイント ARN を指定します。

以下 AWS CLI コマンドの例では、helloworld Lambda 関数ポリシーに権限を追加して、API Gatewayに関数を呼び出すアクセス権限を付与します。

aws lambda add-permission \--region region \--function-name helloworld \--statement-id 5 \--principal apigateway.amazonaws.com \--action lambda:InvokeFunction \--source-arn arn:aws:execute-api:region:account-id:api-id/stage/method/resource-path \--profile adminuser

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:apigateway:us-east-1::my-api-id:/test/petstorewalkthrough/pets\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"apigateway.amazonaws.com\"}, \"Sid\":\"5\"}"}

例 3: 別の AWS アカウントによって作成されたユーザーアプリケーションに Lambda 関数の呼び出しを許可する (クロスアカウントのシナリオ)他の AWS アカウントにアクセス権限を付与する (つまり、クロスアカウントのシナリオを作成する) には、次の AWS CLI コマンドに示すように、principal 値として AWS アカウント ID を指定します。

373

Page 380: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス権限モデル

aws lambda add-permission \--region region \--function-name helloworld \--statement-id 3 \--principal 111111111111 \--action lambda:InvokeFunction \--profile adminuser

それに応じて、AWS Lambda が以下の JSON コードを返します。Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

{ "Statement": "{\"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-west-2:account-id:function:helloworld\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"account-id\"}, \"Sid\":\"3\"}"}

例 4: Lambda 関数ポリシーを取得するLambda 関数ポリシーを取得するには、get-policy コマンドを使用します。

aws lambda get-policy \--function-name example \--profile adminuser

例 5: Lambda 関数ポリシーからアクセス権限を削除するLambda 関数ポリシーからアクセス権限を削除するには、remove-permission コマンドを使用して、関数名とステートメント ID を指定します。

aws lambda remove-permission \--function-name example \--statement-id 1 \--profile adminuser

例 6: Lambda 関数のバージョニング、エイリアス、アクセス権限を使用するLambda 関数のバージョンとエイリアスに対するアクセス権限ポリシーの詳細については、「バージョニング、エイリアス、リソースポリシー (p. 305)」を参照してください。

AWS Lambda アクセス権限モデルエンドツーエンドの AWS Lambda ベースアプリケーションを機能させるには、さまざまなアクセス権限を管理する必要があります。以下に例を示します。

• ストリームベースのサービス (Amazon Kinesis Data Streams および DynamoDB ストリーム) を除くイベントソースの場合、AWS Lambda 関数を呼び出すには、イベントソースのアクセス権限を付与する必要があります。

 

374

Page 381: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス権限モデル

• ストリームベースのイベントソース (Amazon Kinesis Data Streams および DynamoDB ストリーム) の場合、AWS Lambda はユーザーに代わってストリームをポーリングし、ストリームの新しいレコードを読み取ります。そのため、関連するストリームアクションに AWS Lambda アクセス権限を付与する必要があります。

 • Lambda 関数を呼び出す場合、アカウントの AWS リソースにアクセスする場合があります (たとえ

ば、S3 バケットからのオブジェクトの読み込み)。AWS Lambda は、(Lambda 関数の作成時に指定したロールを引き受けて) ユーザーに代わって Lambda 関数を実行します。したがって、オブジェクトの読み込みに必要な Amazon S3 アクションの権限など、Lambda 関数に必要なアクセス権限をロールに付与する必要があります。

以下のセクションでは、アクセス権限管理について説明します。

トピック• アクセス権限の管理: IAM ロール (実行ロール) を使用する (p. 375)• 権限の管理: Lambda 関数ポリシーを使用する (p. 376)• 推奨事項 (p. 377)

アクセス権限の管理: IAM ロール (実行ロール) を使用する各 Lambda 関数には、関連付けられた IAM ロール (実行ロール) があります。Lambda 関数を作成するときに、その IAM ロールを指定します。このロールに付与するアクセス権限によって、AWS Lambda がそのロールを引き受けた場合にできることが決まります。IAM ロールに付与するアクセス権限には 2 つのタイプがあります。

• Lambda 関数コードが AWS リソースにアクセスする場合 (S3 バケットからのオブジェクトの読み込みや CloudWatch Logs へのログの書き込みなど)、関連する Amazon S3 および CloudWatch アクションに対するアクセス権限をロールに付与する必要があります。

 • イベントソースがストリームベース (Amazon Kinesis Data Streams および DynamoDB ストリーム) の

場合、AWS Lambda はユーザーに代わってそのストリームをポーリングします。AWS Lambda がストリームをポーリングして、ストリームの新しいレコードを読み取るには、アクセス権限が必要です。そのため、このロールに関連するアクセス権限を付与する必要があります。

IAM ロールの詳細については、『IAM ユーザーガイド』の「ロール (委任とフェデレーション)」を参照してください。

Important

IAM ロールを作成するユーザーは、具体的には、このロールを引き受ける AWS Lambda にアクセス権限を渡します。これには、iam:PassRole アクションのアクセス権限が必要です。管理者ユーザーがこのロールを作成した場合は、管理者ユーザーに iam:PassRole アクションを含むフルアクセス権限があるため、iam:PassRole に対するアクセス権限をセットアップするための操作は必要ありません。

実行ロールの作成プロセスを単純化するために、AWS Lambda には、ユーザーが使用できる以下の AWS管理対象 (定義済み) アクセス権限ポリシーが用意されています。これらのポリシーには、特定のシナリオ向けの一般的なアクセス権限が含まれています。

• AWSLambdaBasicExecutionRole – ログを作成する Amazon CloudWatch Logs アクションのアクセス権限のみを付与します。Lambda 関数がログ作成以外に他の AWS リソースにアクセスしない場合は、このポリシーを使用できます。

375

Page 382: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアクセス権限モデル

 • AWSLambdaKinesisExecutionRole – Amazon Kinesis Data Streams アクションおよび CloudWatch Logs

アクションのアクセス権限を付与します。Kinesis ストリームイベントを処理する Lambda 関数を作成する場合は、このアクセス権限ポリシーを添付できます。

 • AWSLambdaDynamoDBExecutionRole – DynamoDB アクションおよび CloudWatch Logs アクションの

アクセス権限を付与します。DynamoDB ストリームイベントを処理する Lambda 関数を作成する場合は、このアクセス権限ポリシーを添付できます。

 • AWSLambdaVPCAccessExecutionRole – Elastic Network Interface (ENI) を管理する Amazon Elastic

Compute Cloud (Amazon EC2) アクションのアクセス権限を付与します。Amazon Virtual Private Cloud(Amazon VPC) サービスの VPC のリソースにアクセスする Lambda 関数を作成する場合は、このアクセス権限ポリシーを添付できます。このポリシーは、ログを作成する CloudWatch Logs アクションに対するアクセス権限も付与します。

これらの AWS 管理対象アクセス権限ポリシーは IAM コンソールで確認できます。これらのポリシーを検索すると、これらのポリシーそれぞれに付与されたアクセス権限を表示できます。

権限の管理: Lambda 関数ポリシーを使用するすべてのサポート対象イベントソースは、ストリームベースのサービス (Kinesis および DynamoDB ストリーム) を除き、必要なアクセス権限が付与されていれば、Lambda 関数を呼び出します (プッシュモデル)。たとえば、バケットに新しいオブジェクトが作成されたときに Amazon S3 で Lambda 関数を呼び出す場合、Amazon S3 には Lambda 関数を呼び出すアクセス権限が必要です。

これらのアクセス権限は関数ポリシーを使用して付与できます。AWS Lambda には、関数ポリシーのアクセス権限を管理するための API が用意されています。例については、「AddPermission (p. 411)」を参照してください。

また、関数ポリシーを使用してクロスアカウントのアクセス権限を付与することもできます。たとえば、ユーザー定義アプリケーションとそれが呼び出す Lambda 関数が同じ AWS アカウントに属する場合、明示的なアクセス権限を付与する必要はありません。その他の場合は、Lambda 関数を所有する AWS アカウントは、Lambda 関数に関連付けられたアクセス権限ポリシーに、クロスアカウントアクセス権限を許可するがあります。

Note

Lambda 関数ポリシーを使用する代わりに、イベントソース (たとえば Amazon S3 またはDynamoDB) に Lambda 関数を呼び出すアクセス権限を付与する別の IAM ロールを作成できま

376

Page 383: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda API の権限リファレンス

す。ただしリソースポリシーの方が、セットアップが簡単で、どのイベントソースが Lambda 関数を呼び出すアクセス権限を持っているかを追跡するのも簡単です。

Lambda 関数ポリシーの詳細については、「AWS Lambda でリソースベースのポリシーを使用する(Lambda 関数ポリシー) (p. 371)」を参照してください。Lambda 権限の詳細については、「AWSLambda に対する認証とアクセスコントロール (p. 353)」を参照してください。

推奨事項AWS Lambda を初めて使用する場合は、「仕組み」セクションのすべてのトピックに目を通し、Lambdaの内容を確認しておくことをお勧めします。次のトピックは「Lambda 実行環境と利用できるライブラリ (p. 404)」です。

「仕組み」セクションのすべてのトピックに目を通した後は、Lambda 関数のビルド (p. 16)を確認して、ご利用開始にあたって (p. 3)の実習を体験し、ユースケース (p. 182)について学習することをお勧めします。各ユースケースには、エンドツーエンドエクスペリエンスを体験できるエンドツーエンドの説明が記載されています。

Lambda API のアクセス権限: アクション、リソース、条件リファレンスアクセスコントロール (p. 354) をセットアップし、IAM アイデンティティにアタッチできるアクセス権限ポリシー (アイデンティティベースのポリシー) を作成するときは、以下の表をリファレンスとして使用できます。 のリストには各 AWS Lambda API オペレーション、アクションを実行するためのアクセス権限を付与できる対応するアクション、アクセス権限を付与できる AWS リソース、および指定された APIアクションの条件キーが掲載されています。ポリシーの [Action] フィールドにアクションを、ポリシーの [Resource] フィールドにリソース値を、ポリシーの [Condition keys] フィールドに条件キーを指定します。

アクションを指定するには、API オペレーション名 (lambda:CreateFunction など) の前に lambda:プレフィックスを使用します。

Note

次の表の AWS Lambda Invoke API に対するアクセス権限は、リソースベースのポリシーを使用して付与することもできます。詳細については、「AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー) (p. 371)」を参照してください。

AWS Lambda ポリシーで AWS 全体の条件キーを使用して、条件を表現することができます。AWS 全体を対象とするすべてのキーのリストについては、IAM ユーザーガイド の「条件に利用可能なキー」を参照してください。

AWS Lambda では、一部の API オペレーションに限り、事前定義済みの条件キーも提供します。たとえば、以下のことが可能です。

• 以下のオペレーションに対するアクセスを Lambda 関数 ARN (Amazon リソースネーム) に基づいて制限します。• CreateEventSourceMapping• DeleteEventSourceMapping• UpdateEventSourceMapping

この条件を適用するポリシーの例を次に示します。

"Version": "2012-10-17", "Statement": [

377

Page 384: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda API の権限リファレンス

{ "Sid": " DeleteEventSourceMappingPolicy", "Effect": "Allow", "Action": [ "lambda:DeleteEventSourceMapping" ], "Resource": "arn:aws:lambda:region:account-id:event-source-mapping:UUID", "Condition": {"StringEquals": {"lambda:FunctionArn": "arn:aws:lambda:region:account-id:function:function-name}} } ]

• 以下のオペレーションに対するマッピングを、AWS のサービスプリンシパルに基づいて制限します。• AddPermission• RemovePermission

この条件を適用するポリシーの例を次に示します。

"Version": "2012-10-17", "Statement": [ { "Sid": "AddPermissionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name", "Condition": {"StringEquals": {"lambda:Principal": "s3.amazonaws.com"}} } ]

AWS Lambda API とアクションで必要なアクセス権限

AddPermission (p. 411)

アクション: lambda:AddPermission

リソース: arn:aws:lambda:region:account-id:?/*CreateEventSourceMapping (p. 420)

アクション: lambda:CreateEventSourceMapping

リソース: arn:aws:lambda:region:account-id:?CreateFunction (p. 425)

アクション: lambda:CreateFunction

リソース: arn:aws:lambda:region:account-id:?DeleteEventSourceMapping (p. 435)

アクション: lambda:DeleteEventSourceMapping

リソース: arn:aws:lambda:region:account-id:?DeleteFunction (p. 438)

アクション: lambda:DeleteFunction、

リソース: arn:aws:lambda:region:account-id:?

378

Page 385: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda API の権限リファレンス

GetEventSourceMapping (p. 448)

アクション: lambda:GetEventSourceMapping

リソース: arn:aws:lambda:region:account-id:?GetFunction (p. 451)

アクション: lambda:GetFunction

リソース: arn:aws:lambda:region:account-id:?GetFunctionConfiguration (p. 455)

アクション: lambda:DescribeMountTargetSecurityGroups、

リソース: arn:aws:lambda:region:account-id:?GetPolicy (p. 460)

アクション: lambda:DescribeMountTargets

リソース: arn:aws:lambda:region:account-id:?Invoke (p. 463)

アクション: lambda:DescribeTags

リソース: arn:aws:lambda:region:account-id:?InvokeAsync (p. 468)

アクション: lambda:ModifyMountTargetSecurityGroups

リソース: arn:aws:lambda:region:account-id:?ListEventSourceMappings (p. 474)

アクション: lambda:ListEventSourceMappings

リソース: arn:aws:lambda:region:account-id:?ListFunctions (p. 477)

アクション: lambda:ListFunctions

リソース: arn:aws:lambda:region:account-id:?RemovePermission (p. 493)

アクション: lambda:RemovePermission

リソース: arn:aws:lambda:region:account-id:?UpdateEventSourceMapping (p. 504)

アクション: lambda:UpdateEventSourceMapping

リソース: arn:aws:lambda:region:account-id:?UpdateFunctionCode (p. 508)

アクション: lambda:UpdateFunctionCode

リソース: arn:aws:lambda:region:account-id:?

379

Page 386: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

UpdateFunctionConfiguration (p. 515)

アクション: lambda:UpdateFunctionConfiguration

リソース: arn:aws:lambda:region:account-id:?

ポリシーテンプレート設計図を使用してコンソールで AWS Lambda 関数を作成する場合、Lambda ポリシーテンプレートのリストから関数用のロールを作成できます。これらのテンプレートの 1 つを選択することで、Lambda 関数によってそのポリシーに添付する必要があるアクセス権限をもったロールが自動的に作成されます。

以下は、[ポリシーテンプレート] のリストの各ポリシーテンプレートに適用されたアクセス権限をまとめたものです。ポリシーテンプレートは、対応する設計図にちなんで名付けられています。Lambda は自動的にプレースホルダー項目 (リージョンやアカウント ID など) に適切な情報を入力します。ポリシーテンプレートを使用した Lambda 関数の作成の詳細については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

以下のテンプレートが、作成する Lambda 関数のタイプによって自動的に適用されます。

基本: 「基本的な Lambda のアクセス権限」{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"logs:CreateLogGroup", "Resource":"arn:aws:logs:region:accountId:*" }, { "Effect":"Allow", "Action":[ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource":[ "arn:aws:logs:region:accountId:log-group:[[logGroups]]:*" ] } ]}

VPCAccess: 「Lambda の VPC アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces" ], "Resource": "*" } ]}

380

Page 387: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

Kinesis: 「Lambda の Kinesis ストリームポーリングアクセス権限」{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"lambda:InvokeFunction", "Resource":"arn:aws:lambda:region:accountId:function:functionName*" }, { "Effect":"Allow", "Action":"kinesis:ListStreams", "Resource":"arn:aws:kinesis:region:accountId:stream/*" }, { "Effect":"Allow", "Action":[ "kinesis:DescribeStream", "kinesis:GetRecords", "kinesis:GetShardIterator" ], "Resource":"arn:aws:kinesis:region:accountId:stream/streamName" } ]}

DynamoDB: 「Lambda の DynamoDB Stream ポーリングアクセス権限」{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"lambda:InvokeFunction", "Resource":"arn:aws:lambda:region:accountId:function:functionName*" }, { "Effect":"Allow", "Action":[ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:ListStreams" ], "Resource":"arn:aws:dynamodb:region:accountId:table/tableName/stream/*" } ]}

Edge: 「基本的なエッジ Lambda のアクセス権限」{ "Version": "2012-10-17", "Statement": [ {

381

Page 388: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

"Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ]}

RedrivePolicySNS: 「デッドレターキュー SNS アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": "arn:aws:sns:region:accountId:topicName" } ]}

RedrivePolicySQS: 「デッドレターキュー SQS アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:SendMessage" ], "Resource": "arn:aws:sqs:region:accountId:queueName" } ]}

以下のテンプレートが、選択した設計図によって選ばれます。権限を追加するため、ドロップダウンから選択することもできます。

CloudFormation: 「CloudFormation のスタック読み取り専用アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks" ], "Resource": "*"

382

Page 389: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

} ]}

AMI: 「AMI の読み取り専用アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeImages" ], "Resource": "*" } ]}

KMS: 「KMS の復号化アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "*" } ]}

S3: 「S3 オブジェクトの読み取り専用アクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*" } ]}

Elasticsearch: 「Elasticsearch のアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpPost"

383

Page 390: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

], "Resource": "*" } ]}

SES: 「SES バウンスのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendBounce" ], "Resource": "*" } ]}

TestHarness: 「テストハーネスのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:PutItem" ], "Resource": "arn:aws:dynamodb:region:accountId:table/*" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:accountId:function:*" } ]}

マイクロサービス: 「シンプルなマイクロサービスのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:region:accountId:table/*"

384

Page 391: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

} ]}

VPN: 「VPN 接続のモニタリングのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeRegions", "ec2:DescribeVpnConnections" ], "Resource": "*" } ]}

SQS: 「SQS ポーリングのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource": "arn:aws:sqs:*" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:accountId:function:functionName*" } ]}

IoTButton: 「AWS IoT ボタンのアクセス権限」{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sns:ListSubscriptionsByTopic", "sns:CreateTopic",

385

Page 392: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドポリシーテンプレート

"sns:SetTopicAttributes", "sns:Subscribe", "sns:Publish" ], "Resource": "*" } ]}

RekognitionNoDataAccess: 「Amazon Rekognition データなしアクセス権限」

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rekognition:CompareFaces", "rekognition:DetectFaces", "rekognition:DetectLabels" ], "Resource": "*" } ]}

RekognitionReadOnlyAccess: 「Amazon Rekognition 読み取り専用アクセス権限」

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rekognition:ListCollections", "rekognition:ListFaces", "rekognition:SearchFaces", "rekognition:SearchFacesByImage" ], "Resource": "*" } ]}

RekognitionWriteOnlyAccess: 「Amazon Rekognition 書き込み専用アクセス権限」

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow",

386

Page 393: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド同時実行数の管理

"Action": [ "rekognition:CreateCollection", "rekognition:IndexFaces" ], "Resource": "*" } ]}

• Lambda 関数へのタグ付け (p. 347)• AWS CloudTrail を使用して AWS Lambda API 呼び出しのログを記録する (p. 351)• AWS Lambda に対する認証とアクセスコントロール (p. 353)• 同時実行数の管理 (p. 387)

同時実行数の管理AWS Lambda のスケーリング単位は同時実行数です (詳細については「スケーリング動作について (p. 161)」を参照)。ただし、すべてのシナリオで無期限にスケーリングすることは望ましくありません。たとえば、同時実行数をコスト上の理由や、イベントのバッチの処理にかかる時間や、ダウンストリームリソースに合わせて制御できます。そのために、Lambda にはアカウントレベルと機能レベルの両方で同時実行数の制限を制御する機能が用意されています。

アカウントレベルの同時実行数の制限デフォルトでは、AWS Lambda は特定のリージョン内のすべての関数にわたり、合計の同時実行数を 1000 に制限します。アカウントレベルの設定は、GetAccountSettings (p. 443) API を使用してAccountLimit オブジェクトを表示することで見ることができます。この制限は、以下に説明しているように引き上げることができます。

同時実行数の制限の引き上げをリクエストするには

1. AWS Support Center ページを開き、必要に応じてサインインし、[Create case] を選択します。2. [Regarding] で、[Service Limit Increase] を選択します。3. [Limit Type] で [Lambda] を選択し、フォームにある必須フィールドを入力して、希望する連絡方法の

ページの下部にあるボタンを選択します。

関数レベルの同時実行数の制限デフォルトでは、同時実行数の制限は、すべての関数の同時実行数の合計に対して適用されます。共有同時実行数のプールは、予約されていない同時実行数の割り当てと呼ばれます。関数レベルの同時実行数の制限を設定していない場合、予約されていない同時実行数の制限は、アカウントレベルの同時実行数の制限と同じになります。アカウントレベルの同時実行数の制限を超えると、予約されていない同時実行数の制限がそれに応じて引き上げられます。GetAccountSettings (p. 443)API を使用するか、AWS Lambdaコンソールを使用して、関数の予約されていない同時実行数の割り当てを表示できます。共有同時実行数のプールを割り当てられた関数は、GetFunctionConfiguration (p. 455) API を使用して照会されたときに同時実行数値を返しません。

オプションで、関数の同時実行数の制限を設定できます。このような制限を設定するのには、いくつかの理由があります。

• デフォルトの動作では、ある関数で同時実行数が急増すると、実行制限で隔離した機能がスロットリングされることを回避します。ある関数に対して同時実行数の制限を設定することで、指定した同時実行数値がその関数用に予約されます。

387

Page 394: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド関数レベルの同時実行数の制限

• 関数は受信リクエスト率に基づいて自動的にスケーリングされますが、アーキテクチャ内のすべてリソースがスケーリング可能とは限りません。たとえば、リレーショナルデータベースでは、扱える同時接続数に制限があります。そのダウンストリームリソースがサポートする値に合わせて関数の同時実行数の制限を設定できます。

• 関数が VPC ベースのリソースに接続する場合、各同時実行では、割り当てられたサブネット内の 1 つの IP が消費されます。関数の同時実行数の制限を、サブネットのサイズ制限に合わせて設定できます。

• 関数が呼び出しを処理しないようにする必要がある場合は、同時実行数を 0 に設定し、すべての受信実行をスロットリングできます。

関数の同時実行数の制限を設定することで、Lambda では、残りの関数を処理するトラフィックの量に関係なく、割り当てた同時実行数がその関数に適用されるようになります。その制限を超えると、関数がスロットリングされます。スロットリング時の関数の動作は、イベントソースによって異なります。詳細については、「スロットリング動作 (p. 389)」を参照してください。

Note

同時実行数の制限は、個々のバージョンではなく、関数レベルでのみ設定できます。指定した関数のすべてのバージョンとエイリアスのすべての呼び出しは、関数の同時実行数の制限に達するまで行われます。

予約されている同時実行数の制限と予約されていない同時実行数の制限関数の同時実行数の制限を設定している場合、その値は予約されていない同時実行数のプールから差し引かれます。たとえば、アカウントの同時実行数の制限が 1,000 で、関数が 10 個ある場合は、ある関数の同時実行数の制限を 200 を指定し、別の関数の同時実行数の制限を 100 に指定できます。残りの 700は、他の 8 つの関数の間で共有されます。

Note

AWS Lambda は、予約されていない同時実行数のプールを 100 以上に保持するため、特定の制限が設定されていない関数は引き続きリクエストを処理できます。したがって実際には、アカウントの同時実行数の制限が 1,000 の場合、個々の関数に割り当てられる同時実行数は 900 に制限されます。

関数あたりの同時実行数の制限の設定 (コンソール)Lambda コンソールを使用して、Lambda 関数の同時実行数の制限を設定するには、以下の操作を行います。

1. AWS マネジメントコンソール にサインインして、AWS Lambda コンソールを開きます。2. 新しい Lambda 関数を作成する場合でも、既存の関数を更新する場合でも、同時実行数の制限を設

定するプロセスは同じです。Lambda を初めて使用する場合や、関数の作成に慣れていない場合は、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

3. [Configuration] タブで、[Concurrency] を選択します。[Reserve concurrency] で、その関数用に予約する最大同時実行数の値を設定します。この値を設定すると、[予約されていないアカウントの同時実行]の値が自動的に更新されて、アカウントの他のすべての関数に使用可能な同時実行数の残りが表示されます。また、この関数の呼び出しをブロックする場合は、この値を 0 に設定します。このアカウント専用に割り当てた同時実行数の値を削除するには、[Use unreserved account concurrency] を選択します。

関数あたりの同時実行数の制限の設定 (CLI)AWS CLI を使用して、Lambda 関数の同時実行数の制限を設定するには、以下の操作を行います。

388

Page 395: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドスロットリング動作

• PutFunctionConcurrency (p. 491) オペレーションを使用して、その関数の名前と割り当てる同時実行数の制限を渡します。

aws lambda put-function-concurrency --function-name function-name --reserved-concurrent-executions limit value

AWS CLI を使用して、Lambda 関数の同時実行数の制限を削除するには、以下の操作を行います。

• DeleteFunctionConcurrency (p. 441) オペレーションを使用して、その関数の名前を渡します。

aws lambda delete-function-concurrency --function-name function-name

AWS CLI を使用して、Lambda 関数の同時実行数の制限を表示するには、以下の操作を行います。

• GetFunction (p. 455) オペレーションを使用して、その関数の名前を渡します。

aws lambda get-function --function-name function-name

Note

関数あたりの同時実行数を設定すると、他の関数で使用できる同時実行数のプールに影響を与えることがあります。PutFunctionConcurrency (p. 491) API およびDeleteFunctionConcurrency (p. 441) API に対するアクセス権限を管理ユーザーに制限して、これらの変更を行うことができるユーザーの数が制限されるようにすることをお勧めします。

スロットリング動作関数に関連付けられた同時実行数の制限に達すると、その関数へのそれ以上の呼び出しリクエストはスロットリングされます。つまり、呼び出しによって関数は実行されません。呼び出しがスロットルされるごとに、その関数の Amazon CloudWatch Throttles メトリクスが増加します。AWS Lambda は、ソースに応じて、スロットリングされた呼び出しリクエストを別々に扱います。

• ストリームベースでないイベントソース - これらのイベントソースの一部は Lambda 関数を同期的に呼び出します。それ以外は非同期呼び出しです。処理はそれぞれ異なります。• 同期呼び出し: 関数が同期的に呼び出され、スロットリングされた場合、Lambda は 429 エラーを返

し、呼び出し元のサービスで再試行が必要になります。ThrottledReason エラーコードは、関数レベルのスロットリング (指定されている場合) が行われたか、アカウントレベルのスロットリング (以下を参照) が行われたかを示します。各サービスには独自の再試行ポリシーが設定されている場合があります。たとえば、CloudWatch Logs では、失敗したバッチが最大 5 回再試行されます (再試行間には遅延があります)。イベントソースとその呼び出しタイプのリストについては、「サポートされているイベントソース (p. 163)」を参照してください。

Note

RequestResponse 呼び出しモードで AWS SDK を使用して関数を直接呼び出した場合、クライアントでは 429 エラーが表示され、呼び出しを再試行できます。

• 非同期呼び出し: Lambda 関数が非同期的に呼び出され、スロットリングされた場合は、AWS Lambdaはスロットリングされたイベントを最大 6 時間自動的に再試行します (再試行間には遅延があります)。ただし、非同期イベントは、Lambda 関数の呼び出しに使用されるまでキューに入ります。

• ストリームベースのイベントソース: ストリームベースのイベントソース (Kinesis および DynamoDB ストリーム) の場合、AWS Lambda はストリームをポーリングし、Lambda 関数を呼び出します。Lambda

389

Page 396: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド同時実行数の使用状況のモニタリング

関数がスロットリングされた場合、Lambda はデータの有効期限が切れるまで、レコードのスロットリングされたバッチの処理を試みます。この期間は、Kinesis の場合 7 日間です。スロットルされたリクエストはシャードごとにブロックとして扱われ、スロットルされたレコードのバッチの有効期限が切れるか処理が成功するまで、Lambda ではシャードから新しいレコードの読み込みが行われません。ストリームに複数のシャードがある場合、Lambda はスロットリングされていないシャードで呼び出しを成功するまで続けます。

同時実行数の使用状況のモニタリング同時実行数の使用状況を把握するために、AWS Lambda には以下のメトリクスが用意されています。

• ConcurrentExecutions: これは、アカウントレベルでの同時実行数と、カスタムの同時実行数の制限が適用される関数の同時実行数を示します。

• UnreservedConcurrentExecutions: デフォルトの "予約されていない" 同時実行数のプールを割り当てられた関数の同時実行数の合計を示します。

これらのメトリクスとそのアクセス方法については、「Amazon CloudWatch の使用 (p. 327)」を参照してください。

390

Page 397: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEnvironment Variables

高度なトピック以下のセクションでは、高度な機能と Lambda アプリケーションの構築に関するガイダンスを示しています。この 8 つの原則は以下のとおりです。

• Environment Variables (p. 391)• デッドレターキュー (p. 398)• AWS Lambda 関数を使用する際のベストプラクティス (p. 399)

Environment VariablesLambda 関数の環境変数により、コードへの変更を行なわないで関数コードとライブラリに設定を動的に引き渡すことができます。環境変数は、AWS Lambda コンソール、AWS Lambda CLI または AWSLambda SDK を使用して関数設定の一部として作成、変更するキーと値のペアです。 AWS Lambda はその後、Node.js 関数の process.env などのように、言語でサポートされる標準の API を使用してこれらのキーと値のペアを Lambda 関数コードで利用できるようにします。

環境変数を使用すると、ファイルをインストールするディレクトリ、出力を保存する場所、接続とログの設定の保存先などをライブラリで確認できます。 アプリケーションロジックとこれらの設定を区別することにより、異なる設定に基づいて関数動作を変更する必要がある場合に関数コードを更新する必要がなくなります。

セットアップ開発からデプロイへとライフサイクルの段階が移動する際に Lambda 関数に異なる振る舞いをさせたいとします。 例えば、開発、テスト、および本稼働ステージでは、異なる接続情報を必要とし、異なるテーブル名を使用する、関数が接続する必要があるデータベースを含めることができます。 環境変数を作成して、データベース名、接続情報、またはテーブル名を参照し、実行されるステージ (開発、テスト、本稼働等) に基づいて、関数コードを変更せずに関数の値を設定することができます。

次のスクリーンショットでは、AWS コンソールを使用して関数の設定を変更する方法について説明します。最初のスクリーンショットではテストステージに対応する関数設定を構成します。 2 番目のものでは、本稼働ステージの設定を構成しています。

391

Page 398: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドセットアップ

392

Page 399: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド環境変数の名前をつけるためのルール

[Encryption configuration] セクションを書き留めます。機密情報を保存するために、環境変数を使用してLambda 関数を作成する (p. 397) チュートリアルでこれを使用する方法の詳細を学習できます。

また、AWS CLI を使用して環境変数を含む Lambda 関数を作成することができます。詳細については、CreateFunction (p. 425) および UpdateFunctionConfiguration (p. 515) API を参照してください。環境変数は AWS CloudFormation を使用する関数の作成および更新時にもサポートされます。環境変数は、言語ランタイム固有の設定や、関数に含まれるライブラリの設定にも使用できます。例えば、PATH が実行可能ファイルが保存されているディレクトリを指定するように変更できます。Python 用PYTHONPATH または Node.js 用 NODE_PATH などのランタイム固有の環境変数を設定できます。

次の例では Lambda は、LD_LIBRARY_PATH 環境変数を設定する新しい 関数を作成します。これは共有ライブラリがランタイムで動的にロードされるディレクトリの指定に使用されます。この例では、Lambda 関数コードは /usr/bin/test/lib64 ディレクトリ内の共有ライブラリを使用します。Runtime パラメータは nodejs6.10 を使用しますが、nodejs8.10 または nodejs4.3 も指定できることに注意してください。

aws lambda create-function \ --region us-east-1 --function-name myTestFunction --zip-file fileb://path/package.zip --role role-arn --environment Variables="{LD_LIBRARY_PATH=/usr/bin/test/lib64}" --handler index.handler --runtime nodejs6.10 --profile default

環境変数の名前をつけるためのルールセットの合計サイズが 4 KB を超えない限り、作成できる環境変数の数に制限はありません。

393

Page 400: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド環境変数および関数のバージョニング

その他の要件としては、次のものがあります。

• 文字 [a-zA-Z] で始める必要があります。• 英数字とアンダースコア ([a-zA-Z0-9_] のみ含めることができます。

また、AWS Lambda が予約する特定のキーセットがあります。これらの予約キーのいずれかの値を設定しようとすると、そのアクションが許可されていないことを示すエラーメッセージが表示されます。 これらのキーの詳細については、「Lambda 関数で使用できる環境変数 (p. 404)」を参照してください。

環境変数および関数のバージョニング関数のバージョニングを使用すると、開発からテストまでの間、Lambda 関数の 1 つ以上のバージョンを公開できるようにすることで、Lambda 関数コードを管理できます。 発行する Lambda 関数の各バージョンについては、環境変数 (MemorySize および Timeout 制限等の、その他関数固有の設定も同様) はそのバージョンのスナップショットとして保存され、また、イミュータブル (変更不可) です。

アプリケーションおよび設定要件が増大するにつれて、新しいバージョンの Lambda 関数を作成し、発行される最新バージョンより前にそれらの要件を満たすように環境変数を更新できます。 現在の関数のバージョンは $LATEST です。

さらに、関数の特定のバージョンに対するポインタであるエイリアスを作成できます。 エイリアスの利点は、以前の関数バージョンにロールバックする必要がある場合は、そのバージョンに必要な環境変数が含まれているバージョンをエイリアスに指定できることです。 詳細については、「AWS Lambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

環境変数の暗号化環境変数を使用する Lambda 関数を作成するか、または更新する場合、AWS Lambda は AWS KeyManagement Service を使用してそれらを暗号化します。 Lambda 関数が呼び出されると、これらの値は復号化され、Lambda コードで使用できるようになります。

リージョン内で環境変数を使用する Lambda 関数を初めて作成または更新すると、AWS KMS 内で自動的にデフォルトのサービスキーが作成されます。このキーは環境変数の暗号化に使用されます。ただし、暗号化ヘルパーを使用し、Lambda 関数の作成後に KMS を使用して環境を暗号化する場合は、独自の AWSKMS キーを作成し、デフォルトキーの代わりにそのキーを選択する必要があります。デフォルトキーを選択すると、エラーが表示されます。独自のキーを作成すると、アクセスコントロールを作成、使い回し、無効化、定義できるほか、データの保護に使用される暗号化キーを監査できるなど、より高い柔軟性が得られます。詳細については、AWS Key Management Service 開発者ガイド を参照してください。

独自のキーを使用する場合、AWS Key Management Service 料金表のガイドラインに沿って使用料が請求されます。AWS Lambda により提供されるデフォルトのサービスキーを使用する場合は請求されません。

Lambda のデフォルトの KMS サービスキーを使用する場合、関数実行ロールで追加の IAM アクセス許可は不要であり、ロールは変更なしで自動的に作動します。独自の (カスタム) KMS キーを供給する場合、kms:Decrypt を実行ロールに追加する必要があります。さらに、Lambda 関数を作成して更新するユーザーは、KMS キーを使用するためにアクセス許可が必要です。KMS キーの詳細については、AWSKMS でのキーポリシーの使用を参照してください。

機密情報の保存前セクションで説明されているとおり、Lambda 関数をデプロイする際、指定したすべての環境変数はデフォルトで暗号化されます。これはデプロイプロセス中ではなくプロセス後に行われます。上記の環境変数は関数が呼び出されると AWS Lambda により自動的に復号化されます。環境変数に機密情報を保存する必要がある場合は、Lambda 関数をデプロイする前にその情報を暗号化することを強く推奨します。

394

Page 401: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド環境変数を使用して Lambda 関数を作成する

Lambda コンソールを利用して AWS Key Management Service 暗号化ヘルパーを活用でき、機密情報をCiphertext として保存することが容易になります。また、Lambda コンソールには、Lambda 関数コードで使用する情報を復号するための復号化ヘルパーコードが用意されています。詳細については、「機密情報を保存するために、環境変数を使用して Lambda 関数を作成する (p. 397)」を参照してください。

エラー シナリオ関数構成が 4 KB を超えた場合や、AWS Lambda で予約した環境変数キーを使用した場合、構成エラーでオペレーションの更新または作成が失敗します。実行中に、環境変数の暗号化/復号化が失敗する可能性があります。AWS KMS サービス例外が原因で AWS Lambda が環境変数を復号できない場合、AWS KMSはエラー条件を説明する例外メッセージを返します。その問題の対処法がある場合は解決策を適用できます。これらは Amazon CloudWatch ログの、関数ログストリームに記録されます。例えば、環境変数へのアクセス用に使用する KMS キーが無効な場合は、次のエラーが表示されます。

Lambda was unable to configure access to your environment variables because the KMS key used is disabled. Please check your KMS key settings.

次のステップ環境変数を使用して Lambda 関数を作成する (p. 395)

環境変数を使用して Lambda 関数を作成するこのセクションでは、Lambda 関数コードの変更を必要としない構成の変更によって、Lambda 関数の動作を変更する方法を説明します。

このチュートリアルでは、以下の作業を行います。

• Amazon S3 バケットの名前を指定する環境変数の値を返すサンプルコードを含んだデプロイパッケージの作成する。

• Lambda 関数を呼び出し、返される Amazon S3 バケット名が環境変数によって設定される値と一致することを確認する。

• 環境変数により指定された Amazon S3 バケット名を変更して Lambda 関数を更新する。• Lambda 関数を再度呼び出し、返される Amazon S3 バケット名が更新された値と一致するか確認す

る。

ステップ 1: 準備次の手順を完了していることを確認してください。

• AWS アカウントにサインアップし、アカウントで管理者ユーザー (adminuser) を作成した。手順については、以下を参照してください。AWS アカウントのセットアップ (p. 4)

• AWS CLI をインストールしてセットアップした。手順については、以下を参照してください。AWSCommand Line Interface のセットアップ (AWS CLI) (p. 6)

ステップ 2: Lambda 環境の設定このセクションでは、以下の作業を行います。

• 提供されたサンプルコードを使用して Lambda 関数のデプロイパッケージを作成する。• Lambda 実行ロールを作成する。

395

Page 402: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド環境変数を使用して Lambda 関数を作成する

• デプロイパッケージをアップロードして Lambda 関数を作成して、その関数を手動で呼び出すことでテストする。

ステップ 2.1: デプロイパッケージを作成する

以下のコードサンプルは、Amazon S3 バケットの名前を返す Lambda 関数の環境変数を読み取ります。

1. テキストエディターを開き、次のコードをコピーします。

var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucketName = process.env.S3_BUCKET; callback(null, bucketName); }

2. index.js という名前でファイルを保存します。3. index.js を圧縮します。 ファイル名を Test_Environment_Variables.zip として保存します。

ステップ 2.2: 実行ロールを作成する

Lambda 関数の作成時に指定できる IAM ロール (実行ロール) を作成します。

1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

2. IAM ユーザーガイドのIAM ロールのステップに従って、IAM ロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

• [Select Role Type] で、[AWS Service Roles] を選択して [AWS Lambda] を選択します。• [Attach Policy] で、AWSLambdaBasicExecutionRole という名前のポリシーを選択します。

3. IAM ロールの Amazon リソースネーム (ARN) をメモします。次のステップで Lambda 関数を作成するときに、この値が必要になります。

ステップ 2.3: Lambda 関数を作成してテストする

このセクションでは、Test という名前の Amazon S3 バケットを指定する環境変数を含む Lambda 関数を作成します。呼び出されると、この関数は Amazon S3 バケットの名前を返します。Amazon S3 バケット名を Prod に変更することで設定を更新すると、再度呼び出された時にこの関数は更新された Amazon S3バケットの名前を返します。

Lambda 関数を作成するには、コマンドプロンプトを開き、次の Lambda AWS CLI create-functionコマンドを実行します。.zip ファイルのパスと実行ロール ARN を指定する必要があります。Runtime パラメータは nodejs6.10 を使用しますが、nodejs4.3 も指定できることに注意してください。

aws lambda create-function \--region us-east-1 \--function-name ReturnBucketName \--zip-file fileb://file-path/Test_Environment_Variables.zip \--role role-arn \--environment Variables={S3_BUCKET=Test} \--handler index.handler \--runtime nodejs6.10 \--version version \--profile default

396

Page 403: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド機密情報を保存するために、環境変

数を使用して Lambda 関数を作成する

Note

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。--zip-fileパラメーターを --code パラメーターに置き換える必要があります。以下に例を示します。

--code S3Bucket=bucket-name,S3Key=zip-file-object-key

次に、以下の Lambda CLI invoke コマンドを実行して関数を呼び出します。コマンドは非同期実行をリクエストします。オプションで、invocation-type パラメータ値として RequestResponse を指定することで、このコマンドを同期的に呼び出すこともできます。

aws lambda invoke \--invocation-type Event \--function-name ReturnBucketName \--region us-east-1 \--profile default \outputfile.txt

Lambda 関数が Amazon S3 バケットの名前を「テスト用」として返します。

次に、以下の Lambda CLI update-function-configuration コマンドを実行して、Prod バケットを指定して Amazon S3 環境変数を更新します。

aws lambda update-function-configuration--function-name ReturnBucketName \--region us-east-1 \--environment Variables={S3_BUCKET=Prod}

同じパラメータを使用して aws lambda invoke コマンドを再度実行します。今回は、Lambda 関数がAmazon S3 バケット名を Prod として返します。

機密情報を保存するために、環境変数を使用してLambda 関数を作成するLambda 関数の構成設定の指定に加えて、環境変数を使用して、データベースパスワード、AWS KeyManagement Service および Lambda コンソールの暗号化ヘルパーを使用して機密情報を保存できます。詳細については、「環境変数の暗号化 (p. 394)」を参照してください。次の例では、これを行う方法に加えて、その情報を復号化する KMS を使用する方法も説明します。

このチュートリアルでは、Lambda コンソールを使用して機密情報が含まれる環境変数を暗号化できる方法を説明します。既存の関数を更新する場合は、環境変数を展開する方法を示す手順のセクション (ステップ 2: Lambda 関数を設定する (p. 398)) にスキップします。

ステップ 1: Lambda 関数を作成する1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある

AWS Lambda コンソールを開きます。2. [Create a Lambda function] を選択します。3. [Select blueprint] で、[Author from scratch] ボタンを選択します。4. [Basic information] で、以下の操作を行います。

• [Name*] で、Lambda 関数名を指定します。• [Role*] で、[Choose an existing role] を選択します。• [Existing role*] で、[lambda_basic_execution] を選択します。

397

Page 404: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドデッドレターキュー

Note

実行ロールのポリシーに decrypt アクセス許可が付与されていない場合は追加する必要があります。

• [Create function] を選択します。

ステップ 2: Lambda 関数を設定する1. [Configuration] で任意の [Runtime] を指定します。2. [Lambda function code] セクションで [Edit code inline] オプションを活用して Lambda 関数ハンドラ

コードを独自のカスタムコードに置き換えることができます。3. [Triggers] タブを確認します。[Triggers] ページで、Lambda 関数を自動的にトリガーするサービスを

オプションで選択できます。[Add trigger] ボタンを選択してから省略記号 (...) がついたグレーのボックスを選択すると、使用できるサービスのリストが表示されます。この例ではトリガーを設定せず、[Configuration] を選択します。

4. [Monitoring] タブを確認します。このページでは、Lambda 関数呼び出しに今すぐ使用できるCloudWatch メトリクスを説明するとともに、「AWS X-Ray を使用する (p. 335)」など他の有益なガイドへのリンクを紹介します。

5. [Environment variables] セクションを展開します。6. キーと値のペアを入力します。[Encryption configuration] セクションを展開します。Lambda には、デ

フォルトのサービスキーが [KMS key to encrypt at rest] に用意されており、これがアップロードされると情報が暗号化されます。指定した情報が重要な場合は、さらに [Enable helpers for encryption intransit] チェックボックスをオンにして、カスタムキーを提供できます。これにより入力した値がマスク化され、その結果、AWS KMS が呼び出されて値が暗号化され、Ciphertext として返します。アカウントの KMS キーを作成していない場合、キーを作成するための AWS IAM コンソールへのリンクが提供されます。アカウントにはそのキー用の encrypt および decrypt 許可が必要です。[Encrypt] ボタンを選択すると、そのボタンは [Decrypt] に切り替わることに注意してください。これにより、情報を更新するオプションが提供されます。これが完了した後は、[Encrypt] ボタンを選択します。

[Code] ボタンを押すと、アプリケーションで使用可能な Lambda 関数のランタイム固有のサンプル復号コードが提供されます。

Note

クライアント側で機密情報を暗号化するために、デフォルトの Lambda サービスキーを使用することはできません。詳細については、「環境変数の暗号化 (p. 394)」を参照してください。

デッドレターキュー非同期で呼び出された Lambda 関数は 2 回再試行され、その後イベントは破棄されます。再試行に失敗した理由が不明な場合は、デッドレターキュー (DLQ) を使用して、未処理のイベントを Amazon SQSキューまたは Amazon SNS トピックに移動させ、失敗を分析できます。

AWS Lambda はそりできないイベントを指定された Amazon SNS トピックのトピックまたは AmazonSQS キューに移動させます。DLQ を指定しない関数は、再試行の上限に達した後でイベントを破棄します。再試行ポリシーの詳細については、「再試行動作について (p. 160)」を参照してください。

DLQ は、Lambda 関数の DeadLetterConfig パラメータの TargetArn 値に Amazon リソースネーム(ARN) を指定することで設定します (Amazon SQS キューでも Amazon SNS トピックでも同様です)。

{ "Code": { "ZipFile": blob,

398

Page 405: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドベストプラクティス

"S3Bucket": “string”, "S3Key": “string”, "S3ObjectVersion": “string” }, "Description": "string", "FunctionName": "string", "Handler": "string", "MemorySize": number, "Role": "string", "Runtime": "string", "Timeout": number "Publish": bool, "DeadLetterConfig": { "TargetArn": "string" }}

Lambda 関数の実行ロールの一部として、DLQ リソースへのメッセージの受信/削除/送信アクセスを明示的に許可する必要があります。DLQ ターゲット ARN に書き込まれるペイロードは、メッセージ本文への変更のない元のイベントペイロードです。次のメッセージの属性には、イベントが処理されなかった理由を理解するのに役立つ情報が含まれています。

名前 タイプ 値

RequestID 文字列 一意のリクエスト ID

ErrorCode 数値 3 桁の HTTP エラーコード

ErrorMessage 文字列 エラーメッセージ (1 KB に切り捨て)

イベントペイロードがターゲット ARN に達する点で継続的に失敗する場合は、AWS Lambda はDeadLetterErrors と呼ばれる CloudWatch メトリクスをインクリメントしてから、イベントペイロードを削除します。

AWS Lambda 関数を使用する際のベストプラクティス

AWS Lambda の使用時に推奨されるベストプラクティスを以下に示します。

トピック• 関数コード (p. 400)• Function Configuration (p. 400)• アラームとメトリクス (p. 401)• ストリームイベントの呼び出し (p. 401)• 非同期呼び出し (p. 402)• Lambda VPC (p. 402)

399

Page 406: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド関数コード

関数コード• Lambda ハンドラ (エントリポイント) をコアロジックから分離します。これにより、関数の単体テスト

が実行しやすくなります。Node.js では、次のようになります。

exports.myHandler = function(event, context, callback) { var foo = event.foo; var bar = event.bar; var result = MyLambdaFunction (foo, bar); callback(null, result);} function MyLambdaFunction (foo, bar) { // MyLambdaFunction logic here}

• 実行コンテキストの再利用を活用して関数のパフォーマンスを向上させます。コードで取得する外部設定や依存関係が、最初の実行後はローカルで保存および参照されることを確認します。すべての呼び出しで変数/オブジェクトの再初期化を制限します。代わりに、静的初期化/コンストラクタ、グローバル/静的変数、およびシングルトンを使用します。前回の呼び出しで確立した接続を (HTTP、データベースなど) をキープアライブにして再利用します。

• Environment Variables (p. 391) を使用してオペレーショナルパラメータを関数に渡します。たとえば、Amazon S3 に書き込む場合、書き込み先のバケットの名前はハードコーディングせずに、環境変数として設定します。

• 関数のデプロイパッケージの依存関係を制御します。AWS Lambda 実行環境には、Node.js およびPython ランタイムの AWS SDK などのライブラリがいくつか含まれています (詳細なリストについては、「Lambda 実行環境と利用できるライブラリ (p. 404)」を参照してください)。最新の機能やセキュリティ更新プログラムを有効にするために、Lambda ではこれらのライブラリを定期的に更新します。この更新に伴って、Lambda 関数の動作が微妙に変わる場合があります。関数で使用する依存関係を完全に制御するには、すべての依存関係をデプロイパッケージでパッケージングすることをお勧めします。

• デプロイパッケージのサイズをランタイムに必要な最小限のサイズにします。これにより、呼び出しに先立ってデプロイパッケージをダウンロードして解凍する所要時間が短縮されます。Java または .NETCore で作成した関数の場合は、デプロイパッケージの一環として AWS SDK ライブラリ全体をアップロードしないようにします。代わりに、SDK のコンポーネントを必要に応じて選別するモジュール(DynamoDB モジュール、Amazon S3 SDK モジュール、Lambda コアライブラリ など) を使用します。

• Java で記述されたデプロイパッケージを Lambda で解凍する所要時間を短縮します。そのために、依存する .jar ファイルを別個の /lib ディレクトリに収納します。これで関数のすべてのコードを多数の.class ファイルと一緒に単一の Jar に収納するよりも高速化されます。

• 依存関係の複雑さを最小限に抑えます。フレームワークを単純化して、実行コンテキスト起動時のロードの高速化を優先します。たとえば、Spring Framework などの複雑なフレームワークよりも、Daggerや Guice などの単純な Java 依存関係インジェクション (IoC) フレームワークを使用します。

• Lambda 関数内で、任意の条件が満たされるまでその関数自身を自動的に呼び出すような再帰的なコードを使用しないでください。これを行うと意図しないボリュームで関数が呼び出され、料金が急増する可能性があります。誤ってこのようなコードを使用した場合は、関数の同時実行数の制限を 0 に設定して、コードを更新している間のすべての関数の呼び出しをスロットリングします。

Function Configuration• Lambda 関数のパフォーマンステストは、最適なメモリサイズ設定を選択する上で欠かせない部分で

す。メモリサイズが増えると、関数で利用できる CPU も同様に増加します。関数のメモリ使用量は、呼び出しごとに決定され、AWS CloudWatch Logs で表示できます。次に示すように、呼び出しごとにREPORT: エントリが作成されます。

400

Page 407: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドアラームとメトリクス

REPORT RequestId: 3604209a-e9a3-11e6-939a-754dd98c7be3 Duration: 12.34 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 18 MB

Max Memory Used: フィールドを分析することで、関数のメモリが不足しているか、関数のメモリサイズをオーバープロビジョニングしているかを判断できます。

• Lambda 関数のロードテストにより、最適なタイムアウト値を決定します。関数の実行時間を分析し、依存関係サービスの問題に伴って関数の同時実行が必要以上に増えるような状況をより的確に判定します。これは、Lambda のスケーリングを処理しない可能性があるリソースに対して Lambda 関数からネットワークの呼び出しを行うときに特に重要です。

• IAM ポリシーの設定時に最も制限的なアクセス許可を使用します。Lambda 関数に必要なリソースとオペレーションを把握し、実行ロールをこれらのアクセス許可に制限します。詳細については、「AWSLambda に対する認証とアクセスコントロール (p. 353)」を参照してください。

• AWS Lambda の制限 (p. 407) に精通します。ランタイムのリソース制限を決定する際に、ペイロードサイズ、ファイル記述子、および /tmp スペースが見過ごされがちです。

• 使用しなくなった Lambda 関数を削除します。削除することで、未使用の関数がデプロイパッケージサイズの制限対象として不必要にカウントされなくなります。

アラームとメトリクス• AWS Lambda のメトリクス (p. 332) および CloudWatch アラームを使用し、Lambda 関数コード内から

はメトリクスを作成または更新しないようにします。Lambda 関数の状態を追跡する方法としてより効率的であり、開発プロセスの早期に問題を把握できます。たとえば、Lambda 関数の推定される実行所要時間に基づいてアラームを設定し、関数コードに起因するボトルネックやレイテンシーに対処できます。

• ログ記録のライブラリと AWS Lambda メトリクスおよびディメンションを活用して、アプリケーションエラー (ERR、ERROR、WARNING など) を見つけます。

ストリームイベントの呼び出し• バッチおよびレコードの各種サイズのテストにより、関数がタスクを完了できるスピードに合わせて各

イベントソースのポーリング間隔を調整します。BatchSize は、各呼び出しで関数に送信できるレコードの最大数を制御します。通常、バッチサイズが大きいほど、大きなレコードセット全体での呼び出しのオーバーヘッドをより効率的に吸収し、スループットを増大できます。

Note

処理対象のレコード数が十分でない場合は、待機する代わりに、少数のレコードを処理するストリーム処理関数を呼び出します。

• シャードを追加して Kinesis ストリーム処理のスループットを向上させます。Kinesis ストリームは 1 つ以上のシャードで構成されます。Lambda は、最大で 1 つの同時呼び出しを使用して各シャードをポーリングします。たとえば、ストリームに 100 個のアクティブなシャードがある場合は、最大で 100 個のLambda 関数呼び出しが同時に実行されます。シャードの数を増やすと、直接的な結果として、Lambda関数の同時呼び出しの最大数が増えます。また、Kinesis ストリーム処理のスループットが増える場合があります。Kinesis ストリームのシャード数を増やす場合は、データの適切なパーティションキー (パーティションキーを参照) を選択していることを確認し、関連レコードが同じシャードに割り当てられ、データが適切に配分されるようにします。

• Amazon CloudWatch を IteratorAge で使用し、Kinesis ストリームが処理されているかどうかを判断します。たとえば、CloudWatch アラームを最大値の 300000 (30 秒) に設定します。

401

Page 408: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド非同期呼び出し

非同期呼び出し• デッドレターキュー (p. 398) を作成および使用して関数の非同期エラーに対処し、再生します。

Lambda VPC• 次の図は、VPC (Virtual Private Cloud) を使用するかどうかを判断するデシジョンツリーです。

• 必要でない限り、Lambda 関数を VPC に配置しません。プライベートな Amazon Relational Databaseインスタンスなど、パブリックに公開できないリソースにアクセスする以外に、この関数の利点はありません。Amazon Elasticsearch Service などのサービスは IAM のアクセスポリシーで保護できるため、エンドポイントをパブリックに公開しても安全であり、エンドポイントを保護するために VPC で関数を実行する必要はありません。

• Lambda は、VPC で Elastic Network Interface (ENI) を作成して内部リソースにアクセスします。同時実行の増加をリクエストする前に、ENI キャパシティーが十分であること (その数式は「Amazon VPC内のリソースにアクセスできるように Lambda 関数を構成する (p. 141)」にあります) および IP アドレスのスペースが十分であることを確認します。ENI キャパシティーが十分でない場合は、増加をリクエ

402

Page 409: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドランタイムサポートポリシー

ストする必要があります。IP アドレスのスペースが十分でない場合は、必要に応じて、より大きなサブネットを作成します。

• Lambda 専用サブネットを VPC に作成します。• これにより、他のプライベート/パブリックサブネットを変更しないで、より簡単にカスタムルート

テーブルを NAT ゲートウェイトラフィックに適用できます。詳細については、「Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する (p. 141)」を参照してください。

• これにより、他のリソースと共有せずに専用のアドレス空間を Lambda に割り当てることができます。

ランタイムサポートポリシーAWS Lambda は、メンテナンスウィンドウの終了時に、EOL (End of Life) とマークされたランタイムバージョンを非推奨にするのみです。非推奨とマークされたバージョンでは新しい関数の作成が停止され、(サポートされたラインタイムバージョンを使用するよう再設定されない限り) 非推奨にされたランタイムで作成された既存の関数の更新も停止されます。AWS Lambda は、非推奨のランタイムのセキュリティ更新プログラム、テクニカルサポート、または修正プログラムを提供せず、非推奨にされたランタイムで実行するように設定された関数の呼び出しをいつでも無効にする権限を持ちます。非推奨とマークされたランタイムバージョンのリストを次に示します。

ランタイム Version

Node.js 0.10

403

Page 410: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数で使用できる環境変数

Lambda 実行環境と利用できるライブラリ

AWS Lambda の実行環境は、以下に基づいています。

• こちらでアクセスできるパブリック Amazon Linux AMI バージョン (AMI 名: amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2)

AMI の使用に関する一般的な情報については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』の「Amazon マシンイメージ (AMI)」を参照してください。

• Linux カーネルバージョン – 4.9.85-38.58.amzn1.x86_64

コードにネイティブバイナリを使用している場合は、必ずこの環境でコンパイルしてください。AWSLambda では 64 ビットのバイナリのみサポートされています。

AWS Lambda は次のランタイムバージョンをサポートします。

• Node.js – v8.10、4.3.2 および 6.10.3• Java – Java 8• Python – Python 3.6 および 2.7• .NET Core – .NET Core 1.0.1 および .NET Core 2.0• Go – Go 1.x

Note

すべてのランタイムが、パブリック Amazon Linux AMI バージョンまたはその yum リポジトリで使用できるわけではありません。それぞれのパブリックサイトからの手動のダウンロードとインストールが必要になる場合があります。

使用しているサポート対象のランタイムに関わらず、AWS Lambda 実行環境に次のライブラリが用意されているため、ライブラリを含める必要はありません。

• AWS SDK – AWS SDK for JavaScript バージョン 2.221.1• AWS SDK for Python 2.7 (Boto 3) バージョン 3-1.7.0 botocore-1.9.3

AWS SDK for Python 3.6 (Boto 3) バージョン 3-1.7.0 botocore-1.9.3• Java 用 java-1.8.0-openjdk の Amazon Linux ビルド。

Lambda 関数での boto ライブラリの使用に関する例は、「Lambda 関数からのリソースへのアクセス (p. 140)」を参照してください。

Lambda 関数で使用できる環境変数以下は、AWS Lambda 実行環境の一部であり、Lambda 関数で使用できる環境変数のリストです。下のテーブルは AWS Lambda によって予約されていて変更できないものと、Lambda 関数を作成するときに設定できるものを示しています。Lambda 関数で環境変数を用いる詳細については、「EnvironmentVariables (p. 391)」を参照してください。

404

Page 411: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数で使用できる環境変数

Lambda 環境変数

キー リザーブド 値

LAMBDA_TASK_ROOT はい Lambda 関数コードのパスを含みます。

AWS_EXECUTION_ENV はい 環境変数は Lambda 関数のランタイムに応じて、次のいずれかのオプションに設定されます。

• AWS_Lambda_java8• AWS_Lambda_nodejs4.3• AWS_Lambda_nodejs6.10• AWS_Lambda_nodejs8.10• AWS_Lambda_python2.7• AWS_Lambda_python3.6• AWS_Lambda_dotnetcore1.0• AWS_Lambda_dotnetcore2.0

LAMBDA_RUNTIME_DIR はい Lambda ランタイム関連アーティファクトに制限されます。例えば、このパスで Node.js の aws-sdk と Pythonの boto3 を確認できます。

AWS_REGION はい Lambda 関数が実行される AWS リージョン。

AWS_DEFAULT_REGION はい Lambda 関数が実行される AWS リージョン。

AWS_LAMBDA_LOG_GROUP_NAME はい Lambda 関数ログを含むログストリームが作成される Amazon CloudWatchLogs グループの名前。

AWS_LAMBDA_LOG_STREAM_NAME はい Lambda 関数ログを含む AmazonCloudWatch Logs ストリーム

AWS_LAMBDA_FUNCTION_NAME はい Lambda 関数の名前。

AWS_LAMBDA_FUNCTION_MEMORY_SIZEはい Lambda 関数のサイズ (MB 単位)。

AWS_LAMBDA_FUNCTION_VERSION はい Lambda 関数のバージョン。

AWS_ACCESS_KEY

AWS_ACCESS_KEY_ID

AWS_SECRET_KEY

AWS_SECRET_ACCESS_KEY

AWS_SESSION_TOKEN

AWS_SECURITY_TOKEN

はい どのランタイムが使用されているかに応じて、Lambda 関数を実行するためにセキュリティ認証情報が必要となります。異なるランタイムがこれらのキーのサブセットを使用します。関数固有の IAM 実行ロールを介して作成されます。

PATH いいえ 実行可能ファイルのための /usr/local/bin, /usr/bin または /bin が含まれます。

405

Page 412: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドLambda 関数で使用できる環境変数

キー リザーブド 値

LANG いいえ en_US.UTF-8 に設定します。これがランタイムのロケールです。

LD_LIBRARY_PATH いいえ /lib64、/usr/lib64、LAMBDA_TASK_ROOT、LAMBDA_TASK_ROOT/lib が含まれます。ヘルパーライブラリおよび関数コードの保存に使用されます。

NODE_PATH いいえ Node.js ランタイムに設定します。これにはLAMBDA_RUNTIME_DIR、LAMBDA_RUNTIME_DIR/node_modules、LAMBDA_TASK_ROOTが含まれます。

PYTHONPATH いいえ Python のランタイムに設定します。これには LAMBDA_RUNTIME_DIRが含まれます。

TZ はい 現在のローカル時刻。デフォルトはUTC です。

406

Page 413: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda の制限

AWS Lambda の制限「Lambda 関数 (p. 16)」に説明されているように、カスタムコードを依存関係ごとパッケージ化し、AWSLambda にアップロードすると、Lambda 関数を作成したことになります。ただし、たとえばデプロイパッケージのサイズや呼び出しごとに Lambda 関数に割り当てられるメモリの量など、AWS Lambda によって適用される制限があります。加えて:

• IAM の制限によって Lambda 関数が影響を受ける可能性があります。詳細については、「IAM エンティティおよびオブジェクトの制限」を参照してください。

• Lambda@Edge を使用している場合は、追加の制限が適用されます。詳細については、AmazonCloudFront 開発者ガイドの「Lambda@Edge の制限」を参照してください。

このセクションでは、このような AWS Lambda の制限について説明します。

トピック• AWS Lambda の制限 (p. 407)• AWS Lambda 制限のエラー (p. 408)

AWS Lambda の制限呼び出しごとの AWS Lambda リソース制限

リソース 制限

メモリの動的な範囲 最小 = 128 MB/ 最大 = 3008 MB (64 MB単位). 最大メモリ使用量を超えた場合は、関数の呼び出しが終了します。

一時ディスク容量 ("/tmp" スペース) 512 MB

ファイル記述子の数 1,024

プロセスとスレッドの数 (両者の合計) 1,024

リクエストあたりの最大実行時間 300 秒

「Invoke (p. 463)」リクエストボディのペイロードサイズ(RequestResponse/同期呼び出し)

6 MB

「Invoke (p. 463)」リクエストボディのペイロードサイズ(イベント/非同期呼び出し)

128 KB

リージョンごとの AWS Lambda アカウントの制限

リソース デフォルトの制限

同時実行数 (「同時実行数の管理 (p. 387)」を参照) 1,000

同時実行数の制限の引き上げをリクエストするには

1. AWS Support Center ページを開き、必要に応じてサインインし、[Create case] をクリックします。

407

Page 414: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAWS Lambda 制限のエラー

2. [Regarding] で [Service Limit Increase] を選択します。3. [Limit Type] で [Lambda] を選択し、フォームにある必須フィールドを入力して、希望する連絡方法の

ページの下部にあるボタンをクリックします。

Note

AWS は、Amazon S3 バケットから関数をトリガーする場合のように、関数が受信イベントレートに一致できるように、ユーザーに代わって同時実行数の制限を自動的に引き上げます。

次の表は、Lambda 関数のデプロイに関するサービス制限を示しています。

AWS Lambda デプロイメントの制限

項目 デフォルトの制限

Lambda 関数デプロイパッケージのサイズ (圧縮 .zip/.jar ファイル)

50 MB

リージョンあたりの、アップロードできるすべてのデプロイパッケージの合計サイズ

75 GB

デプロイパッケージ (非圧縮 .zip/.jar サイズ) に圧縮できるコード/依存関係のサイズ

Note

Lambda 関数ごとに、追加で 500 MB の非永続ディスクスペースがそれぞれの /tmp ディレクトリに用意されます。/tmp ディレクトリは、依存関係ライブラリや関数の初期化中のデータセットなど、その他のリソースのロードに使用できます。

250 MB

環境変数セットの合計サイズ 4 KB

Note

Lambda 関数の圧縮したデプロイパッケージのサイズが 3MB を超える場合は、Lambda コンソールでインラインコードを編集する機能を使用することはできません。ただし、コンソールを使用して Lambda 関数を呼び出すことができます。

AWS Lambda 制限のエラー前述の制限のテーブルに示されているいずれかの制限を超えた関数は、exceeded limits の例外でエラーとなります。これらの制限は固定されており、現在変更することはできません。たとえば、例外CodeStorageExceededException、または "Code storage limit exceeded" のようなエラーメッセージを AWS Lambda から受け取った場合は、コードストレージのサイズを減らす必要があります。

コードストレージのサイズを減らすには

1. 使用しなくなった関数を削除します。2. 削除しない関数のコードサイズを減らします。AWS Lambda コンソール、AWS Command Line

Interface、または AWS SDK を使用して、Lambda 関数のコードサイズを確認できます。

408

Page 415: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドSDK を使用する場合の証明書のエラー

API リファレンスこのセクションには、AWS Lambda API リファレンスドキュメントが含まれています。API 呼び出しを行うときは、署名を提供してリクエストを認証する必要があります。AWS Lambda では、署名バージョン 4がサポートされます。詳細については、アマゾン ウェブ サービス全般のリファレンスの「署名バージョン4 の署名プロセス」を参照してください。

サービスの概要については、「AWS Lambda とは (p. 1)」を参照してください。

AWS CLI を使用して AWS Lambda API について調べることができます。このガイドでは、AWS CLI を使用したチュートリアルを提供しています。

SDK を使用する場合の証明書のエラーAWS SDK ではご使用のコンピュータ上の CA 証明書が使用されるため、AWS サーバー上の証明書が変更されると、SDK を使用しようとした際に接続エラーが発生することがあります。このようなエラーは、コンピュータ上の CA 証明書とオペレーティングシステムを最新の状態にしておくことで回避できます。ユーザーが自分のコンピュータを管理していない企業環境でこの問題が発生した場合は、必要に応じて管理者から支援を得て更新プロセスを行う必要があります。以下のリストは、オペレーティングシステムとJava の最小バージョンを示しています。<listiem>

2005 年 1 月以降の更新プログラムがインストールされた Microsoft Windows バージョンでは、必要な CAが信頼リストに 1 つ以上含まれています。</listiem>

• Mac OS X 10.4 with Java for Mac OS X 10.4 Release 5 (2007 年 2 月)、Mac OS X 10.5 (2007 年 10月)、および以降のバージョンでは、必要な CA が信頼リストに 1 つ以上含まれています。

• Red Hat Enterprise Linux 5 (2007 年 3 月)、6、7、および CentOS 5、6、および 7 では、必要な CA がデフォルトの CA 信頼リストに 1 つ以上含まれています。

• Java 1.4.2_12 (2006 年 5 月)、5 Update 2 (2005 年 3 月)、および以降のすべてのバージョン (Java 6(2006 年 12 月)、7、8 を含む) では、必要な CA がデフォルトの CA 信頼リストに 1 つ以上含まれています。

AWS Lambda 管理コンソールまたは AWS LambdaAPI エンドポイントにアクセスする場合、ブラウザを介するかプログラムで、クライアントマシンが以下のいずれかの CA をサポートすることを確認する必要があります。

• Amazon Root CA 1• Starfield Services Root Certificate Authority - G2• Starfield Class 2 Certification Authority

最初の 2 つの機関からのルート証明書は Amazon Trust Services から入手できますが、もっと簡単なソリューションは、コンピュータを最新の状態にしておくことです。ACM から提供される証明書の詳細については、AWS Certificate Manager に関するよくある質問を参照してください。

トピック

• Actions (p. 410)• Data Types (p. 522)

409

Page 416: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドActions

ActionsThe following actions are supported:

• AddPermission (p. 411)• CreateAlias (p. 416)• CreateEventSourceMapping (p. 420)• CreateFunction (p. 425)• DeleteAlias (p. 433)• DeleteEventSourceMapping (p. 435)• DeleteFunction (p. 438)• DeleteFunctionConcurrency (p. 441)• GetAccountSettings (p. 443)• GetAlias (p. 445)• GetEventSourceMapping (p. 448)• GetFunction (p. 451)• GetFunctionConfiguration (p. 455)• GetPolicy (p. 460)• Invoke (p. 463)• InvokeAsync (p. 468)• ListAliases (p. 471)• ListEventSourceMappings (p. 474)• ListFunctions (p. 477)• ListTags (p. 480)• ListVersionsByFunction (p. 482)• PublishVersion (p. 485)• PutFunctionConcurrency (p. 491)• RemovePermission (p. 493)• TagResource (p. 496)• UntagResource (p. 498)• UpdateAlias (p. 500)• UpdateEventSourceMapping (p. 504)• UpdateFunctionCode (p. 508)• UpdateFunctionConfiguration (p. 515)

410

Page 417: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAddPermission

AddPermissionAdds a permission to the resource policy associated with the specified AWS Lambda function. You useresource policies to grant permissions to event sources that use push model. In a push model, eventsources (such as Amazon S3 and custom applications) invoke your Lambda function. Each permission youadd to the resource policy allows an event source, permission to invoke the Lambda function.

For information about the push model, see Lambda Functions.

If you are using versioning, the permissions you add are specific to the Lambda function version or aliasyou specify in the AddPermission request via the Qualifier parameter. For more information aboutversioning, see AWS Lambda Function Versioning and Aliases.

This operation requires permission for the lambda:AddPermission action.

Request SyntaxPOST /2015-03-31/functions/FunctionName/policy?Qualifier=Qualifier HTTP/1.1Content-type: application/json

{ "Action": "string", "EventSourceToken": "string", "Principal": "string", "RevisionId": "string", "SourceAccount": "string", "SourceArn": "string", "StatementId": "string"}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 411)

Name of the Lambda function whose resource policy you are updating by adding a new permission.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 411)

You can use this optional query parameter to describe a qualified ARN using a function version or analias name. The permission will then apply to the specific qualified ARN. For example, if you specifyfunction version 2 as the qualifier, then permission applies only when request is made using qualifiedfunction ARN:

arn:aws:lambda:aws-region:acct-id:function:function-name:2

If you specify an alias name, for example PROD, then the permission is valid only for requests madeusing the alias ARN:

411

Page 418: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAddPermission

arn:aws:lambda:aws-region:acct-id:function:function-name:PROD

If the qualifier is not specified, the permission is valid only when requests is made using unqualifiedfunction ARN.

arn:aws:lambda:aws-region:acct-id:function:function-name

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

Request BodyThe request accepts the following data in JSON format.

Action (p. 411)

The AWS Lambda action you want to allow in this statement. Each Lambda action is a string startingwith lambda: followed by the API name (see Actions) . For example, lambda:CreateFunction.You can use wildcard (lambda:*) to grant permission for all AWS Lambda actions.

Type: String

Pattern: (lambda:[*]|lambda:[a-zA-Z]+|[*])

Required: YesEventSourceToken (p. 411)

A unique token that must be supplied by the principal invoking the function. This is currently only usedfor Alexa Smart Home functions.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Pattern: [a-zA-Z0-9._\-]+

Required: NoPrincipal (p. 411)

The principal who is getting this permission. It can be Amazon S3 service Principal(s3.amazonaws.com) if you want Amazon S3 to invoke the function, an AWS account ID if you aregranting cross-account permission, or any valid AWS service principal such as sns.amazonaws.com.For example, you might want to allow a custom application in another AWS account to push events toAWS Lambda by invoking your function.

Type: String

Pattern: .*

Required: YesRevisionId (p. 411)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

Type: String

412

Page 419: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAddPermission

Required: NoSourceAccount (p. 411)

This parameter is used for S3 and SES. The AWS account ID (without a hyphen) of the source owner.For example, if the SourceArn identifies a bucket, then this is the bucket owner's account ID. Youcan use this additional condition to ensure the bucket you specify is owned by a specific account (it ispossible the bucket owner deleted the bucket and some other AWS account created the bucket). Youcan also use this condition to specify all sources (that is, you don't specify the SourceArn) owned by aspecific account.

Type: String

Pattern: \d{12}

Required: NoSourceArn (p. 411)

This is optional; however, when granting permission to invoke your function, you should specify thisfield with the Amazon Resource Name (ARN) as its value. This ensures that only events generatedfrom the specified source can invoke the function.

Important

If you add a permission without providing the source ARN, any AWS account that creates amapping to your function ARN can send events to invoke your Lambda function.

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)

Required: NoStatementId (p. 411)

A unique statement identifier.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 100.

Pattern: ([a-zA-Z0-9-_]+)

Required: Yes

Response Syntax

HTTP/1.1 201Content-type: application/json

{ "Statement": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 201 response.

The following data is returned in JSON format by the service.

413

Page 420: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAddPermission

Statement (p. 413)

The permission statement you specified in the request. The response returns the same as a stringusing a backslash ("\") as an escape character in the JSON.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PolicyLengthExceededException

Lambda function access policy is limited to 20 KB.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go

414

Page 422: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateAlias

CreateAliasCreates an alias that points to the specified Lambda function version. For more information, seeIntroduction to AWS Lambda Aliases.

Alias names are unique for a given function. This requires permission for the lambda:CreateAlias action.

Request Syntax

POST /2015-03-31/functions/FunctionName/aliases HTTP/1.1Content-type: application/json

{ "Description": "string", "FunctionVersion": "string", "Name": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } }}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 416)

Name of the Lambda function for which you want to create an alias. Note that the length constraintapplies only to the ARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following data in JSON format.

Description (p. 416)

Description of the alias.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoFunctionVersion (p. 416)

Lambda function version for which you are creating the alias.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

416

Page 423: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateAlias

Pattern: (\$LATEST|[0-9]+)

Required: YesName (p. 416)

Name for the alias you are creating.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)

Required: YesRoutingConfig (p. 416)

Specifies an additional version your alias can point to, allowing you to dictate what percentage oftraffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: AliasRoutingConfiguration (p. 528) object

Required: No

Response Syntax

HTTP/1.1 201Content-type: application/json

{ "AliasArn": "string", "Description": "string", "FunctionVersion": "string", "Name": "string", "RevisionId": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } }}

Response ElementsIf the action is successful, the service sends back an HTTP 201 response.

The following data is returned in JSON format by the service.

AliasArn (p. 417)

Lambda function ARN that is qualified using the alias name as the suffix. For example, if you createan alias called BETA that points to a helloworld function version, the ARN is arn:aws:lambda:aws-regions:acct-id:function:helloworld:BETA.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

417

Page 424: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateAlias

Description (p. 417)

Alias description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.FunctionVersion (p. 417)

Function version to which the alias points.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)Name (p. 417)

Alias name.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)RevisionId (p. 417)

Represents the latest updated revision of the function or alias.

Type: StringRoutingConfig (p. 417)

Specifies an additional function versions the alias points to, allowing you to dictate what percentageof traffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: AliasRoutingConfiguration (p. 528) object

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404

418

Page 425: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateAlias

ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

419

Page 426: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateEventSourceMapping

CreateEventSourceMappingIdentifies a stream as an event source for a Lambda function. It can be either an Amazon Kinesis stream oran Amazon DynamoDB stream. AWS Lambda invokes the specified function when records are posted tothe stream.

This association between a stream source and a Lambda function is called the event source mapping.

You provide mapping information (for example, which stream to read from and which Lambda function toinvoke) in the request body.

Each event source, such as an Amazon Kinesis or a DynamoDB stream, can be associated with multipleAWS Lambda functions. A given Lambda function can be associated with multiple AWS event sources.

If you are using versioning, you can specify a specific function version or an alias via the function nameparameter. For more information about versioning, see AWS Lambda Function Versioning and Aliases.

This operation requires permission for the lambda:CreateEventSourceMapping action.

Request SyntaxPOST /2015-03-31/event-source-mappings/ HTTP/1.1Content-type: application/json

{ "BatchSize": number, "Enabled": boolean, "EventSourceArn": "string", "FunctionName": "string", "StartingPosition": "string", "StartingPositionTimestamp": number}

URI Request ParametersThe request does not use any URI parameters.

Request BodyThe request accepts the following data in JSON format.

BatchSize (p. 420)

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records. The default is 100records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.

Required: NoEnabled (p. 420)

Indicates whether AWS Lambda should begin polling the event source. By default, Enabled is true.

Type: Boolean

Required: No

420

Page 427: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateEventSourceMapping

EventSourceArn (p. 420)

The Amazon Resource Name (ARN) of the Amazon Kinesis or the Amazon DynamoDB stream that isthe event source. Any record added to this stream could cause AWS Lambda to invoke your Lambdafunction, it depends on the BatchSize. AWS Lambda POSTs the Amazon Kinesis event, containingrecords, to your Lambda function as JSON.

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)

Required: YesFunctionName (p. 420)

The Lambda function to invoke when AWS Lambda detects an event on the stream.

You can specify the function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail).

If you are using versioning, you can also provide a qualified function ARN (ARN that is qualified withfunction version or alias name as suffix). For more information about versioning, see AWS LambdaFunction Versioning and Aliases

AWS Lambda also allows you to specify only the function name with the account ID qualifier (forexample, account-id:Thumbnail).

Note that the length constraint applies only to the ARN. If you specify only the function name, it islimited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: YesStartingPosition (p. 420)

The position in the DynamoDB or Kinesis stream where AWS Lambda should start reading. For moreinformation, see GetShardIterator in the Amazon Kinesis API Reference Guide or GetShardIterator inthe Amazon DynamoDB API Reference Guide. The AT_TIMESTAMP value is supported only for Kinesisstreams.

Type: String

Valid Values: TRIM_HORIZON | LATEST | AT_TIMESTAMP

Required: YesStartingPositionTimestamp (p. 420)

The timestamp of the data record from which to start reading. Used with shard iterator typeAT_TIMESTAMP. If a record with this exact timestamp does not exist, the iterator returned is for thenext (later) record. If the timestamp is older than the current trim horizon, the iterator returned is for theoldest untrimmed data record (TRIM_HORIZON). Valid only for Kinesis streams.

Type: Timestamp

Required: No

421

Page 428: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateEventSourceMapping

Response SyntaxHTTP/1.1 202Content-type: application/json

{ "BatchSize": number, "EventSourceArn": "string", "FunctionArn": "string", "LastModified": number, "LastProcessingResult": "string", "State": "string", "StateTransitionReason": "string", "UUID": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 202 response.

The following data is returned in JSON format by the service.

BatchSize (p. 422)

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.EventSourceArn (p. 422)

The Amazon Resource Name (ARN) of the Amazon Kinesis stream that is the source of events.

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)FunctionArn (p. 422)

The Lambda function to invoke when AWS Lambda detects an event on the stream.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

LastModified (p. 422)

The UTC time string indicating the last time the event mapping was updated.

Type: TimestampLastProcessingResult (p. 422)

The result of the last AWS Lambda invocation of your Lambda function.

Type: StringState (p. 422)

The state of the event source mapping. It can be Creating, Enabled, Disabled, Enabling,Disabling, Updating, or Deleting.

422

Page 429: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateEventSourceMapping

Type: StringStateTransitionReason (p. 422)

The reason the event source mapping is in its current state. It is either user-requested or an AWSLambda-initiated state transition.

Type: StringUUID (p. 422)

The AWS Lambda assigned opaque identifier for the mapping.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3

423

Page 430: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateEventSourceMapping

• AWS SDK for Python• AWS SDK for Ruby V2

424

Page 431: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

CreateFunctionCreates a new Lambda function. The function metadata is created from the request parameters, and thecode for the function is provided by a .zip file in the request body. If the function name already exists, theoperation will fail. Note that the function name is case-sensitive.

If you are using versioning, you can also publish a version of the Lambda function you are creating usingthe Publish parameter. For more information about versioning, see AWS Lambda Function Versioningand Aliases.

This operation requires permission for the lambda:CreateFunction action.

Request SyntaxPOST /2015-03-31/functions HTTP/1.1Content-type: application/json

{ "Code": { "S3Bucket": "string", "S3Key": "string", "S3ObjectVersion": "string", "ZipFile": blob }, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Variables": { "string" : "string" } }, "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "MemorySize": number, "Publish": boolean, "Role": "string", "Runtime": "string", "Tags": { "string" : "string" }, "Timeout": number, "TracingConfig": { "Mode": "string" }, "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ] }}

URI Request ParametersThe request does not use any URI parameters.

Request BodyThe request accepts the following data in JSON format.

425

Page 432: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

Code (p. 425)

The code for the Lambda function.

Type: FunctionCode (p. 536) object

Required: YesDeadLetterConfig (p. 425)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) object

Required: NoDescription (p. 425)

A short, user-defined function description. Lambda does not use this value. Assign a meaningfuldescription as you see fit.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoEnvironment (p. 425)

The parent object that contains your environment's configuration settings.

Type: Environment (p. 531) object

Required: NoFunctionName (p. 425)

The name you want to assign to the function you are uploading. The function names appear in theconsole and are returned in the ListFunctions (p. 477) API. Function names are used to specifyfunctions to other AWS Lambda API operations, such as Invoke (p. 463). Note that the lengthconstraint applies only to the ARN. If you specify only the function name, it is limited to 64 characters inlength.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: YesHandler (p. 425)

The function within your code that Lambda calls to begin execution. For Node.js, it is the module-name.export value in your function. For Java, it can be package.class-name::handler orpackage.class-name. For more information, see Lambda Function Handler (Java).

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+

Required: Yes

426

Page 433: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

KMSKeyArn (p. 425)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If not provided, AWS Lambda will use a default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()

Required: NoMemorySize (p. 425)

The amount of memory, in MB, your Lambda function is given. Lambda uses this memory size toinfer the amount of CPU and memory allocated to your function. Your function use-case determinesyour CPU and memory requirements. For example, a database operation might need less memorycompared to an image processing function. The default value is 128 MB. The value must be a multipleof 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.

Required: NoPublish (p. 425)

This boolean parameter can be used to request AWS Lambda to create the Lambda function andpublish a version as an atomic operation.

Type: Boolean

Required: NoRole (p. 425)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources. For more information, see AWSLambda: How it Works.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+

Required: YesRuntime (p. 425)

The runtime environment for the Lambda function you are uploading.

To use the Python runtime v3.6, set the value to "python3.6". To use the Python runtime v2.7, set thevalue to "python2.7". To use the Node.js runtime v8.10, set the value to "nodejs8.10". To use Node.jsruntime version v6.10, set the value to "nodejs6.10". To use Node.js runtime version v4.3, set the valueto "nodejs4.3". To use the .NET Core runtime v1.0, set the value to "dotnetcore1.0". To use the .NETCore runtime v2.0, set the value to "dotnetcore2.0".

Note

Node v0.10.42 is currently marked as deprecated. You must migrate existing functions tothe newer Node.js runtime versions available on AWS Lambda (nodejs8.10, nodejs6.10or nodejs4.3) as soon as possible. Failure to do so will result in an invalid parameter errorbeing returned. Note that you will have to follow this procedure for each region that containsfunctions written in the Node v0.10.42 runtime.

Type: String

427

Page 434: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Required: YesTags (p. 425)

The list of tags (key-value pairs) assigned to the new function. For more information, see TaggingLambda Functions in the AWS Lambda Developer Guide.

Type: String to string map

Required: NoTimeout (p. 425)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.

Required: NoTracingConfig (p. 425)

The parent object that contains your function's tracing settings.

Type: TracingConfig (p. 542) object

Required: NoVpcConfig (p. 425)

If your Lambda function accesses resources in a VPC, you provide this parameter identifying the listof security group IDs and subnet IDs. These must belong to the same VPC. You must provide at leastone security group and one subnet ID.

Type: VpcConfig (p. 544) object

Required: No

Response SyntaxHTTP/1.1 201Content-type: application/json

{ "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string"

428

Page 435: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

} }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 201 response.

The following data is returned in JSON format by the service.

CodeSha256 (p. 428)

It is the SHA256 hash of your function deployment package.

Type: StringCodeSize (p. 428)

The size, in bytes, of the function .zip file you uploaded.

Type: LongDeadLetterConfig (p. 428)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) objectDescription (p. 428)

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.Environment (p. 428)

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) objectFunctionArn (p. 428)

The Amazon Resource Name (ARN) assigned to the function.

429

Page 436: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionName (p. 428)

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Handler (p. 428)

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+KMSKeyArn (p. 428)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()LastModified (p. 428)

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

Type: StringMasterArn (p. 428)

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

MemorySize (p. 428)

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.RevisionId (p. 428)

Represents the latest updated revision of the function or alias.

Type: String

430

Page 437: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

Role (p. 428)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+Runtime (p. 428)

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Timeout (p. 428)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.TracingConfig (p. 428)

The parent object that contains your function's tracing settings.

Type: TracingConfigResponse (p. 543) objectVersion (p. 428)

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)VpcConfig (p. 428)

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

ErrorsCodeStorageExceededException

You have exceeded your maximum total code size per account. Limits

HTTP Status Code: 400InvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400

431

Page 438: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドCreateFunction

ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

432

Page 439: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteAlias

DeleteAliasDeletes the specified Lambda function alias. For more information, see Introduction to AWS LambdaAliases.

This requires permission for the lambda:DeleteAlias action.

Request SyntaxDELETE /2015-03-31/functions/FunctionName/aliases/Name HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 433)

The Lambda function name for which the alias is created. Deleting an alias does not delete the functionversion to which it is pointing. Note that the length constraint applies only to the ARN. If you specifyonly the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Name (p. 433)

Name of the alias to delete.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400

433

Page 440: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteAlias

ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

434

Page 441: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteEventSourceMapping

DeleteEventSourceMappingRemoves an event source mapping. This means AWS Lambda will no longer invoke the function for eventsin the associated source.

This operation requires permission for the lambda:DeleteEventSourceMapping action.

Request SyntaxDELETE /2015-03-31/event-source-mappings/UUID HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

UUID (p. 435)

The event source mapping ID.

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 202Content-type: application/json

{ "BatchSize": number, "EventSourceArn": "string", "FunctionArn": "string", "LastModified": number, "LastProcessingResult": "string", "State": "string", "StateTransitionReason": "string", "UUID": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 202 response.

The following data is returned in JSON format by the service.

BatchSize (p. 435)

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.EventSourceArn (p. 435)

The Amazon Resource Name (ARN) of the Amazon Kinesis stream that is the source of events.

435

Page 442: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteEventSourceMapping

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)FunctionArn (p. 435)

The Lambda function to invoke when AWS Lambda detects an event on the stream.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

LastModified (p. 435)

The UTC time string indicating the last time the event mapping was updated.

Type: TimestampLastProcessingResult (p. 435)

The result of the last AWS Lambda invocation of your Lambda function.

Type: StringState (p. 435)

The state of the event source mapping. It can be Creating, Enabled, Disabled, Enabling,Disabling, Updating, or Deleting.

Type: StringStateTransitionReason (p. 435)

The reason the event source mapping is in its current state. It is either user-requested or an AWSLambda-initiated state transition.

Type: StringUUID (p. 435)

The AWS Lambda assigned opaque identifier for the mapping.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

436

Page 444: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteFunction

DeleteFunctionDeletes the specified Lambda function code and configuration.

If you are using the versioning feature and you don't specify a function version in your DeleteFunctionrequest, AWS Lambda will delete the function, including all its versions, and any aliases pointing to thefunction versions. To delete a specific function version, you must provide the function version via theQualifier parameter. For information about function versioning, see AWS Lambda Function Versioningand Aliases.

When you delete a function the associated resource policy is also deleted. You will need to delete the eventsource mappings explicitly.

This operation requires permission for the lambda:DeleteFunction action.

Request SyntaxDELETE /2015-03-31/functions/FunctionName?Qualifier=Qualifier HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 438)

The Lambda function to delete.

You can specify the function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). If you are using versioning, you can also provide a qualified functionARN (ARN that is qualified with function version or alias name as suffix). AWS Lambda alsoallows you to specify only the function name with the account ID qualifier (for example, account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify only thefunction name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 438)

Using this optional parameter you can specify a function version (but not the $LATEST version) todirect AWS Lambda to delete a specific function version. If the function version has one or morealiases pointing to it, you will get an error because you cannot have aliases pointing to it. You candelete any function version but not the $LATEST, that is, you cannot specify $LATEST as the valueof this parameter. The $LATEST version can be deleted only when you want to delete all the functionversions and aliases.

You can only specify a function version, not an alias name, using this parameter. You cannot delete afunction version using its alias.

If you don't specify this parameter, AWS Lambda will delete the function, including all of its versionsand aliases.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

438

Page 445: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteFunction

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3

439

Page 446: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteFunction

• AWS SDK for Python• AWS SDK for Ruby V2

440

Page 447: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeleteFunctionConcurrency

DeleteFunctionConcurrencyRemoves concurrent execution limits from this function. For more information, see 同時実行数の管理 (p. 387).

Request SyntaxDELETE /2017-10-31/functions/FunctionName/concurrency HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 441)

The name of the function you are removing concurrent execution limits from. For more information, see同時実行数の管理 (p. 387).

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

441

Page 449: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetAccountSettings

GetAccountSettingsReturns a customer's account settings.

You can use this operation to retrieve Lambda limits information, such as code size and concurrency limits.For more information about limits, see AWS Lambda Limits. You can also retrieve resource usage statistics,such as code storage usage and function count.

Request Syntax

GET /2016-08-19/account-settings/ HTTP/1.1

URI Request ParametersThe request does not use any URI parameters.

Request BodyThe request does not have a request body.

Response Syntax

HTTP/1.1 200Content-type: application/json

{ "AccountLimit": { "CodeSizeUnzipped": number, "CodeSizeZipped": number, "ConcurrentExecutions": number, "TotalCodeSize": number, "UnreservedConcurrentExecutions": number }, "AccountUsage": { "FunctionCount": number, "TotalCodeSize": number }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

AccountLimit (p. 443)

Provides limits of code size and concurrency associated with the current account and region.

Type: AccountLimit (p. 523) objectAccountUsage (p. 443)

Provides code size usage and function count associated with the current account and region.

Type: AccountUsage (p. 525) object

443

Page 450: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetAccountSettings

ErrorsServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

444

Page 451: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetAlias

GetAliasReturns the specified alias information such as the alias ARN, description, and function version it is pointingto. For more information, see Introduction to AWS Lambda Aliases.

This requires permission for the lambda:GetAlias action.

Request Syntax

GET /2015-03-31/functions/FunctionName/aliases/Name HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 445)

Function name for which the alias is created. An alias is a subresource that exists only in the contextof an existing Lambda function so you must specify the function name. Note that the length constraintapplies only to the ARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Name (p. 445)

Name of the alias for which you want to retrieve information.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)

Request BodyThe request does not have a request body.

Response Syntax

HTTP/1.1 200Content-type: application/json

{ "AliasArn": "string", "Description": "string", "FunctionVersion": "string", "Name": "string", "RevisionId": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } }}

445

Page 452: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetAlias

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

AliasArn (p. 445)

Lambda function ARN that is qualified using the alias name as the suffix. For example, if you createan alias called BETA that points to a helloworld function version, the ARN is arn:aws:lambda:aws-regions:acct-id:function:helloworld:BETA.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Description (p. 445)

Alias description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.FunctionVersion (p. 445)

Function version to which the alias points.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)Name (p. 445)

Alias name.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)RevisionId (p. 445)

Represents the latest updated revision of the function or alias.

Type: StringRoutingConfig (p. 445)

Specifies an additional function versions the alias points to, allowing you to dictate what percentageof traffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: AliasRoutingConfiguration (p. 528) object

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

446

Page 453: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetAlias

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

447

Page 454: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetEventSourceMapping

GetEventSourceMappingReturns configuration information for the specified event source mapping (seeCreateEventSourceMapping (p. 420)).

This operation requires permission for the lambda:GetEventSourceMapping action.

Request SyntaxGET /2015-03-31/event-source-mappings/UUID HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

UUID (p. 448)

The AWS Lambda assigned ID of the event source mapping.

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "BatchSize": number, "EventSourceArn": "string", "FunctionArn": "string", "LastModified": number, "LastProcessingResult": "string", "State": "string", "StateTransitionReason": "string", "UUID": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

BatchSize (p. 448)

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.EventSourceArn (p. 448)

The Amazon Resource Name (ARN) of the Amazon Kinesis stream that is the source of events.

448

Page 455: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetEventSourceMapping

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)FunctionArn (p. 448)

The Lambda function to invoke when AWS Lambda detects an event on the stream.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

LastModified (p. 448)

The UTC time string indicating the last time the event mapping was updated.

Type: TimestampLastProcessingResult (p. 448)

The result of the last AWS Lambda invocation of your Lambda function.

Type: StringState (p. 448)

The state of the event source mapping. It can be Creating, Enabled, Disabled, Enabling,Disabling, Updating, or Deleting.

Type: StringStateTransitionReason (p. 448)

The reason the event source mapping is in its current state. It is either user-requested or an AWSLambda-initiated state transition.

Type: StringUUID (p. 448)

The AWS Lambda assigned opaque identifier for the mapping.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

449

Page 457: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunction

GetFunctionReturns the configuration information of the Lambda function and a presigned URL link to the .zip file youuploaded with CreateFunction (p. 425) so you can download the .zip file. Note that the URL is valid for upto 10 minutes. The configuration information is the same information you provided as parameters whenuploading the function.

Using the optional Qualifier parameter, you can specify a specific function version for which you wantthis information. If you don't specify this parameter, the API uses unqualified function ARN which returninformation about the $LATEST version of the Lambda function. For more information, see AWS LambdaFunction Versioning and Aliases.

This operation requires permission for the lambda:GetFunction action.

Request SyntaxGET /2015-03-31/functions/FunctionName?Qualifier=Qualifier HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 451)

The Lambda function name.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 451)

Use this optional parameter to specify a function version or an alias name. If you specify functionversion, the API uses qualified function ARN for the request and returns information about the specificLambda function version. If you specify an alias name, the API uses the alias ARN and returnsinformation about the function version to which the alias points. If you don't provide this parameter, theAPI uses unqualified function ARN and returns information about the $LATEST version of the Lambdafunction.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200

451

Page 458: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunction

Content-type: application/json

{ "Code": { "Location": "string", "RepositoryType": "string" }, "Concurrency": { "ReservedConcurrentExecutions": number }, "Configuration": { "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" } }, "Tags": { "string" : "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

Code (p. 451)

The object for the Lambda function location.

Type: FunctionCodeLocation (p. 537) object

452

Page 459: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunction

Concurrency (p. 451)

The concurrent execution limit set for this function. For more information, see 同時実行数の管理 (p. 387).

Type: Concurrency (p. 529) objectConfiguration (p. 451)

A complex type that describes function metadata.

Type: FunctionConfiguration (p. 538) objectTags (p. 451)

Returns the list of tags associated with the function. For more information, see Tagging LambdaFunctions in the AWS Lambda Developer Guide.

Type: String to string map

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python

453

Page 460: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunction

• AWS SDK for Ruby V2

454

Page 461: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunctionConfiguration

GetFunctionConfigurationReturns the configuration information of the Lambda function. This the same information you provided asparameters when uploading the function by using CreateFunction (p. 425).

If you are using the versioning feature, you can retrieve this information for a specific function versionby using the optional Qualifier parameter and specifying the function version or alias that points to it.If you don't provide it, the API returns information about the $LATEST version of the function. For moreinformation about versioning, see AWS Lambda Function Versioning and Aliases.

This operation requires permission for the lambda:GetFunctionConfiguration operation.

Request SyntaxGET /2015-03-31/functions/FunctionName/configuration?Qualifier=Qualifier HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 455)

The name of the Lambda function for which you want to retrieve the configuration information.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 455)

Using this optional parameter you can specify a function version or an alias name. If you specifyfunction version, the API uses qualified function ARN and returns information about the specificfunction version. If you specify an alias name, the API uses the alias ARN and returns informationabout the function version to which the alias points.

If you don't specify this parameter, the API uses unqualified function ARN, and returns informationabout the $LATEST function version.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200

455

Page 462: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunctionConfiguration

Content-type: application/json

{ "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

CodeSha256 (p. 455)

It is the SHA256 hash of your function deployment package.

Type: StringCodeSize (p. 455)

The size, in bytes, of the function .zip file you uploaded.

Type: LongDeadLetterConfig (p. 455)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) object

456

Page 463: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunctionConfiguration

Description (p. 455)

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.Environment (p. 455)

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) objectFunctionArn (p. 455)

The Amazon Resource Name (ARN) assigned to the function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionName (p. 455)

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Handler (p. 455)

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+KMSKeyArn (p. 455)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()LastModified (p. 455)

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

Type: StringMasterArn (p. 455)

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

457

Page 464: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunctionConfiguration

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

MemorySize (p. 455)

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.RevisionId (p. 455)

Represents the latest updated revision of the function or alias.

Type: StringRole (p. 455)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+Runtime (p. 455)

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Timeout (p. 455)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.TracingConfig (p. 455)

The parent object that contains your function's tracing settings.

Type: TracingConfigResponse (p. 543) objectVersion (p. 455)

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)VpcConfig (p. 455)

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

458

Page 465: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetFunctionConfiguration

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

459

Page 466: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetPolicy

GetPolicyReturns the resource policy associated with the specified Lambda function.

If you are using the versioning feature, you can get the resource policy associated with the specific Lambdafunction version or alias by specifying the version or alias name using the Qualifier parameter. For moreinformation about versioning, see AWS Lambda Function Versioning and Aliases.

You need permission for the lambda:GetPolicy action.

Request SyntaxGET /2015-03-31/functions/FunctionName/policy?Qualifier=Qualifier HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 460)

Function name whose resource policy you want to retrieve.

You can specify the function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). If you are using versioning, you can also provide a qualified functionARN (ARN that is qualified with function version or alias name as suffix). AWS Lambda alsoallows you to specify only the function name with the account ID qualifier (for example, account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify only thefunction name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 460)

You can specify this optional query parameter to specify a function version or an alias name in whichcase this API will return all permissions associated with the specific qualified ARN. If you don't providethis parameter, the API will return permissions that apply to the unqualified function ARN.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "Policy": "string",

460

Page 467: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドGetPolicy

"RevisionId": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

Policy (p. 460)

The resource policy associated with the specified function. The response returns the same as a stringusing a backslash ("\") as an escape character in the JSON.

Type: StringRevisionId (p. 460)

Represents the latest updated revision of the function or alias.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java

461

Page 469: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvoke

InvokeInvokes a specific Lambda function. For an example, see Create the Lambda Function and Test ItManually.

If you are using the versioning feature, you can invoke the specific function version by providing functionversion or alias name that is pointing to the function version using the Qualifier parameter in therequest. If you don't provide the Qualifier parameter, the $LATEST version of the Lambda functionis invoked. Invocations occur at least once in response to an event and functions must be idempotentto handle this. For information about the versioning feature, see AWS Lambda Function Versioning andAliases.

This operation requires permission for the lambda:InvokeFunction action.Note

The TooManyRequestsException noted below will return the following:ConcurrentInvocationLimitExceeded will be returned if you have no functions withreserved concurrency and have exceeded your account concurrent limit or if a functionwithout reserved concurrency exceeds the account's unreserved concurrency limit.ReservedFunctionConcurrentInvocationLimitExceeded will be returned when a functionwith reserved concurrency exceeds its configured concurrency limit.

Request SyntaxPOST /2015-03-31/functions/FunctionName/invocations?Qualifier=Qualifier HTTP/1.1X-Amz-Invocation-Type: InvocationTypeX-Amz-Log-Type: LogTypeX-Amz-Client-Context: ClientContext

Payload

URI Request ParametersThe request requires the following URI parameters.

ClientContext (p. 463)

Using the ClientContext you can pass client-specific information to the Lambda function you areinvoking. You can then process the client information in your Lambda function as you choose throughthe context variable. For an example of a ClientContext JSON, see PutEvents in the AmazonMobile Analytics API Reference and User Guide.

The ClientContext JSON must be base64-encoded and has a maximum size of 3583 bytes.FunctionName (p. 463)

The Lambda function name.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

463

Page 470: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvoke

InvocationType (p. 463)

By default, this operation assumes a synchronous (RequestResponse) invocation type. If the Lambdafunction you invoke is expected to have a long-running execution time, your client may time out beforeexecution completes. To avoid this, update the client timeout. If you are invoking the Lambda functionvia an SDK, please refer to the SDK documentation at the end of this section to learn more aboutconfiguring the timeout for your specific runtime.

You can optionally request asynchronous execution by specifying Event as the InvocationType.You can also use this parameter to request AWS Lambda to not execute the function but do someverification, such as if the caller is authorized to invoke the function and if the inputs are valid. Yourequest this by specifying DryRun as the InvocationType. This is useful in a cross-account scenariowhen you want to verify access to a function without running it.

Valid Values: Event | RequestResponse | DryRunLogType (p. 463)

You can set this optional parameter to Tail in the request only if you specify the InvocationTypeparameter with value RequestResponse. In this case, AWS Lambda returns the base64-encoded last4 KB of log data produced by your Lambda function in the x-amz-log-result header.

Valid Values: None | TailQualifier (p. 463)

You can use this optional parameter to specify a Lambda function version or alias name. If you specifya function version, the API uses the qualified function ARN to invoke a specific Lambda function. If youspecify an alias name, the API uses the alias ARN to invoke the Lambda function version to which thealias points.

If you don't provide this parameter, then the API uses unqualified function ARN which results ininvocation of the $LATEST version.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)

Request BodyThe request accepts the following binary data.

Payload (p. 463)

JSON that you want to provide to your Lambda function as input.

Response SyntaxHTTP/1.1 StatusCodeX-Amz-Function-Error: FunctionErrorX-Amz-Log-Result: LogResultX-Amz-Executed-Version: ExecutedVersion

Payload

Response ElementsIf the action is successful, the service sends back the following HTTP response.

464

Page 471: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvoke

StatusCode (p. 464)

The HTTP status code will be in the 200 range for successful request. For the RequestResponseinvocation type this status code will be 200. For the Event invocation type this status code will be 202.For the DryRun invocation type the status code will be 204.

The response returns the following HTTP headers.

ExecutedVersion (p. 464)

The function version that has been executed. This value is returned only if the invocation type isRequestResponse. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)FunctionError (p. 464)

Indicates whether an error occurred while executing the Lambda function. If an error occurred this fieldwill have one of two values; Handled or Unhandled. Handled errors are errors that are reported bythe function while the Unhandled errors are those detected and reported by AWS Lambda. Unhandlederrors include out of memory errors and function timeouts. For information about how to report anHandled error, see Programming Model.

LogResult (p. 464)

It is the base64-encoded logs for the Lambda function invocation. This is present only if the invocationtype is RequestResponse and the logs were requested.

The response returns the following as the HTTP body.

Payload (p. 464)

It is the JSON representation of the object returned by the Lambda function. This is present only if theinvocation type is RequestResponse.

In the event of a function error this field contains a message describing the error. For the Handlederrors the Lambda function will report this message. For Unhandled errors AWS Lambda reports themessage.

ErrorsEC2AccessDeniedException

HTTP Status Code: 502EC2ThrottledException

AWS Lambda was throttled by Amazon EC2 during Lambda function initialization using the executionrole provided for the Lambda function.

HTTP Status Code: 502EC2UnexpectedException

AWS Lambda received an unexpected EC2 client exception while setting up for the Lambda function.

HTTP Status Code: 502

465

Page 472: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvoke

ENILimitReachedException

AWS Lambda was not able to create an Elastic Network Interface (ENI) in the VPC, specified as part ofLambda function configuration, because the limit for network interfaces has been reached.

HTTP Status Code: 502InvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400InvalidRequestContentException

The request body could not be parsed as JSON.

HTTP Status Code: 400InvalidRuntimeException

The runtime or runtime version specified is not supported.

HTTP Status Code: 502InvalidSecurityGroupIDException

The Security Group ID provided in the Lambda function VPC configuration is invalid.

HTTP Status Code: 502InvalidSubnetIDException

The Subnet ID provided in the Lambda function VPC configuration is invalid.

HTTP Status Code: 502InvalidZipFileException

AWS Lambda could not unzip the function zip file.

HTTP Status Code: 502KMSAccessDeniedException

Lambda was unable to decrypt the environment variables because KMS access was denied. Check theLambda function's KMS permissions.

HTTP Status Code: 502KMSDisabledException

Lambda was unable to decrypt the environment variables because the KMS key used is disabled.Check the Lambda function's KMS key settings.

HTTP Status Code: 502KMSInvalidStateException

Lambda was unable to decrypt the environment variables because the KMS key used is in an invalidstate for Decrypt. Check the function's KMS key settings.

HTTP Status Code: 502KMSNotFoundException

Lambda was unable to decrypt the environment variables because the KMS key was not found. Checkthe function's KMS key settings.

466

Page 473: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvoke

HTTP Status Code: 502RequestTooLargeException

The request payload exceeded the Invoke request body JSON input limit. For more information, seeLimits.

HTTP Status Code: 413ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500SubnetIPAddressLimitReachedException

AWS Lambda was not able to set up VPC access for the Lambda function because one or moreconfigured subnets has no available IP addresses.

HTTP Status Code: 502TooManyRequestsException

HTTP Status Code: 429UnsupportedMediaTypeException

The content type of the Invoke request body is not JSON.

HTTP Status Code: 415

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

467

Page 474: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvokeAsync

InvokeAsyncImportant

This API is deprecated. We recommend you use Invoke API (see Invoke (p. 463)).

Submits an invocation request to AWS Lambda. Upon receiving the request, Lambda executes thespecified function asynchronously. To see the logs generated by the Lambda function execution, see theCloudWatch Logs console.

This operation requires permission for the lambda:InvokeFunction action.

Request Syntax

POST /2014-11-13/functions/FunctionName/invoke-async/ HTTP/1.1

InvokeArgs

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 468)

The Lambda function name. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following binary data.

InvokeArgs (p. 468)

JSON that you want to provide to your Lambda function as input.

Response Syntax

HTTP/1.1 Status

Response ElementsIf the action is successful, the service sends back the following HTTP response.

Status (p. 468)

It will be 202 upon success.

468

Page 475: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドInvokeAsync

ErrorsInvalidRequestContentException

The request body could not be parsed as JSON.

HTTP Status Code: 400InvalidRuntimeException

The runtime or runtime version specified is not supported.

HTTP Status Code: 502ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500

ExampleInvoke a Lambda function

The following example uses a POST request to invoke a Lambda function.

Sample Request

POST /2014-11-13/functions/helloworld/invoke-async/ HTTP/1.1[input json]

Sample Response

HTTP/1.1 202 Accepted x-amzn-requestid: f037bc5c-5a08-11e4-b02e-af446c3f9d0dcontent-length: 0connection: keep-alivedate: Wed, 22 Oct 2014 16:31:55 GMTcontent-type: application/json

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java

469

Page 477: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListAliases

ListAliasesReturns list of aliases created for a Lambda function. For each alias, the response includes informationsuch as the alias ARN, description, alias name, and the function version to which it points. For moreinformation, see Introduction to AWS Lambda Aliases.

This requires permission for the lambda:ListAliases action.

Request Syntax

GET /2015-03-31/functions/FunctionName/aliases?FunctionVersion=FunctionVersion&Marker=Marker&MaxItems=MaxItems HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 471)

Lambda function name for which the alias is created. Note that the length constraint applies only to theARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionVersion (p. 471)

If you specify this optional parameter, the API returns only the aliases that are pointing to the specificLambda function version, otherwise the API returns all of the aliases created for the Lambda function.

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)Marker (p. 471)

Optional string. An opaque pagination token returned from a previous ListAliases operation. Ifpresent, indicates where to continue the listing.

MaxItems (p. 471)

Optional integer. Specifies the maximum number of aliases to return in response. This parameter valuemust be greater than 0.

Valid Range: Minimum value of 1. Maximum value of 10000.

Request BodyThe request does not have a request body.

Response Syntax

HTTP/1.1 200Content-type: application/json

471

Page 478: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListAliases

{ "Aliases": [ { "AliasArn": "string", "Description": "string", "FunctionVersion": "string", "Name": "string", "RevisionId": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } } } ], "NextMarker": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

Aliases (p. 471)

A list of aliases.

Type: Array of AliasConfiguration (p. 526) objectsNextMarker (p. 471)

A string, present if there are more aliases.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

472

Page 480: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListEventSourceMappings

ListEventSourceMappingsReturns a list of event source mappings you created using the CreateEventSourceMapping (seeCreateEventSourceMapping (p. 420)).

For each mapping, the API returns configuration information. You can optionally specify filters to retrievespecific event source mappings.

If you are using the versioning feature, you can get list of event source mappings for a specific Lambdafunction version or an alias as described in the FunctionName parameter. For information about theversioning feature, see AWS Lambda Function Versioning and Aliases.

This operation requires permission for the lambda:ListEventSourceMappings action.

Request Syntax

GET /2015-03-31/event-source-mappings/?EventSourceArn=EventSourceArn&FunctionName=FunctionName&Marker=Marker&MaxItems=MaxItems HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

EventSourceArn (p. 474)

The Amazon Resource Name (ARN) of the Amazon Kinesis stream. (This parameter is optional.)

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)FunctionName (p. 474)

The name of the Lambda function.

You can specify the function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). If you are using versioning, you can also provide a qualified functionARN (ARN that is qualified with function version or alias name as suffix). AWS Lambda alsoallows you to specify only the function name with the account ID qualifier (for example, account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify only thefunction name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Marker (p. 474)

Optional string. An opaque pagination token returned from a previous ListEventSourceMappingsoperation. If present, specifies to continue the list from where the returning call left off.

MaxItems (p. 474)

Optional integer. Specifies the maximum number of event sources to return in response. This valuemust be greater than 0.

Valid Range: Minimum value of 1. Maximum value of 10000.

474

Page 481: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListEventSourceMappings

Request BodyThe request does not have a request body.

Response Syntax

HTTP/1.1 200Content-type: application/json

{ "EventSourceMappings": [ { "BatchSize": number, "EventSourceArn": "string", "FunctionArn": "string", "LastModified": number, "LastProcessingResult": "string", "State": "string", "StateTransitionReason": "string", "UUID": "string" } ], "NextMarker": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

EventSourceMappings (p. 475)

An array of EventSourceMappingConfiguration objects.

Type: Array of EventSourceMappingConfiguration (p. 534) objectsNextMarker (p. 475)

A string, present if there are more event source mappings.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404

475

Page 482: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListEventSourceMappings

ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

476

Page 483: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListFunctions

ListFunctionsReturns a list of your Lambda functions. For each function, the response includes the function configurationinformation. You must use GetFunction (p. 451) to retrieve the code for your function.

This operation requires permission for the lambda:ListFunctions action.

If you are using the versioning feature, you can list all of your functions or only $LATEST versions. Forinformation about the versioning feature, see AWS Lambda Function Versioning and Aliases.

Request SyntaxGET /2015-03-31/functions/?FunctionVersion=FunctionVersion&Marker=Marker&MasterRegion=MasterRegion&MaxItems=MaxItems HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionVersion (p. 477)

Optional string. If not specified, only the unqualified functions ARNs (Amazon Resource Names) will bereturned.

Valid value:

ALL: Will return all versions, including $LATEST which will have fully qualified ARNs (AmazonResource Names).

Valid Values: ALLMarker (p. 477)

Optional string. An opaque pagination token returned from a previous ListFunctions operation. Ifpresent, indicates where to continue the listing.

MasterRegion (p. 477)

Optional string. If not specified, will return only regular function versions (i.e., non-replicated versions).

Valid values are:

The region from which the functions are replicated. For example, if you specify us-east-1, onlyfunctions replicated from that region will be returned.

ALL: Will return all functions from any region. If specified, you also must specify a validFunctionVersion parameter.

Pattern: ALL|[a-z]{2}(-gov)?-[a-z]+-\d{1}MaxItems (p. 477)

Optional integer. Specifies the maximum number of AWS Lambda functions to return in response. Thisparameter value must be greater than 0.

Valid Range: Minimum value of 1. Maximum value of 10000.

Request BodyThe request does not have a request body.

477

Page 484: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListFunctions

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "Functions": [ { "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" } } ], "NextMarker": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

Functions (p. 478)

A list of Lambda functions.

Type: Array of FunctionConfiguration (p. 538) objectsNextMarker (p. 478)

A string, present if there are more functions.

478

Page 485: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListFunctions

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

479

Page 486: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListTags

ListTagsReturns a list of tags assigned to a function when supplied the function ARN (Amazon Resource Name).For more information on Tagging, see Tagging Lambda Functions in the AWS Lambda Developer Guide.

Request SyntaxGET /2017-03-31/tags/ARN HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

Resource (p. 480)

The ARN (Amazon Resource Name) of the function. For more information, see Tagging LambdaFunctions in the AWS Lambda Developer Guide.

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "Tags": { "string" : "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

Tags (p. 480)

The list of tags assigned to the function. For more information, see Tagging Lambda Functions in theAWS Lambda Developer Guide.

Type: String to string map

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

480

Page 487: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListTags

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

481

Page 488: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListVersionsByFunction

ListVersionsByFunctionList all versions of a function. For information about the versioning feature, see AWS Lambda FunctionVersioning and Aliases.

Request SyntaxGET /2015-03-31/functions/FunctionName/versions?Marker=Marker&MaxItems=MaxItems HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 482)

Function name whose versions to list. You can specify a function name (for example, Thumbnail) oryou can specify Amazon Resource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partialARN (for example, account-id:Thumbnail). Note that the length constraint applies only to theARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Marker (p. 482)

Optional string. An opaque pagination token returned from a previous ListVersionsByFunctionoperation. If present, indicates where to continue the listing.

MaxItems (p. 482)

Optional integer. Specifies the maximum number of AWS Lambda function versions to return inresponse. This parameter value must be greater than 0.

Valid Range: Minimum value of 1. Maximum value of 10000.

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "NextMarker": "string", "Versions": [ { "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": {

482

Page 489: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListVersionsByFunction

"ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" } } ]}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

NextMarker (p. 482)

A string, present if there are more function versions.

Type: StringVersions (p. 482)

A list of Lambda function versions.

Type: Array of FunctionConfiguration (p. 538) objects

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

483

Page 490: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドListVersionsByFunction

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

484

Page 491: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPublishVersion

PublishVersionPublishes a version of your function from the current snapshot of $LATEST. That is, AWS Lambda takes asnapshot of the function code and configuration information from $LATEST and publishes a new version.The code and configuration cannot be modified after publication. For information about the versioningfeature, see AWS Lambda Function Versioning and Aliases.

Request SyntaxPOST /2015-03-31/functions/FunctionName/versions HTTP/1.1Content-type: application/json

{ "CodeSha256": "string", "Description": "string", "RevisionId": "string"}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 485)

The Lambda function name. You can specify a function name (for example, Thumbnail) or youcan specify Amazon Resource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partialARN (for example, account-id:Thumbnail). Note that the length constraint applies only to theARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following data in JSON format.

CodeSha256 (p. 485)

The SHA256 hash of the deployment package you want to publish. This provides validation onthe code you are publishing. If you provide this parameter, the value must match the SHA256of the $LATEST version for the publication to succeed. You can use the DryRun parameter ofUpdateFunctionCode (p. 508) to verify the hash value that will be returned before publishing yournew version.

Type: String

Required: NoDescription (p. 485)

The description for the version you are publishing. If not provided, AWS Lambda copies the descriptionfrom the $LATEST version.

Type: String

485

Page 492: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPublishVersion

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoRevisionId (p. 485)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

Type: String

Required: No

Response Syntax

HTTP/1.1 201Content-type: application/json

{ "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 201 response.

486

Page 493: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPublishVersion

The following data is returned in JSON format by the service.

CodeSha256 (p. 486)

It is the SHA256 hash of your function deployment package.

Type: StringCodeSize (p. 486)

The size, in bytes, of the function .zip file you uploaded.

Type: LongDeadLetterConfig (p. 486)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) objectDescription (p. 486)

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.Environment (p. 486)

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) objectFunctionArn (p. 486)

The Amazon Resource Name (ARN) assigned to the function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionName (p. 486)

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Handler (p. 486)

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+

487

Page 494: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPublishVersion

KMSKeyArn (p. 486)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()LastModified (p. 486)

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

Type: StringMasterArn (p. 486)

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

MemorySize (p. 486)

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.RevisionId (p. 486)

Represents the latest updated revision of the function or alias.

Type: StringRole (p. 486)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+Runtime (p. 486)

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Timeout (p. 486)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

488

Page 495: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPublishVersion

Valid Range: Minimum value of 1.TracingConfig (p. 486)

The parent object that contains your function's tracing settings.

Type: TracingConfigResponse (p. 543) objectVersion (p. 486)

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)VpcConfig (p. 486)

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

ErrorsCodeStorageExceededException

You have exceeded your maximum total code size per account. Limits

HTTP Status Code: 400InvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

489

Page 497: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPutFunctionConcurrency

PutFunctionConcurrencySets a limit on the number of concurrent executions available to this function. It is a subset of youraccount's total concurrent execution limit per region. Note that Lambda automatically reserves a buffer of100 concurrent executions for functions without any reserved concurrency limit. This means if your accountlimit is 1000, you have a total of 900 available to allocate to individual functions. For more information, see同時実行数の管理 (p. 387).

Request Syntax

PUT /2017-10-31/functions/FunctionName/concurrency HTTP/1.1Content-type: application/json

{ "ReservedConcurrentExecutions": number}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 491)

The name of the function you are setting concurrent execution limits on. For more information, see 同時実行数の管理 (p. 387).

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following data in JSON format.

ReservedConcurrentExecutions (p. 491)

The concurrent execution limit reserved for this function. For more information, see 同時実行数の管理 (p. 387).

Type: Integer

Valid Range: Minimum value of 0.

Required: Yes

Response Syntax

HTTP/1.1 200Content-type: application/json

{ "ReservedConcurrentExecutions": number}

491

Page 498: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドPutFunctionConcurrency

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

ReservedConcurrentExecutions (p. 491)

The number of concurrent executions reserved for this function. For more information, see 同時実行数の管理 (p. 387).

Type: Integer

Valid Range: Minimum value of 0.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

492

Page 499: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドRemovePermission

RemovePermissionYou can remove individual permissions from an resource policy associated with a Lambda function byproviding a statement ID that you provided when you added the permission.

If you are using versioning, the permissions you remove are specific to the Lambda function version or aliasyou specify in the AddPermission request via the Qualifier parameter. For more information aboutversioning, see AWS Lambda Function Versioning and Aliases.

Note that removal of a permission will cause an active event source to lose permission to the function.

You need permission for the lambda:RemovePermission action.

Request Syntax

DELETE /2015-03-31/functions/FunctionName/policy/StatementId?Qualifier=Qualifier&RevisionId=RevisionId HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 493)

Lambda function whose resource policy you want to remove a permission from.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Qualifier (p. 493)

You can specify this optional parameter to remove permission associated with a specific functionversion or function alias. If you don't specify this parameter, the API removes permission associatedwith the unqualified function ARN.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (|[a-zA-Z0-9$_-]+)RevisionId (p. 493)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

StatementId (p. 493)

Statement ID of the permission to remove.

Length Constraints: Minimum length of 1. Maximum length of 100.

493

Page 500: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドRemovePermission

Pattern: ([a-zA-Z0-9-_.]+)

Request BodyThe request does not have a request body.

Response SyntaxHTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go

494

Page 502: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドTagResource

TagResourceCreates a list of tags (key-value pairs) on the Lambda function. Requires the Lambda function ARN(Amazon Resource Name). If a key is specified without a value, Lambda creates a tag with the specifiedkey and a value of null. For more information, see Tagging Lambda Functions in the AWS LambdaDeveloper Guide.

Request Syntax

POST /2017-03-31/tags/ARN HTTP/1.1Content-type: application/json

{ "Tags": { "string" : "string" }}

URI Request ParametersThe request requires the following URI parameters.

Resource (p. 496)

The ARN (Amazon Resource Name) of the Lambda function. For more information, see TaggingLambda Functions in the AWS Lambda Developer Guide.

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following data in JSON format.

Tags (p. 496)

The list of tags (key-value pairs) you are assigning to the Lambda function. For more information, seeTagging Lambda Functions in the AWS Lambda Developer Guide.

Type: String to string map

Required: Yes

Response Syntax

HTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

496

Page 503: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドTagResource

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

497

Page 504: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUntagResource

UntagResourceRemoves tags from a Lambda function. Requires the function ARN (Amazon Resource Name). For moreinformation, see Tagging Lambda Functions in the AWS Lambda Developer Guide.

Request Syntax

DELETE /2017-03-31/tags/ARN?tagKeys=TagKeys HTTP/1.1

URI Request ParametersThe request requires the following URI parameters.

Resource (p. 498)

The ARN (Amazon Resource Name) of the function. For more information, see Tagging LambdaFunctions in the AWS Lambda Developer Guide.

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

TagKeys (p. 498)

The list of tag keys to be deleted from the function. For more information, see Tagging LambdaFunctions in the AWS Lambda Developer Guide.

Request BodyThe request does not have a request body.

Response Syntax

HTTP/1.1 204

Response ElementsIf the action is successful, the service sends back an HTTP 204 response with an empty HTTP body.

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404

498

Page 505: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUntagResource

ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

499

Page 506: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateAlias

UpdateAliasUsing this API you can update the function version to which the alias points and the alias description. Formore information, see Introduction to AWS Lambda Aliases.

This requires permission for the lambda:UpdateAlias action.

Request Syntax

PUT /2015-03-31/functions/FunctionName/aliases/Name HTTP/1.1Content-type: application/json

{ "Description": "string", "FunctionVersion": "string", "RevisionId": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } }}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 500)

The function name for which the alias is created. Note that the length constraint applies only to theARN. If you specify only the function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Name (p. 500)

The alias name.

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)

Request BodyThe request accepts the following data in JSON format.

Description (p. 500)

You can change the description of the alias using this parameter.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: No

500

Page 507: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateAlias

FunctionVersion (p. 500)

Using this parameter you can change the Lambda function version to which the alias points.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)

Required: NoRevisionId (p. 500)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

Type: String

Required: NoRoutingConfig (p. 500)

Specifies an additional version your alias can point to, allowing you to dictate what percentage oftraffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: AliasRoutingConfiguration (p. 528) object

Required: No

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "AliasArn": "string", "Description": "string", "FunctionVersion": "string", "Name": "string", "RevisionId": "string", "RoutingConfig": { "AdditionalVersionWeights": { "string" : number } }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

AliasArn (p. 501)

Lambda function ARN that is qualified using the alias name as the suffix. For example, if you createan alias called BETA that points to a helloworld function version, the ARN is arn:aws:lambda:aws-regions:acct-id:function:helloworld:BETA.

501

Page 508: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateAlias

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Description (p. 501)

Alias description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.FunctionVersion (p. 501)

Function version to which the alias points.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)Name (p. 501)

Alias name.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)RevisionId (p. 501)

Represents the latest updated revision of the function or alias.

Type: StringRoutingConfig (p. 501)

Specifies an additional function versions the alias points to, allowing you to dictate what percentageof traffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: AliasRoutingConfiguration (p. 528) object

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412

502

Page 509: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateAlias

ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

503

Page 510: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateEventSourceMapping

UpdateEventSourceMappingYou can update an event source mapping. This is useful if you want to change the parameters of theexisting mapping without losing your position in the stream. You can change which function will receive thestream records, but to change the stream itself, you must create a new mapping.

If you are using the versioning feature, you can update the event source mapping to map to a specificLambda function version or alias as described in the FunctionName parameter. For information about theversioning feature, see AWS Lambda Function Versioning and Aliases.

If you disable the event source mapping, AWS Lambda stops polling. If you enable again, it will resumepolling from the time it had stopped polling, so you don't lose processing of any records. However, if youdelete event source mapping and create it again, it will reset.

This operation requires permission for the lambda:UpdateEventSourceMapping action.

Request SyntaxPUT /2015-03-31/event-source-mappings/UUID HTTP/1.1Content-type: application/json

{ "BatchSize": number, "Enabled": boolean, "FunctionName": "string"}

URI Request ParametersThe request requires the following URI parameters.

UUID (p. 504)

The event source mapping identifier.

Request BodyThe request accepts the following data in JSON format.

BatchSize (p. 504)

The maximum number of stream records that can be sent to your Lambda function for a singleinvocation.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.

Required: NoEnabled (p. 504)

Specifies whether AWS Lambda should actively poll the stream or not. If disabled, AWS Lambda willnot poll the stream.

Type: Boolean

Required: No

504

Page 511: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateEventSourceMapping

FunctionName (p. 504)

The Lambda function to which you want the stream records sent.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

If you are using versioning, you can also provide a qualified function ARN (ARN that is qualified withfunction version or alias name as suffix). For more information about versioning, see AWS LambdaFunction Versioning and Aliases

Note that the length constraint applies only to the ARN. If you specify only the function name, it islimited to 64 character in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: No

Response SyntaxHTTP/1.1 202Content-type: application/json

{ "BatchSize": number, "EventSourceArn": "string", "FunctionArn": "string", "LastModified": number, "LastProcessingResult": "string", "State": "string", "StateTransitionReason": "string", "UUID": "string"}

Response ElementsIf the action is successful, the service sends back an HTTP 202 response.

The following data is returned in JSON format by the service.

BatchSize (p. 505)

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.EventSourceArn (p. 505)

The Amazon Resource Name (ARN) of the Amazon Kinesis stream that is the source of events.

505

Page 512: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateEventSourceMapping

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)FunctionArn (p. 505)

The Lambda function to invoke when AWS Lambda detects an event on the stream.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

LastModified (p. 505)

The UTC time string indicating the last time the event mapping was updated.

Type: TimestampLastProcessingResult (p. 505)

The result of the last AWS Lambda invocation of your Lambda function.

Type: StringState (p. 505)

The state of the event source mapping. It can be Creating, Enabled, Disabled, Enabling,Disabling, Updating, or Deleting.

Type: StringStateTransitionReason (p. 505)

The reason the event source mapping is in its current state. It is either user-requested or an AWSLambda-initiated state transition.

Type: StringUUID (p. 505)

The AWS Lambda assigned opaque identifier for the mapping.

Type: String

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

506

Page 513: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateEventSourceMapping

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

507

Page 514: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

UpdateFunctionCodeUpdates the code for the specified Lambda function. This operation must only be used on an existingLambda function and cannot be used to update the function configuration.

If you are using the versioning feature, note this API will always update the $LATEST version of yourLambda function. For information about the versioning feature, see AWS Lambda Function Versioning andAliases.

This operation requires permission for the lambda:UpdateFunctionCode action.

Request SyntaxPUT /2015-03-31/functions/FunctionName/code HTTP/1.1Content-type: application/json

{ "DryRun": boolean, "Publish": boolean, "RevisionId": "string", "S3Bucket": "string", "S3Key": "string", "S3ObjectVersion": "string", "ZipFile": blob}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 508)

The existing Lambda function name whose code you want to replace.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Request BodyThe request accepts the following data in JSON format.

DryRun (p. 508)

This boolean parameter can be used to test your request to AWS Lambda to update the Lambdafunction and publish a version as an atomic operation. It will do all necessary computation andvalidation of your code but will not upload it or a publish a version. Each time this operation is invoked,the CodeSha256 hash value of the provided code will also be computed and returned in the response.

Type: Boolean

508

Page 515: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

Required: NoPublish (p. 508)

This boolean parameter can be used to request AWS Lambda to update the Lambda function andpublish a version as an atomic operation.

Type: Boolean

Required: NoRevisionId (p. 508)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

Type: String

Required: NoS3Bucket (p. 508)

Amazon S3 bucket name where the .zip file containing your deployment package is stored. This bucketmust reside in the same AWS Region where you are creating the Lambda function.

Type: String

Length Constraints: Minimum length of 3. Maximum length of 63.

Pattern: ^[0-9A-Za-z\.\-_]*(?<!\.)$

Required: NoS3Key (p. 508)

The Amazon S3 object (the deployment package) key name you want to upload.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Required: NoS3ObjectVersion (p. 508)

The Amazon S3 object (the deployment package) version you want to upload.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Required: NoZipFile (p. 508)

The contents of your zip file containing your deployment package. If you are using the web API directly,the contents of the zip file must be base64-encoded. If you are using the AWS SDKs or the AWSCLI, the SDKs or CLI will do the encoding for you. For more information about creating a .zip file, seeExecution Permissions.

Type: Base64-encoded binary data object

509

Page 516: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

Required: No

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

CodeSha256 (p. 510)

It is the SHA256 hash of your function deployment package.

Type: StringCodeSize (p. 510)

The size, in bytes, of the function .zip file you uploaded.

Type: Long

510

Page 517: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

DeadLetterConfig (p. 510)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) objectDescription (p. 510)

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.Environment (p. 510)

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) objectFunctionArn (p. 510)

The Amazon Resource Name (ARN) assigned to the function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionName (p. 510)

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Handler (p. 510)

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+KMSKeyArn (p. 510)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()LastModified (p. 510)

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

511

Page 518: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

Type: StringMasterArn (p. 510)

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

MemorySize (p. 510)

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.RevisionId (p. 510)

Represents the latest updated revision of the function or alias.

Type: StringRole (p. 510)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+Runtime (p. 510)

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Timeout (p. 510)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.TracingConfig (p. 510)

The parent object that contains your function's tracing settings.

Type: TracingConfigResponse (p. 543) objectVersion (p. 510)

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)

512

Page 519: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

VpcConfig (p. 510)

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

ErrorsCodeStorageExceededException

You have exceeded your maximum total code size per account. Limits

HTTP Status Code: 400InvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python

513

Page 520: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionCode

• AWS SDK for Ruby V2

514

Page 521: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

UpdateFunctionConfigurationUpdates the configuration parameters for the specified Lambda function by using the values provided inthe request. You provide only the parameters you want to change. This operation must only be used on anexisting Lambda function and cannot be used to update the function's code.

If you are using the versioning feature, note this API will always update the $LATEST version of yourLambda function. For information about the versioning feature, see AWS Lambda Function Versioning andAliases.

This operation requires permission for the lambda:UpdateFunctionConfiguration action.

Request SyntaxPUT /2015-03-31/functions/FunctionName/configuration HTTP/1.1Content-type: application/json

{ "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Variables": { "string" : "string" } }, "Handler": "string", "KMSKeyArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ] }}

URI Request ParametersThe request requires the following URI parameters.

FunctionName (p. 515)

The name of the Lambda function.

You can specify a function name (for example, Thumbnail) or you can specify AmazonResource Name (ARN) of the function (for example, arn:aws:lambda:us-west-2:account-id:function:ThumbNail). AWS Lambda also allows you to specify a partial ARN (for example,account-id:Thumbnail). Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 character in length.

Length Constraints: Minimum length of 1. Maximum length of 140.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

515

Page 522: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

Request BodyThe request accepts the following data in JSON format.

DeadLetterConfig (p. 515)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) object

Required: NoDescription (p. 515)

A short user-defined function description. AWS Lambda does not use this value. Assign a meaningfuldescription as you see fit.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoEnvironment (p. 515)

The parent object that contains your environment's configuration settings.

Type: Environment (p. 531) object

Required: NoHandler (p. 515)

The function that Lambda calls to begin executing your function. For Node.js, it is the module-name.export value in your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+

Required: NoKMSKeyArn (p. 515)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If you elect to use the AWS Lambda default service key, pass in an empty string ("") for thisparameter.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()

Required: NoMemorySize (p. 515)

The amount of memory, in MB, your Lambda function is given. AWS Lambda uses this memory size toinfer the amount of CPU allocated to your function. Your function use-case determines your CPU andmemory requirements. For example, a database operation might need less memory compared to animage processing function. The default value is 128 MB. The value must be a multiple of 64 MB.

Type: Integer

516

Page 523: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

Valid Range: Minimum value of 128. Maximum value of 3008.

Required: NoRevisionId (p. 515)

An optional value you can use to ensure you are updating the latest update of the function version oralias. If the RevisionID you pass doesn't match the latest RevisionId of the function or alias, it willfail with an error message, advising you to retrieve the latest function version or alias RevisionIDusing either GetFunction (p. 451) or GetAlias (p. 445).

Type: String

Required: NoRole (p. 515)

The Amazon Resource Name (ARN) of the IAM role that Lambda will assume when it executes yourfunction.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+

Required: NoRuntime (p. 515)

The runtime environment for the Lambda function.

To use the Python runtime v3.6, set the value to "python3.6". To use the Python runtime v2.7, setthe value to "python2.7". To use the Node.js runtime v8.10, set the value to "nodejs8 .10". To use theNode.js runtime v6.10, set the value to "nodejs6.10". To use the Node.js runtime v4.3, set the valueto "nodejs4.3". To use the .NET Core runtime v1.0, set the value to "dotnetcore1.0". To use the .NETCore runtime v2.0, set the value to "dotnetcore2.0".

Note

Node v0.10.42 is currently marked as deprecated. You must migrate existing functions tothe newer Node.js runtime versions available on AWS Lambda (nodejs4.3, nodejs6.10 ornodejs8.10) as soon as possible. Failure to do so will result in an invalid parameter errorbeing returned. Note that you will have to follow this procedure for each region that containsfunctions written in the Node v0.10.42 runtime.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Required: NoTimeout (p. 515)

The function execution time at which AWS Lambda should terminate the function. Because theexecution time has cost implications, we recommend you set this value based on your expectedexecution time. The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.

Required: NoTracingConfig (p. 515)

The parent object that contains your function's tracing settings.

517

Page 524: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

Type: TracingConfig (p. 542) object

Required: NoVpcConfig (p. 515)

If your Lambda function accesses resources in a VPC, you provide this parameter identifying the listof security group IDs and subnet IDs. These must belong to the same VPC. You must provide at leastone security group and one subnet ID.

Type: VpcConfig (p. 544) object

Required: No

Response SyntaxHTTP/1.1 200Content-type: application/json

{ "CodeSha256": "string", "CodeSize": number, "DeadLetterConfig": { "TargetArn": "string" }, "Description": "string", "Environment": { "Error": { "ErrorCode": "string", "Message": "string" }, "Variables": { "string" : "string" } }, "FunctionArn": "string", "FunctionName": "string", "Handler": "string", "KMSKeyArn": "string", "LastModified": "string", "MasterArn": "string", "MemorySize": number, "RevisionId": "string", "Role": "string", "Runtime": "string", "Timeout": number, "TracingConfig": { "Mode": "string" }, "Version": "string", "VpcConfig": { "SecurityGroupIds": [ "string" ], "SubnetIds": [ "string" ], "VpcId": "string" }}

Response ElementsIf the action is successful, the service sends back an HTTP 200 response.

The following data is returned in JSON format by the service.

518

Page 525: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

CodeSha256 (p. 518)

It is the SHA256 hash of your function deployment package.

Type: StringCodeSize (p. 518)

The size, in bytes, of the function .zip file you uploaded.

Type: LongDeadLetterConfig (p. 518)

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) objectDescription (p. 518)

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.Environment (p. 518)

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) objectFunctionArn (p. 518)

The Amazon Resource Name (ARN) assigned to the function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

FunctionName (p. 518)

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Handler (p. 518)

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+KMSKeyArn (p. 518)

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

519

Page 526: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()LastModified (p. 518)

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

Type: StringMasterArn (p. 518)

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

MemorySize (p. 518)

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.RevisionId (p. 518)

Represents the latest updated revision of the function or alias.

Type: StringRole (p. 518)

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+Runtime (p. 518)

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Timeout (p. 518)

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.TracingConfig (p. 518)

The parent object that contains your function's tracing settings.

520

Page 527: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドUpdateFunctionConfiguration

Type: TracingConfigResponse (p. 543) objectVersion (p. 518)

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)VpcConfig (p. 518)

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

ErrorsInvalidParameterValueException

One of the parameters in the request is invalid. For example, if you provided an IAM role for AWSLambda to assume in the CreateFunction or the UpdateFunctionConfiguration API, thatAWS Lambda is unable to assume you will get this exception.

HTTP Status Code: 400PreconditionFailedException

The RevisionId provided does not match the latest RevisionId for the Lambda function or alias. Call theGetFunction or the GetAlias API to retrieve the latest RevisionId for your resource.

HTTP Status Code: 412ResourceConflictException

The resource already exists.

HTTP Status Code: 409ResourceNotFoundException

The resource (for example, a Lambda function or access policy statement) specified in the requestdoes not exist.

HTTP Status Code: 404ServiceException

The AWS Lambda service encountered an internal error.

HTTP Status Code: 500TooManyRequestsException

HTTP Status Code: 429

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS Command Line Interface

521

Page 528: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドData Types

• AWS SDK for .NET• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for JavaScript• AWS SDK for PHP V3• AWS SDK for Python• AWS SDK for Ruby V2

Data TypesThe following data types are supported:

• AccountLimit (p. 523)• AccountUsage (p. 525)• AliasConfiguration (p. 526)• AliasRoutingConfiguration (p. 528)• Concurrency (p. 529)• DeadLetterConfig (p. 530)• Environment (p. 531)• EnvironmentError (p. 532)• EnvironmentResponse (p. 533)• EventSourceMappingConfiguration (p. 534)• FunctionCode (p. 536)• FunctionCodeLocation (p. 537)• FunctionConfiguration (p. 538)• TracingConfig (p. 542)• TracingConfigResponse (p. 543)• VpcConfig (p. 544)• VpcConfigResponse (p. 545)

522

Page 529: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAccountLimit

AccountLimitProvides limits of code size and concurrency associated with the current account and region.

ContentsCodeSizeUnzipped

Size, in bytes, of code/dependencies that you can zip into a deployment package (uncompressed zip/jar size) for uploading. The default limit is 250 MB.

Type: Long

Required: NoCodeSizeZipped

Size, in bytes, of a single zipped code/dependencies package you can upload for your Lambdafunction(.zip/.jar file). Try using Amazon S3 for uploading larger files. Default limit is 50 MB.

Type: Long

Required: NoConcurrentExecutions

Number of simultaneous executions of your function per region. For more information or to request alimit increase for concurrent executions, see Lambda Function Concurrent Executions. The default limitis 1000.

Type: Integer

Required: NoTotalCodeSize

Maximum size, in bytes, of a code package you can upload per region. The default size is 75 GB.

Type: Long

Required: NoUnreservedConcurrentExecutions

The number of concurrent executions available to functions that do not have concurrency limits set. Formore information, see 同時実行数の管理 (p. 387).

Type: Integer

Valid Range: Minimum value of 0.

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java

523

Page 530: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAccountLimit

• AWS SDK for Ruby V2

524

Page 531: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAccountUsage

AccountUsageProvides code size usage and function count associated with the current account and region.

ContentsFunctionCount

The number of your account's existing functions per region.

Type: Long

Required: NoTotalCodeSize

Total size, in bytes, of the account's deployment packages per region.

Type: Long

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

525

Page 532: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAliasConfiguration

AliasConfigurationProvides configuration information about a Lambda function version alias.

ContentsAliasArn

Lambda function ARN that is qualified using the alias name as the suffix. For example, if you createan alias called BETA that points to a helloworld function version, the ARN is arn:aws:lambda:aws-regions:acct-id:function:helloworld:BETA.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: NoDescription

Alias description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoFunctionVersion

Function version to which the alias points.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)

Required: NoName

Alias name.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 128.

Pattern: (?!^[0-9]+$)([a-zA-Z0-9-_]+)

Required: NoRevisionId

Represents the latest updated revision of the function or alias.

Type: String

Required: NoRoutingConfig

Specifies an additional function versions the alias points to, allowing you to dictate what percentageof traffic will invoke each version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

526

Page 533: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAliasConfiguration

Type: AliasRoutingConfiguration (p. 528) object

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

527

Page 534: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドAliasRoutingConfiguration

AliasRoutingConfigurationThe parent object that implements what percentage of traffic will invoke each function version. For moreinformation, see エイリアスを使用したトラフィックの移行 (p. 309).

ContentsAdditionalVersionWeights

Set this value to dictate what percentage of traffic will invoke the updated function version. If set to anempty string, 100 percent of traffic will invoke function-version. For more information, see エイリアスを使用したトラフィックの移行 (p. 309).

Type: String to double map

Key Length Constraints: Minimum length of 1. Maximum length of 1024.

Key Pattern: [0-9]+

Valid Range: Minimum value of 0.0. Maximum value of 1.0.

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

528

Page 535: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドConcurrency

ConcurrencyContentsReservedConcurrentExecutions

The number of concurrent executions reserved for this function. For more information, see 同時実行数の管理 (p. 387).

Type: Integer

Valid Range: Minimum value of 0.

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

529

Page 536: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドDeadLetterConfig

DeadLetterConfigThe Amazon Resource Name (ARN) of an Amazon SQS queue or Amazon SNS topic you specify as yourDead Letter Queue (DLQ). For more information, see デッドレターキュー (p. 398).

ContentsTargetArn

The Amazon Resource Name (ARN) of an Amazon SQS queue or Amazon SNS topic you specify asyour Dead Letter Queue (DLQ). デッドレターキュー (p. 398). For more information, see デッドレターキュー (p. 398).

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

530

Page 537: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEnvironment

EnvironmentThe parent object that contains your environment's configuration settings.

ContentsVariables

The key-value pairs that represent your environment's configuration settings.

Type: String to string map

Key Pattern: [a-zA-Z]([a-zA-Z0-9_])+

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

531

Page 538: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEnvironmentError

EnvironmentErrorThe parent object that contains error information associated with your configuration settings.

ContentsErrorCode

The error code returned by the environment error object.

Type: String

Required: NoMessage

The message returned by the environment error object.

Type: String

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

532

Page 539: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEnvironmentResponse

EnvironmentResponseThe parent object returned that contains your environment's configuration settings or any error informationassociated with your configuration settings.

ContentsError

The parent object that contains error information associated with your configuration settings.

Type: EnvironmentError (p. 532) object

Required: NoVariables

The key-value pairs returned that represent your environment's configuration settings or errorinformation.

Type: String to string map

Key Pattern: [a-zA-Z]([a-zA-Z0-9_])+

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

533

Page 540: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEventSourceMappingConfiguration

EventSourceMappingConfigurationDescribes mapping between an Amazon Kinesis stream and a Lambda function.

ContentsBatchSize

The largest number of records that AWS Lambda will retrieve from your event source at the time ofinvoking your function. Your function receives an event with all the retrieved records.

Type: Integer

Valid Range: Minimum value of 1. Maximum value of 10000.

Required: NoEventSourceArn

The Amazon Resource Name (ARN) of the Amazon Kinesis stream that is the source of events.

Type: String

Pattern: arn:aws:([a-zA-Z0-9\-])+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:(.*)

Required: NoFunctionArn

The Lambda function to invoke when AWS Lambda detects an event on the stream.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: NoLastModified

The UTC time string indicating the last time the event mapping was updated.

Type: Timestamp

Required: NoLastProcessingResult

The result of the last AWS Lambda invocation of your Lambda function.

Type: String

Required: NoState

The state of the event source mapping. It can be Creating, Enabled, Disabled, Enabling,Disabling, Updating, or Deleting.

Type: String

Required: No

534

Page 541: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドEventSourceMappingConfiguration

StateTransitionReason

The reason the event source mapping is in its current state. It is either user-requested or an AWSLambda-initiated state transition.

Type: String

Required: NoUUID

The AWS Lambda assigned opaque identifier for the mapping.

Type: String

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

535

Page 542: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionCode

FunctionCodeThe code for the Lambda function.

ContentsS3Bucket

Amazon S3 bucket name where the .zip file containing your deployment package is stored. This bucketmust reside in the same AWS region where you are creating the Lambda function.

Type: String

Length Constraints: Minimum length of 3. Maximum length of 63.

Pattern: ^[0-9A-Za-z\.\-_]*(?<!\.)$

Required: NoS3Key

The Amazon S3 object (the deployment package) key name you want to upload.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Required: NoS3ObjectVersion

The Amazon S3 object (the deployment package) version you want to upload.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Required: NoZipFile

The contents of your zip file containing your deployment package. If you are using the web API directly,the contents of the zip file must be base64-encoded. If you are using the AWS SDKs or the AWSCLI, the SDKs or CLI will do the encoding for you. For more information about creating a .zip file, seeExecution Permissions in the AWS Lambda Developer Guide.

Type: Base64-encoded binary data object

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

536

Page 543: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionCodeLocation

FunctionCodeLocationThe object for the Lambda function location.

ContentsLocation

The presigned URL you can use to download the function's .zip file that you previously uploaded. TheURL is valid for up to 10 minutes.

Type: String

Required: NoRepositoryType

The repository from which you can download the function.

Type: String

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

537

Page 544: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionConfiguration

FunctionConfigurationA complex type that describes function metadata.

ContentsCodeSha256

It is the SHA256 hash of your function deployment package.

Type: String

Required: NoCodeSize

The size, in bytes, of the function .zip file you uploaded.

Type: Long

Required: NoDeadLetterConfig

The parent object that contains the target ARN (Amazon Resource Name) of an Amazon SQS queueor Amazon SNS topic. For more information, see デッドレターキュー (p. 398).

Type: DeadLetterConfig (p. 530) object

Required: NoDescription

The user-provided description.

Type: String

Length Constraints: Minimum length of 0. Maximum length of 256.

Required: NoEnvironment

The parent object that contains your environment's configuration settings.

Type: EnvironmentResponse (p. 533) object

Required: NoFunctionArn

The Amazon Resource Name (ARN) assigned to the function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_\.]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: NoFunctionName

The name of the function. Note that the length constraint applies only to the ARN. If you specify onlythe function name, it is limited to 64 characters in length.

538

Page 545: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionConfiguration

Type: String

Length Constraints: Minimum length of 1. Maximum length of 170.

Pattern: (arn:aws:lambda:)?([a-z]{2}-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: NoHandler

The function Lambda calls to begin executing your function.

Type: String

Length Constraints: Maximum length of 128.

Pattern: [^\s]+

Required: NoKMSKeyArn

The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environmentvariables. If empty, it means you are using the AWS Lambda default service key.

Type: String

Pattern: (arn:aws:[a-z0-9-.]+:.*)|()

Required: NoLastModified

The time stamp of the last time you updated the function. The time stamp is conveyedas a string complying with ISO-8601 in this way YYYY-MM-DDThh:mm:ssTZD (e.g.,1997-07-16T19:20:30+01:00). For more information, see Date and Time Formats.

Type: String

Required: NoMasterArn

Returns the ARN (Amazon Resource Name) of the master function.

Type: String

Pattern: arn:aws:lambda:[a-z]{2}-[a-z]+-\d{1}:\d{12}:function:[a-zA-Z0-9-_]+(:(\$LATEST|[a-zA-Z0-9-_]+))?

Required: NoMemorySize

The memory size, in MB, you configured for the function. Must be a multiple of 64 MB.

Type: Integer

Valid Range: Minimum value of 128. Maximum value of 3008.

Required: NoRevisionId

Represents the latest updated revision of the function or alias.

539

Page 546: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionConfiguration

Type: String

Required: NoRole

The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it executes yourfunction to access any other Amazon Web Services (AWS) resources.

Type: String

Pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+

Required: NoRuntime

The runtime environment for the Lambda function.

Type: String

Valid Values: nodejs | nodejs4.3 | nodejs6.10 | nodejs8.10 | java8 | python2.7| python3.6 | dotnetcore1.0 | dotnetcore2.0 | go1.x

Required: NoTimeout

The function execution time at which Lambda should terminate the function. Because the executiontime has cost implications, we recommend you set this value based on your expected execution time.The default is 3 seconds.

Type: Integer

Valid Range: Minimum value of 1.

Required: NoTracingConfig

The parent object that contains your function's tracing settings.

Type: TracingConfigResponse (p. 543) object

Required: NoVersion

The version of the Lambda function.

Type: String

Length Constraints: Minimum length of 1. Maximum length of 1024.

Pattern: (\$LATEST|[0-9]+)

Required: NoVpcConfig

VPC configuration associated with your Lambda function.

Type: VpcConfigResponse (p. 545) object

Required: No

540

Page 547: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドFunctionConfiguration

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

541

Page 548: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドTracingConfig

TracingConfigThe parent object that contains your function's tracing settings.

ContentsMode

Can be either PassThrough or Active. If PassThrough, Lambda will only trace the request from anupstream service if it contains a tracing header with "sampled=1". If Active, Lambda will respect anytracing header it receives from an upstream service. If no tracing header is received, Lambda will callX-Ray for a tracing decision.

Type: String

Valid Values: Active | PassThrough

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

542

Page 549: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドTracingConfigResponse

TracingConfigResponseParent object of the tracing information associated with your Lambda function.

ContentsMode

The tracing mode associated with your Lambda function.

Type: String

Valid Values: Active | PassThrough

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

543

Page 550: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVpcConfig

VpcConfigIf your Lambda function accesses resources in a VPC, you provide this parameter identifying the list ofsecurity group IDs and subnet IDs. These must belong to the same VPC. You must provide at least onesecurity group and one subnet ID.

ContentsSecurityGroupIds

A list of one or more security groups IDs in your VPC.

Type: Array of strings

Array Members: Maximum number of 5 items.

Required: NoSubnetIds

A list of one or more subnet IDs in your VPC.

Type: Array of strings

Array Members: Maximum number of 16 items.

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

544

Page 551: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイドVpcConfigResponse

VpcConfigResponseVPC configuration associated with your Lambda function.

ContentsSecurityGroupIds

A list of security group IDs associated with the Lambda function.

Type: Array of strings

Array Members: Maximum number of 5 items.

Required: NoSubnetIds

A list of subnet IDs associated with the Lambda function.

Type: Array of strings

Array Members: Maximum number of 16 items.

Required: NoVpcId

The VPC ID associated with you Lambda function.

Type: String

Required: No

See AlsoFor more information about using this API in one of the language-specific AWS SDKs, see the following:

• AWS SDK for C++• AWS SDK for Go• AWS SDK for Java• AWS SDK for Ruby V2

545

Page 552: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

ドキュメント履歴次の表は、『AWS Lambda 開発者ガイド』の重要な変更点をまとめたものです。

この履歴に関連する日付:

• 現行製品バージョン: 2015-03-31• ドキュメントの最終更新日: 2018 年 4 月 2 日

変更 説明 日付

Node.js ランタイム 8.10ランタイムのサポート

AWS Lambda が Node.js ランタイムバージョン 8.10 をサポートするようになりました。詳細については、「プログラミングモデル (Node.js) (p. 20)」を参照してください。

2018 年 4月 2 日

関数およびエイリアスリビジョン ID

AWS Lambda が関数バージョンおよびエイリアスのリビジョンID をサポートするようになりました。この ID を使用して、関数バージョンあるいはエイリアスリソースを更新するときに、条件付き更新を追跡して適用できます。

2018 年 1月 25 日

Go と .NET 2.0 におけるランタイムのサポート

AWS Lambda は、Go および .NET 2.0 へのランタイムのサポートを追加しました。詳細については、「Go で Lambda 関数を作成するためのプログラミングモデル (p. 66)」 と「C# でLambda 関数を作成するためのプログラミングモデル (p. 75)」を参照してください 。

2018 年 1月 15 日

コンソールの再設計 AWS Lambda で、新しい Lambda コンソールを導入し、エクスペリエンスを簡素化しました。また、Cloud9 Code Editor を追加して、関数コードのデバッグと修正の機能を強化しました。詳細については、「AWS Lambda コンソールエディタを使用した関数の作成 (p. 113)」を参照してください。

2017 年 11月 30 日

個々の関数に対する同時実行数の制限の設定

AWS Lambda で、個々の関数に対して同時実行数の制限を設定できるようになりました。詳細については、「同時実行数の管理 (p. 387)」を参照してください。

2017 年 11月 30 日

エイリアスによるトラフィックの移行

AWS Lambda で、エイリアスによるトラフィックの移行がサポートされるようになりました。詳細については、「エイリアスを使用したトラフィックの移行 (p. 309)」を参照してください。

2017 年 11月 28 日

コードの段階的なデプロイ

AWS Lambda で、Code Deploy を活用して Lambda 関数の新しいバージョンを安全にデプロイできるようになりました。詳細については、「コードの段階的なデプロイ (p. 324)」を参照してください。

2017 年 11月 28 日

中国 (北京) リージョン AWS Lambda が 中国 (北京) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2017 年 11月 9 日

SAM Local の紹介 SAM Local は、AWS Lambda に基づく AWS CLI ツールであり、サーバーレスアプリケーションを Lambda ランタイムにアップロードする前にローカルで開発、テスト、および分析するための環境を提供します。詳細については、「SAM ローカル

2017 年 8月 11 日

546

Page 553: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付を使用してサーバーレスアプリケーションをローカルでテストする (p. 106)」を参照してください。

カナダ (中部) リージョン

AWS Lambda が カナダ (中部) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2017 年 6月 22 日

南米 (サンパウロ) リージョン

AWS Lambda が 南米 (サンパウロ) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2017 年 6月 6 日

AWS Lambda は AWSX-Ray をサポートします。

Lambda に X-Ray のサポートが導入されました。これによりLambda アプリケーションでパフォーマンスの問題を検出、分析、および最適化できます。詳細については、「AWS X-Rayを使用する (p. 335)」を参照してください。

2017 年 4月 19 日

アジアパシフィック (ムンバイ) リージョン

AWS Lambda が アジアパシフィック (ムンバイ) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2017 年 3月 28 日

AWS Lambda で Node.jsランタイム v6.10 がサポートされるようになりました。

AWS Lambda に Node.js ランタイム v6.10 のサポートが追加されました。詳細については、「プログラミングモデル(Node.js) (p. 20)」を参照してください。

2017 年 3月 22 日

欧州 (ロンドン) リージョン

AWS Lambda が 欧州 (ロンドン) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2017 年 2月 1 日

AWS Lambda での .NET ランタイム、Lambda@Edge (プレビュー)、デッドレターキュー、サーバーレスアプリケーションの自動デプロイメントのサポート。

AWS Lambda で、以下の機能が導入されます。

• AWS Lambda に C# のサポートが追加されました。詳細については、「C# で Lambda 関数を作成するためのプログラミングモデル (p. 75)」を参照してください。

• Lambda@Edge (プレビュー) は、CloudFront イベントに応じて AWS エッジロケーションで Lambda 関数を実行することができます。詳細については、「AWSLambda@Edge (p. 288)」を参照してください。

• AWS CodePipeline、AWS CodeBuild および AWSCloudFormation を使用した、サーバーレスアプリケーションのデプロイを自動化するためのチュートリアルを追加しました。詳細については、「Lambda ベースのアプリケーションのデプロイメントを自動化する (p. 318)」を参照してください。

• Amazon CloudWatch の使用 (p. 327) を更新して デッドレターキュー (p. 398) のセクションを含めました。ここでは、Lambda 関数の失敗した非同期呼び出しに関する情報を取得するように構成できます。

2016 年 12月 3 日

547

Page 554: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付

AWS Lambda はAmazon Lex をサポートされているイベントソースとして追加しました。

Lambda および Amazon Lex を使用して、Slack や Facebookなどのさまざまなサービス用にチャットボットをすばやく構築できます。詳細については、「Amazon Lex (p. 169)」を参照してください。

2016 年 11月 30 日

米国西部 (北カリフォルニア) リージョン

AWS Lambda が 米国西部 (北カリフォルニア) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2016 年 11月 21 日

Lambda ベースのアプリケーションを作成およびデプロイし、Lambda 関数設定の環境変数を使用するための、AWS サーバーレスアプリケーションモデルを導入しました。

このリリースで、AWS Lambda に以下の機能が導入されます。

• AWS サーバーレスアプリケーションモデル: サーバーレスアプリケーション内でリソースを表現するための構文を定義する AWS SAM を使用できるようになりました。アプリケーションをデプロイするには、必要なリソースを、AWSCloudFormation テンプレートファイル (JSON または YAMLで記述された) の関連するアクセス権限ポリシーと共にアプリケーションの一部として指定します。デプロイアーティファクトをパッケージ化し、テンプレートをデプロイします。詳細については、「Lambda ベースのアプリケーションをデプロイする (p. 291)」を参照してください。

• 環境変数: 関数コード以外の Lambda 関数の設定を指定するため環境変数を使用できます。詳細については、「Environment Variables (p. 391)」を参照してください。

2016 年 11月 18 日

ご利用開始にあたって (p. 3) 内に、Lambdaコンソールを使用してAmazon API Gateway エンドポイントを作成するチュートリアルを追加しました

このチュートリアルでは、プロキシリソースのプロキシ統合を設定するで説明されている新しい機能を介して、Lambda 関数をシームレスに API に統合する方法を説明します。詳細については、「Lambda と API Gateway を使用してシンプルなマイクロサービスを作成する (p. 259)」を参照してください。

2016 年 8月 29 日

アジアパシフィック (ソウル) リージョン

AWS Lambda が アジアパシフィック (ソウル) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2016 年 8月 29 日

アジアパシフィック (シドニー) リージョン

Lambda が アジアパシフィック (シドニー) リージョン で利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2016 年 6月 23 日

Lambda コンソールの更新

Lambda コンソールが更新され、ロールの作成プロセスが単純になりました。詳細については、「シンプルな Lambda 関数を作成する (p. 9)」を参照してください。

2016 年 6月 23 日

AWS Lambda で Node.jsランタイム v4.3 がサポートされるようになりました。

AWS Lambda に Node.js ランタイム v4.3 のサポートが追加されました。詳細については、「プログラミングモデル(Node.js) (p. 20)」を参照してください。

2016 年 4月 07 日

548

Page 555: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付

欧州 (フランクフルト)リージョン

Lambda が 欧州 (フランクフルト) リージョンで利用可能になりました。Lambda のリージョンおよびエンドポイントの詳細については、AWS General Referenceのリージョンとエンドポイントを参照してください。

2016 年 3月 14 日

VPC サポート VPC 内のリソースにアクセスできるように Lambda 関数を設定できるようになりました。詳細については、「Amazon VPC内のリソースにアクセスできるように Lambda 関数を構成する (p. 141)」を参照してください。チュートリアルについては、「チュートリアル: Amazon VPC 内のリソースにアクセスできるように Lambda 関数を設定する (p. 143)」を参照してください。

2016 年 2月 11 日

コンテンツの再編成 コンテンツは以下のように再編成されました。

• ご利用開始にあたって (p. 3) - Hello World Lambda 関数を作成するコンソールベースの演習が含まれています。数回クリックするだけで Lambda 関数を作成できる設計図など、AWS Lambda コンソールの機能を探ります。

• ユースケース (p. 182) - 他の AWS サービスやカスタムアプリケーションをイベントソースとして AWS Lambda を使用し、スケジュールされた間隔で HTTPS 経由で Lambda 関数を呼び出すように AWS Lambda を設定する方法の例を示します。

• プログラミングモデル (p. 19) - プログラミングモデルの中核となる概念と、言語固有の詳細を説明します。使用する言語にかかわらず、Lambda 関数のコードを記述するには一般的なパターンがあります。

• デプロイパッケージの作成 (p. 85) - AWS Lambda によってサポートされている言語 (Python 、Java、Node.js) で作成された Lambda 関数コードのデプロイパッケージを作成する方法について説明します。

2015 年 12月 9 日

AWS Lambda ランタイムが更新されました。

AWS Lambda ランタイムは、このリリースで以下の SDK とLinux カーネルバージョンが更新されました。

• AWS SDK for JavaScript: 2.2.12• Boto SDK: 1.2.1• Linux カーネルバージョン: 4.9.62-21.56.amzn1.x86_64

詳細については、「Lambda 実行環境と利用できるライブラリ (p. 404)」を参照してください。

2015 年 4月 11 日

549

Page 556: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付

バージョニング機能のサポート、Lambda 関数の開発コード用のPython、スケジュールされたイベント、実行時間の増加

のこのリリースで、AWS Lambda に以下の機能が導入されます。

• Python: Python を使用した Lambda 関数コードの開発が可能になりました。詳細については、次を参照してください。「プログラミングモデル (p. 19)」。

• バージョニング: Lambda 関数の複数のバージョンを維持できます。バージョニング機能を使用して、異なる環境 (たとえば、開発、テスト、本稼働) で実行される Lambda 関数のバージョンを制御できます。詳細については、「AWSLambda 関数のバージョニングとエイリアス (p. 292)」を参照してください。

• 予定されているイベント: また、AWS Lambda コンソールを使用して、スケジュールに基づいて定期的にコードを呼び出すように AWS Lambda をセットアップできます。固定の間隔を指定する (時間、日、曜日の数字) ことも、Cron 式を指定することもできます。例については、次を参照してください。 「スケジュールされたイベントでの AWS Lambda の使用 (p. 275)」。

• 実行時間の増加: Lambda 関数の実行時間を最長 5 分までセットアップできるようになりました。大容量データの取り込みやジョブの処理のような時間がかかる関数を実行できます。 

2015 年 10月 08 日

2 つの新しいウォークスルー

以下の新しいウォークスルーが追加されました。これらは、どちらも Java Lambda 関数を使用します。

チュートリアル: Amazon DynamoDB で AWS Lambdaを使用する (p. 212)

モバイルアプリケーションのバックエンドとしての AWSLambda の使用 (カスタムイベントソース: Android) (p. 262)

2015 年 8月 27 日

DynamoDB ストリームのサポート

DynamoDB ストリームは一般公開され、DynamoDB が利用可能なすべてのリージョンでこれを使用することができます。テーブルに対して DynamoDB ストリームを有効にして、テーブルのトリガーとして Lambda 関数を使用できます。トリガーは、DynamoDB テーブルに対して行われた更新に応じて行うカスタムアクションです。例のチュートリアルについては、次を参照してください。 「チュートリアル: Amazon DynamoDB でAWS Lambdaを使用する (p. 212)」。

2015 年 7月 14 日

550

Page 557: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付

AWS Lambda は、REST対応のクライアントを使用した Lambda 関数の呼び出しをサポートするようになりました。

これまでは、ウェブ、モバイル、または IoT アプリケーションから Lambda 関数を呼び出すには、AWS SDK (AWS SDK forJava、AWS SDK for Android、AWS SDK for iOS など) が必要でした。現在では、AWS Lambda は Amazon API Gateway を使用して作成できるカスタマイズされた API を通じ、REST 対応クライアントを使用して Lambda 関数を呼び出すことができます。Lambda 関数のエンドポイント URL にリクエストを送信できます。エンドポイントでセキュリティを設定して、オープンアクセスの許可、AWS Identity and Access Management(IAM) を利用したアクセスの許可、または他のユーザーによるLambda 関数へのアクセスの API キーを使用した計測を行えるようになりました。

「開始方法」の演習例については、次を参照してください。「Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由) (p. 245)」。

Amazon API Gateway の詳細については、「https://aws.amazon.com/api-gateway/」を参照してください。

2015 年 7月 09 日

AWS Lambda コンソールでは、簡単に Lambda関数を作成およびテストするために、設計図が提供されるようになりました。

AWS Lambda コンソールは、一連の設計図を提供します。各設計図には、Lambda 関数用に、簡単に Lambda ベースのアプリケーションを作成するために使用できる Lambda 関数のサンプルイベントソース設定とサンプルコードが用意されています。AWS Lambda のすべての「使用開始」の実習では、設計図を使用するようになりました。詳細については、「ご利用開始にあたって (p. 3)」を参照してください。

このリリース

AWS Lambdaは、Lambda 関数を作成するために Java がサポートされるようになりました。

Java で Lambda コードを記述できるようになりました。詳細については、次を参照してください。 「プログラミングモデル (p. 19)」。

2015 年 6月 15 日

AWS Lambdaは、Lambda 関数を作成または更新するときに、Amazon S3 オブジェクトを関数の .zip として指定できるようになりました。

Lambda 関数デプロイパッケージ (.zip ファイル) を、Lambda関数を作成するのと同じリージョンで Amazon S3 バケットにアップロードできます。次に、Lambda 関数を作成または更新するときに、バケット名とオブジェクトキー名を指定できます。

2015 年 5月 28 日

551

Page 558: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

変更 説明 日付

AWS Lambda は、モバイルバックエンド用にサポートを追加して一般公開されるようになりました。

AWS Lambda は、本稼働環境用に一般公開されるようになりました。また、このリリースでは、インフラストラクチャをプロビジョニングまたは管理することなく、自動的にスケーリングする AWS Lambda を使用して、モバイル、タブレット、および Internet of Things (IoT) バックエンドを簡単に構築できるようにする新機能も導入されています。AWS Lambda は、リアルタイム (同期) および非同期イベントの両方をサポートするようになりました。その他の機能には、簡単なイベントソース設定と管理があります。Lambda 関数用のリソースポリシーの導入によって、アクセス権限モデルとプログラミングモデルが簡素化されました。

それに応じてドキュメントが更新されました。詳細については、以下のトピックを参照してください。

ご利用開始にあたって (p. 3)

AWS Lambda

2015 年 4月 9 日

プレビューリリース 『AWS Lambda 開発者ガイド』のプレビューリリース。 2014 年 11月 13 日

552

Page 559: AWS Lambda - 開発者ガイド · AWS Lambda を初めてお使いになる方向けの情報 ... AWS CloudFormation ... AWS Lambda を初めて使用する方

AWS Lambda 開発者ガイド

AWS の用語集最新の AWS の用語については、『AWS General Reference』の「AWS の用語集」を参照してください。

553