チュートリアル: Amazon DocumentDB を用いて AWS Lambda のストリームの使用
このチュートリアルでは、Amazon DocumentDB (MongoDB 互換) 変更ストリームからのイベントを処理する基本的な Lambda 関数を作成します。このチュートリアルは、以下の段階を通じて完了します。
-
Amazon DocumentDB クラスターをセットアップして接続し、そのクラスターで変更ストリームをアクティブ化します。
-
Lambda 関数を作成し、Amazon DocumentDB クラスターを関数のイベントソースとして設定します。
-
Amazon DocumentDB データベースにアイテムを挿入して、セットアップをテストします。
Amazon DocumentDB クラスターの作成
-
Amazon DocumentDB コンソール
を開きます。[クラスタ] で [作成] を選択します。 -
次の設定でクラスターを作成します。
-
[クラスタータイプ] で [インスタンスベースのクラスター] を選択します。これがデフォルトのオプションです。
-
[クラスター設定] で、[エンジンバージョン] 5.0.0 が選択されていることを確認します。これがデフォルトのオプションです。
-
[インスタンス設定] で次の設定を行なってください。
-
[DB インスタンスクラス] で、[メモリ最適化クラス] を選択します。これがデフォルトのオプションです。
-
[通常のレプリカインスタンスの数] には 1 を選択します。
-
[インスタンスクラス] にはデフォルトの選択を使用します。
-
-
[認証] でプライマリユーザーのユーザー名を入力し、[セルフマネージド] を選択します。パスワードを入力して確認します。
-
他のデフォルト設定をすべて維持します。
-
-
[クラスターを作成] を選択します。
Secrets Manager でシークレットを作成する
Amazon DocumentDB がクラスターを作成している間に、データベースの認証情報を保存する AWS Secrets Manager シークレットを作成します。このシークレットは、後の手順で Lambda イベントソースマッピングを作成するときに指定します。
Secrets Manager でシークレットを保存するには
-
[Secrets Manager]
コンソールを開き、[新しいシークレットを保存] を選択します。 -
[シークレットのタイプを選択] で、以下のいずれかのオプションを選択します。
-
[基本情報] の下:
-
[シークレットタイプ]: Amazon DocumentDB データベース用の認証情報
-
[認証情報] で、Amazon DocumentDB クラスターの作成に使用したユーザー名およびパスワードを入力します。
-
[データベース]: ご使用の Amazon DocumentDB クラスターを選択します。
-
[次へ] を選択します。
-
-
-
[条件] は、以下のオプションから選択します。
-
[シークレット名]:
DocumentDBSecret
-
[次へ] を選択します。
-
-
[次へ] を選択します。
-
[保存する] を選択します。
-
コンソールを更新して、
DocumentDBSecret
シークレットが正常に保存されたことを確認します。
[シークレット ARN] をメモしておきます。これは、後のステップで必要になります。
クラスターに接続する
AWS CloudShell を使用して Amazon DocumentDB クラスターに接続する
-
Amazon DocumentDB マネジメントコンソールの [クラスター] で、作成したクラスターを探します。クラスターの横にあるチェックボックスをクリックして選択します。
-
[クラスターに接続] を選択します。CloudShell の [Run コマンド] 画面が表示されます。
-
[新しい環境の名前] フィールドに、「test」などの一意の名前を入力し、[作成して実行する] を選択します。
-
プロンプトが表示されたら、パスワードを入力します。プロンプトが
rs0 [direct: primary] <env-name>>
に変わったら、Amazon DocumentDB クラスターに正常に接続できています。
変更ストリームを有効にする
本チュートリアルでは、Amazon DocumentDB クラスター内にある docdbdemo
データベースの products
コレクションへの変更を追跡します。これを行うには、[変更ストリーム] を有効にします。
クラスター内に新しいデータベースを作成するには
-
次のコマンドを実行し、
docdbdemo
と呼ばれる新しいデータベースを作成します。use docdbdemo
-
ターミナルウィンドウで、次のコマンドを使用してレコードを
docdbdemo
に挿入します。db.products.insertOne({"hello":"world"})
次のような出力が表示されます。
{ acknowledged: true, insertedId: ObjectId('67f85066ca526410fd531d59') }
-
次に、次のコマンドを使用して、
docdbdemo
データベースのproducts
コレクションの変更ストリームを有効にします。db.adminCommand({modifyChangeStreams: 1, database: "docdbdemo", collection: "products", enable: true});
次のような出力が表示されます。
{ "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }
インターフェイス VPC エンドポイントを作成する
次に、インターフェイス VPC エンドポイントを作成して、Lambda と Secrets Manager (後でクラスターアクセス認証情報を保存するために使用) がデフォルト VPC に接続できるようにします。
インターフェイス VPC エンドポイントを作成するには
-
[VPC] コンソール
を開きます。左側のメニューの [仮想プライベートクラウド] で、[エンドポイント] を選択します。 -
[エンドポイントの作成] を選択します。次の構成でエンドポイントを作成します。
-
[名前タグ] に「
lambda-default-vpc
」を入力します。 -
[サービスカテゴリ] で、[AWS サービス] を選択します。
-
サービスには、検索ボックスで「
lambda
」と入力します。フォーマットcom.amazonaws.<region>.lambda
のサービスを選択してください。 -
[VPC] で、Amazon DocumentDB クラスターがある VPC を選択します。通常、これはデフォルト VPC になります。
-
サブネット には、各アベイラビリティーゾーンの横にあるボックスをチェックします。それぞれのアベイラビリティゾーンに正しいサブネット ID を選択します。
-
[IP アドレスの種類] には [IPv4] を選択します。
-
[セキュリティグループ] で、Amazon DocumentDB クラスターが使用するセキュリティグループを選択します。通常、これは
default
セキュリティグループになります。 -
他のデフォルト設定をすべて維持します。
-
[エンドポイントの作成] を選択します。
-
-
[エンドポイントの作成] を再び選択します。次の構成でエンドポイントを作成します。
-
[名前タグ] に「
secretsmanager-default-vpc
」を入力します。 -
[サービスカテゴリ] で、[AWS サービス] を選択します。
-
サービスには、検索ボックスで「
secretsmanager
」と入力します。フォーマットcom.amazonaws.<region>.secretsmanager
のサービスを選択してください。 -
[VPC] で、Amazon DocumentDB クラスターがある VPC を選択します。通常、これはデフォルト VPC になります。
-
サブネット には、各アベイラビリティーゾーンの横にあるボックスをチェックします。それぞれのアベイラビリティゾーンに正しいサブネット ID を選択します。
-
[IP アドレスの種類] には [IPv4] を選択します。
-
[セキュリティグループ] で、Amazon DocumentDB クラスターが使用するセキュリティグループを選択します。通常、これは
default
セキュリティグループになります。 -
他のデフォルト設定をすべて維持します。
-
[エンドポイントの作成] を選択します。
-
これで、このチュートリアルのクラスターセットアップの部分は完了です。
実行ロールを作成する
次のステップでは、Lambda 関数を作成します。まず、クラスターにアクセスするためのアクセス許可を関数に付与する実行ロールを作成する必要があります。これを行うには、最初に IAM ポリシーを作成してから、次にこのポリシーを IAM ロールにアタッチします。
IAM ポリシーを作成するには
-
IAM コンソールの [ポリシー] ページ
を開き、[ポリシーの作成] を選択します。 -
[JSON] タブを選択します。次のポリシーでは、ステートメントの最後の行にある Secrets Manager リソース ARN を以前のシークレット ARN で置き換え、ポリシーをエディタにコピーします。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "LambdaESMNetworkingAccess", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMAccess", "Effect": "Allow", "Action": [ "rds:DescribeDBClusters", "rds:DescribeDBClusterParameters", "rds:DescribeDBSubnetGroups" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMGetSecretValueAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "
arn:aws:secretsmanager:us-east-1:123456789012:secret:DocumentDBSecret
" } ] } -
[次へ: タグ]、[次へ: 確認] の順に選択します。
-
[Name] (名前) に
AWSDocumentDBLambdaPolicy
と入力します。 -
[ポリシーの作成] を選択します。
IAM ロールを作成するには
-
IAM コンソールの [ロール] ページ
を開いて、[ロールの作成] を選択します。 -
[信頼できるエンティティを選択] には、次のオプションを選択します。
-
[信頼できるエンティティタイプ]: AWS サービス
-
[サービスまたはユースケース]: Lambda
-
[次へ] を選択します。
-
-
[アクセス権限の追加] では、作成したばかりの
AWSDocumentDBLambdaPolicy
ポリシーを選択し、AWSLambdaBasicExecutionRole
と同様に関数に Amazon CloudWatch Logs への書き込み権限を付与します。 -
[次へ] を選択します。
-
[Role name] (ロール名) に
AWSDocumentDBLambdaExecutionRole
と入力します。 -
[ロールの作成] を選択してください。
Lambda 関数を作成する
このチュートリアルでは Python 3.13 ランタイムを使用しますが、他のランタイム用のコードファイルの例も用意しています。次のボックスでタブを選択すると、関心のあるランタイムのコードが表示されます。
このコードは Amazon DocumentDB イベント入力を受け取り、そこに含まれるメッセージを処理します。
Lambda 関数を作成するには
-
Lambda コンソールの [関数]
ページを開きます。 -
[関数の作成] を選択してください。
-
[一から作成] を選択します。
-
[基本的な情報] で、以下を実行します。
-
[関数名] に
ProcessDocumentDBRecords
と入力します。 -
[ランタイム] で [Python 3.13] を選択します。
-
[アーキテクチャ] で [x86_64] を選択します。
-
-
[デフォルトの実行ロールの変更] タブで、次の操作を行います。
-
タブを展開し、[既存のロールを使用する] を選択します。
-
先ほど作成した
AWSDocumentDBLambdaExecutionRole
を選択します。
-
-
[関数の作成] を選択してください。
関数コードをデプロイするには
-
次のボックスで [Python] タブを選択し、コードをコピーします。
-
Lambda コンソールの [コードソース] ペインで、コードをコードエディタに貼り付け、Lambda が作成したコードを置き換えます。
-
[DEPLOY] セクションで、[デプロイ] を選択して関数のコードを更新します。
Lambda イベントソースマッピングを作成します。
Amazon DocumentDB 変更ストリームを Lambda 関数と関連付けるイベントソースマッピングを作成します。このイベントソースマッピングを作成すると、AWS Lambda はストリームのポーリングをすぐに開始します。
イベントソースマッピングを作成するには
-
Lambda コンソールの [関数]
ページを開きます。 -
先ほど作成した
ProcessDocumentDBRecords
関数を選択します。 -
[設定] タブを選択し、左側のメニューで [トリガー] を選択します。
-
[トリガーを追加] を選択します。
-
[トリガー設定] で、[Amazon DocumentDB] をソースとして選択します。
-
イベントソースマッピングには、次の設定制限があります。
-
[Amazon DocumentDB クラスター]: 先ほど作成したクラスターを選択します。
-
[データベース名]: docdbdemo
-
[コレクション名]: 製品
-
[バッチサイズ]: 1
-
[開始位置]: 最新
-
[認証]: BASIC_AUTH
-
[Secrets Manager キー]: Amazon DocumentDB クラスターのシークレットを選択します。
rds!cluster-12345678-a6f0-52c0-b290-db4aga89274f
のような名前になります。 -
[バッチウィンドウ]: 1
-
[フルドキュメント設定]: UpdateLookup
-
-
[Add] (追加) を選択します。イベントソースマッピングの作成には数分かかる場合があります。
関数をテストする
イベントソースマッピングが [有効] 状態になるまで待ちます。これには数分間かかる場合があります。次に、データベースレコードを挿入、更新、削除して、エンドツーエンドのセットアップをテストします。開始する前に:
-
CloudShell 環境で Amazon DocumentDB クラスターに再接続します。
-
次のコマンドを実行し、
docdbdemo
データベースを使用できているのを確認します。use docdbdemo
docdbdemo
データベースの products
コレクションにレコードを挿入します。
db.products.insertOne({"name":"Pencil", "price": 1.00})
CloudWatch Logs をチェックして、関数がこのイベントを正常に処理したことを確認します。次のようなログエントリが表示されます。

次のコマンドを使用して挿入したレコードを更新します。
db.products.updateOne( { "name": "Pencil" }, { $set: { "price": 0.50 }} )
CloudWatch Logs をチェックして、関数がこのイベントを正常に処理したことを確認します。次のようなログエントリが表示されます。

次のコマンドを使用して更新したレコードを削除します。
db.products.deleteOne( { "name": "Pencil" } )
CloudWatch Logs をチェックして、関数がこのイベントを正常に処理したことを確認します。次のようなログエントリが表示されます。

トラブルシューティング
関数の CloudWatch ログにデータベースイベントが表示されない場合、次の内容を確認してください。
-
Lambda イベントソースマッピング (トリガーとも呼ばれる) が [有効] 状態になっていることを確認します。イベントソースマッピングは作成に数分かかる場合があります。
-
イベントソースマッピングが [有効] になっても CloudWatch にデータベースイベントが表示されない場合、次の内容を実行してください。
-
イベントソースマッピングの [データベース名] が
docdbdemo
に設定されていることを確認します。 -
イベントソースマッピングの [最終処理結果] フィールドに、次のメッセージがあるかどうか確認します。「問題: 接続エラー。VPC は Lambda および STS との接続に加え、認証が必要な場合は Secrets Manager にも接続できる必要があります」 このエラーが表示された場合、Lambda および Secrets Manager VPC インターフェイスエンドポイントが作成されているか、またエンドポイントは Amazon DocumentDB クラスターが使用するのと同じ VPC およびサブネットを使用しているかを確認してください。
-
リソースのクリーンアップ
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
Lambda 関数を削除するには
-
Lambda コンソールの [関数]
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
confirm
と入力し、[削除] を選択します。
実行ロールを削除する
-
IAM コンソールの [ロール]
ページを開きます。 -
作成した実行ロールを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにロールの名前を入力し、[削除] を選択します。
VPC エンドポイントを削除するには
-
[VPC] コンソール
を開きます。左側のメニューの [仮想プライベートクラウド] で、[エンドポイント] を選択します。 -
作成したエンドポイントを選択します。
-
[アクション 、[VPC エンドポイントを削除] の順に選択してください。
-
テキスト入力フィールドに
delete
を入力します。 -
[削除] を選択します。
Amazon DocumentDB クラスターを削除するには
-
Amazon DocumentDB コンソール
を開きます。 -
本チュートリアル用に作成した Amazon DocumentDB クラスターを選択し、削除保護を無効にします。
-
メインの [クラスター] ページで、作成した Amazon DocumentDB クラスターを再度選択します。
-
[アクション]、[削除] の順に選択します。
-
[最終クラスタースナップショットの作成] で [いいえ] を選択します。
-
テキスト入力フィールドに
delete
を入力します。 -
[削除] を選択します。
シークレットを Secrets Manager で削除するには
-
Secrets Manager コンソール
を開きます。 -
このチュートリアルで作成したシークレットを選択します。
-
[アクション]、[シークレットの削除] を選択します。
-
[Schedule deletion] (削除をスケジュールする) を選択します。