AWS Lambda
開発者ガイド

チュートリアル: Amazon DynamoDB ストリームで AWS Lambda を使用する

このチュートリアルでは、Amazon DynamoDB ストリームからのイベントを処理する Lambda 関数を作成します。

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。まだ作成していない場合は、AWS Lambda の使用開始 の指示に従って、まず Lambda 関数を作成します。

このガイドの手順に従うには、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/lambda-project$ this is a command this is output

コマンドが長い場合は、エスケープ文字 (\) を使用して、コマンドを複数の行に分割します。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

実行ロールを作成する

AWS リソースにアクセスするためのアクセス権限を関数に付与する実行ロールを作成します。

実行ロールを作成するには

  1. IAM コンソールの [Roles] ページを開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティ – Lambda

    • [アクセス許可] – AWSLambdaDynamoDBExecutionRole

    • ロール名lambda-dynamodb-role

[AWSLambdaDynamoDBExecutionRole] には、DynamoDB から項目を読み取り、CloudWatch Logs にログを書き込むために関数が必要とするアクセス許可があります。

関数を作成する

以下のコード例では、DynamoDB イベント入力を受け取り、含まれるメッセージを処理します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

注記

他の言語によるサンプルコードについては、「サンプル関数コード」を参照してください。

例 index.js

console.log('Loading function'); exports.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"); };

関数を作成するには

  1. サンプルコードを index.js という名前のファイルにコピーします。

  2. デプロイパッケージを作成します。

    $ zip function.zip index.js
  3. create-function コマンドを使用して Lambda 関数を作成します。

    $ aws lambda create-function --function-name ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/lambda-dynamodb-role

Lambda 関数をテストする

このセットアップでは、AWS Lambda の CLI コマンド invoke と次のサンプル DynamoDB イベントを使用して、Lambda 関数を手動で呼び出します。

例 input.txt

{ "Records":[ { "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", "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" } ] }

次の invoke コマンドを実行します。

$ aws lambda invoke --function-name ProcessDynamoDBRecords --payload file://input.txt outputfile.txt

この関数はレスポンス本文で文字列 message を返します。

outputfile.txt ファイルで出力を確認します。

ストリームが有効になった DynamoDB テーブルを作成する

ストリームが有効になった Amazon DynamoDB テーブルを作成します。

DynamoDB テーブルを作成するには

  1. DynamoDB コンソールを開きます。

  2. [Create table] を選択します。

  3. 次の設定でテーブルを作成します。

    • [Table name (テーブル名)] – lambda-dynamodb-stream

    • [プライマリキー] – id (文字列)

  4. [作成] を選択します。

ストリームを有効化するには

  1. DynamoDB コンソールを開きます。

  2. [テーブル] を選択します。

  3. [lambda-dynamodb-stream] テーブルを選択します。

  4. [Overview] で、[Manage stream (ストリームの管理)] を選択します。

  5. [Enable] を選択します。

ストリーム ARN をメモします。次のセクションでストリームを Lambda 関数と関連付ける際に、これが必要になります。ストリームの有効化の詳細については、「DynamoDB Streams を使用したテーブルアクティビティのキャプチャ」を参照してください。

AWS Lambda にイベントソースを追加します。

AWS Lambda でイベントソースマッピングを作成します。このイベントソースのマッピングは、DynamoDB ストリームを Lambda関数と関連付けます。このイベントソースのマッピングを作成すると、AWS Lambda はストリームのポーリングを開始します。

次の AWS CLI create-event-source-mapping コマンドを実行します。コマンドを実行したら、UUID を書き留めてください。この UUID は、イベントソースマッピングを削除するときなど、コマンドでイベントソースマッピングを参照する場合に必要になります。

$ aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \ --batch-size 100 --starting-position LATEST --event-source DynamoDB-stream-arn

これにより、指定された DynamoDB ストリームと Lambda 関数の間にマッピングが作成されます。DynamoDB ストリームを複数の Lambda 関数と関連付け、同じ Lambda 関数を複数のストリームと関連付けることができます。ただし、Lambda 関数は、共有するストリーム用に、読み取りスループットを共有します。

次のコマンドを実行して、イベントソースのマッピングのリストを取得できます。

$ aws lambda list-event-source-mappings

このリストでは、作成済みのすべてのイベントソースのマッピングが返され、各マッピングに対して LastProcessingResult などが示されます。問題がある場合、このフィールドは情報メッセージを提供するために使用されます。No records processed (AWS Lambda がポーリングを開始していないか、ストリームにレコードがないことを示す) や、OK (AWS Lambda がストリームから正常にレコードを読み取り、Lambda 関数を呼び出したことを示す) など値は、問題がないことを示しています。問題がある場合は、エラーメッセージが返されます。

イベントソースマッピングが多数ある場合、関数の name パラメータを使用して結果を絞り込みます。

$ aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords

セットアップをテストする

エンドツーエンドエクスペリエンスをテストします。テーブルの更新を実行すると、DynamoDB はイベントレコードをストリームに書き込みます。ストリームをポーリングしている AWS Lambda は、ストリームで新しいレコードを検出し、イベントを Lambda 関数に渡して、ユーザーに代わって関数を実行します。

  1. DynamoDB コンソールで、テーブルに項目を追加、更新、削除します。 DynamoDB はストリームにこれらのアクションのレコードを書き込みます。

  2. AWS Lambda は、ストリームをポーリングし、ストリームの更新を検出すると、ストリームで見つかったイベントデータを渡して Lambda 関数を呼び出します。

  3. 関数が実行され、Amazon CloudWatch でログが作成されます。Amazon CloudWatch コンソールで報告されたログを確認できます。