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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。

以下の手順を完了するには、「AWS Command Line Interface (AWS CLI) バージョン 2」が必要です。コマンドと予想される出力は、別々のブロックにリストされます。

aws --version

次のような出力が表示されます。

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。

注記

Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストールします。このガイドの CLI コマンドの例では、Linux フォーマットを使用しています。Windows CLI を使用している場合、インライン JSON ドキュメントを含むコマンドを再フォーマットする必要があります。

実行ロールを作成する

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

実行ロールを作成するには
  1. IAM コンソールの [ロールページ] を開きます。

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

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

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

    • アクセス許可AWSLambdaDynamoDBExecutionRole

    • [ロール名] - lambda-dynamodb-role

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

関数を作成する

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

注記

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

例 index.mjs
console.log('Loading function'); export const handler = (event, context, callback) => { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(record => { console.log(record.eventID); console.log(record.eventName); console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`); }); callback(null, "message"); };
関数を作成するには
  1. サンプルコードを index.mjs という名前のファイルにコピーします。

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

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

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

Lambda 関数をテストする

このセットアップでは、invokeAWS Lambda の CLI コマンドと次のサンプルの 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 \ --cli-binary-format raw-in-base64-out \ --payload file://input.txt outputfile.txt

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

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

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

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

ストリーミングが有効な Amazon DynamoDB テーブルを作成します。

DynamoDB テーブルを作成するには
  1. DynamoDB コンソールを開きます。

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

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

    • テーブル名lambda-dynamodb-stream

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

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

ストリームを有効化するには
  1. DynamoDB コンソールを開きます。

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

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

  4. [Exports and streams] (エクスポートとストリーミング)で、[DynamoDB stream details] (DynamoDB ストリーミングの詳細) を選択します。

  5. [Enable(有効化)] を選択します。

  6. [Enable stream] (ストリーミングを有効化) を選択します。

ストリーム 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

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

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

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

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

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

リソースのクリーンアップ

このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに delete と入力し、[削除] を選択します。

実行ロールを削除する
  1. IAM コンソールのロールページを開きます。

  2. 作成した実行ロールを選択します。

  3. [削除] を選択します。

  4. テキスト入力フィールドにロールの名前を入力し、[Delete] (削除) を選択します。

DynamoDB テーブルを削除するには
  1. DynamoDB コンソールで [Tables (テーブル)] ページを開きます。

  2. 作成したテーブルを選択します。

  3. [削除] を選択します。

  4. テキストボックスに「delete」と入力します。

  5. [テーブルの削除] を選択します。