チュートリアル: 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 で置き換え、ポリシーをエディタにコピーします。 
- 
        [次へ: タグ]、[次へ: 確認] の順に選択します。 
- 
        [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 コンソールコードエディタの [デプロイ] ボタン](images/getting-started-tutorial/deploy-console.png)  
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] (削除をスケジュールする) を選択します。