チュートリアル: Amazon DocumentDB を用いて AWS Lambda のストリームの使用 - AWS Lambda

チュートリアル: Amazon DocumentDB を用いて AWS Lambda のストリームの使用

このチュートリアルでは、Amazon DocumentDB (MongoDB 互換) 変更ストリームからのイベントを処理する基本的な Lambda 関数を作成します。このチュートリアルは、以下の段階を通じて完了します。

  • Amazon DocumentDB クラスターをセットアップして接続し、そのクラスターで変更ストリームをアクティブ化します。

  • Lambda 関数を作成し、Amazon DocumentDB クラスターを関数のイベントソースとして設定します。

  • Amazon DocumentDB データベースにアイテムを挿入して、エンドツーエンドセットアップをテストします。

前提条件

AWS アカウント がない場合は、以下のステップを実行して作成します。

AWS アカウントにサインアップするには
  1. https://portal.aws.amazon.com/billing/signup を開きます。

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

    サインアップ手順の一環として、通話呼び出しを受け取り、電話キーパッドで検証コードを入力するように求められます。

    AWS アカウント にサインアップすると、AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべての AWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。

サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/[アカウント] をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。

AWS アカウントのルートユーザーをセキュリティで保護する
  1. [ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドルートユーザーとしてサインインするを参照してください。

  2. ルートユーザーの多要素認証 (MFA) を有効にします。

    手順については、「IAM ユーザーガイド」の「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。

管理アクセスを持つユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。

  2. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

    IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルト IAM アイデンティティセンターディレクトリを使用したユーザーアクセスの設定」を参照してください。

管理アクセス権を持つユーザーとしてサインインする
  • IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

    IAM アイデンティティセンターユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in to the AWS access portal」を参照してください。

追加のユーザーにアクセス権を割り当てる
  1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」を参照してください。

  2. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「グループの参加」を参照してください。

AWS Command Line Interface をまだインストールしていない場合は、「最新バージョンの AWS CLI のインストールまたは更新」にある手順に従ってインストールしてください。

このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。

注記

Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストールします。

AWS Cloud9 環境を作成します。

ステップ 1: AWS Cloud9 環境を作成する

Lambda 関数を作成する前に、Amazon DocumentDB クラスターを作成して設定する必要があります。このチュートリアルでクラスターをセットアップする手順は、「Amazon DocumentDB を開始する」の手順に基づいています。

注記

Amazon DocumentDB クラスターのセットアップが既に完了している場合は、必ず変更ストリームをアクティブ化し、必要なインターフェイス VPC エンドポイントを作成してください。これで、関数作成の手順に直接進むことができます。

最初に、AWS Cloud9 環境を作成します。本チュートリアルでは、この環境を使用して Amazon DocumentDB クラスターに接続してクエリを実行します。

AWS Cloud9 環境を作成するには
  1. AWS Cloud9 コンソールを開いて、[環境を作成] を選択します。

  2. 以下の構成で環境を作成します。

    • [詳細] の下:

      • 名前: DocumentDBCloud9Environment

      • [環境タイプ]: 新しい EC2 インスタンス

    • 新しい EC2 インスタンスの場合 の下:

      • [インスタンスタイプ]: t2.micro (1 GiB RAM + 1 vCPU)

      • [プラットフォーム]: Amazon Linux 2

      • [タイムアウト]: 30 分

    • [ネットワーク設定] の下:

      • [接続]: AWS Systems Manager (SSM)

      • [VPC 設定] ドロップダウンを展開します。

      • [Amazon Virtual Private Cloud (VPC)]: デフォルトの VPC を選択します。

      • [サブネット]: 指定なし

    • 他のデフォルト設定をすべて維持します。

  3. [Create] (作成) を選択します。新しい AWS Cloud9 環境のプロビジョニングには数分かかることがあります。

Amazon EC2 セキュリティグループの作成

ステップ 2: Amazon EC2 セキュリティグループを作成する

次に、Amazon DocumentDB クラスターと AWS Cloud9 環境間のトラフィックを許可するルールを含む Amazon EC2 セキュリティグループを作成します。

EC2 セキュリティグループを作成するには
  1. EC2 コンソールを開きます。[ネットワークとセキュリティ] で、[セキュリティグループ] を選択します。

  2. [セキュリティグループの作成] を選択します。

  3. 次の構成でセキュリティグループを作成します。

    • [基本情報] の下:

      • セキュリティグループ名: DocDBTutorial

      • [説明]: AWS Cloud9 と Amazon DocumentDB 間のトラフィック用のセキュリティグループ。

      • [VPC]: [デフォルトの VPC] を選択します。

    • [インバウンドルール] で、[ルールの追加] を選択します。次の設定でルールを作成します。

      • タイプ: カスタム TCP

      • [ポート範囲]: 27017

      • [Source]: Custom

      • [Source] の横にある検索ボックスで、前のステップで作成した AWS Cloud9 環境のセキュリティグループを選択します。使用可能なセキュリティグループのリストを表示するには、検索ボックスに「cloud9」を入力します。aws-cloud9-<environment_name> という名前のセキュリティグループを選択します。

    • 他のデフォルト設定をすべて維持します。

  4. [セキュリティグループの作成] を選択します。

Amazon DocumentDB クラスターの作成

ステップ 3: Amazon DocumentDB クラスターを作成する

このステップでは、前のステップで作成したセキュリティグループを使用して Amazon DocumentDB クラスターを作成します。

Amazon DocumentDB クラスターを作成するには
  1. Amazon DocumentDB コンソールを開きます。[クラスタ][作成] を選択します。

  2. 次の設定でクラスターを作成します。

    • [クラスタータイプ] には、インスタンスベースのクラスターを選択します。

    • [構成] の下:

      • [エンジンバージョン]: 5.0.0

      • [インスタンスクラス]: db.t3.medium (無料トライアル対象)

      • [インスタンス数]: 1

    • [認証] の下:

      • クラスターへの接続に必要なユーザー名パスワードを入力します (前のステップでシークレットを作成したときと同じ認証情報)。[パスワードの確認] で、パスワードを確認します。

    • [アドバンスト設定の表示] を切り替えます。

    • [ネットワーク設定] の下:

      • [仮想プライベートクラウド (VPC)]): [デフォルトの VPC] を選択します。

      • [サブネットグループ]: デフォルト

      • [VPC セキュリティグループ]: default (VPC) に加え、前のステップで作成した DocDBTutorial (VPC) セキュリティグループを選択します。

    • 他のデフォルト設定をすべて維持します。

  3. [クラスターを作成] を選択します。Amazon DocumentDB クラスターのプロビジョニングには数分かかる場合があります。

Secrets Manager でシークレットを作成する

ステップ 4: Secrets Manager でシークレットを作成する

Amazon DocumentDB クラスターに手動でアクセスするには、ユーザー名とパスワードの認証情報を入力する必要があります。Lambda がクラスターにアクセスするには、イベントソースマッピングを設定するときに、同じアクセス認証情報を含む Secrets Manager のシークレットを指定する必要があります。このステップでは、このシークレットを作成します。

Secrets Manager でシークレットを保存するには
  1. [Secrets Manager] コンソールを開き、[新しいシークレットを保存] を選択します。

  2. [シークレットのタイプを選択] で、以下のいずれかのオプションを選択します。

    • [基本情報] の下:

      • [シークレットタイプ]: Amazon DocumentDB データベース用の認証情報

      • [認証情報] で、Amazon DocumentDB クラスターへのアクセスに使用するユーザー名とパスワードを入力します。

      • [データベース]: ご使用の Amazon DocumentDB クラスターを選択します。

      • [Next] を選択します。

  3. [条件] は、以下のオプションから選択します。

    • [シークレット名]: DocumentDBSecret

    • [Next] を選択します。

  4. [Next] を選択します。

  5. [保存する] を選択します。

  6. コンソールを更新して、DocumentDBSecret シークレットが正常に保存されたことを確認します。

シークレットのシークレット ARN を書き留めておきます。これは、後のステップで必要になります。

mongo シェルをインストールする

ステップ 5: mongo シェルをインストールする

このステップでは、AWS Cloud9 環境に mongo シェルをインストールします。mongo シェルは、Amazon DocumentDB クラスターを接続してクエリするために使用するコマンドラインユーティリティです。

AWS Cloud9 環境に mongo シェルをインストールするには
  1. AWS Cloud9 コンソールを開きます。先ほど作成した DocumentDBCloud9Environment 環境の横にある [AWS Cloud9 IDE] 列の下の [開く] リンクをクリックします。

  2. ターミナルウィンドウで、次のコマンドを使用して MongoDB リポジトリファイルを作成します。

    echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
  3. 次に、以下のコマンドを使用して mongo シェルをインストールします。

    sudo yum install -y mongodb-org-shell
  4. 転送中のデータを暗号化するには、Amazon DocumentDB のパブリックキーをダウンロードします。次のコマンドでは、global-bundle.pem という名前のファイルをダウンロードします。

    wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

Amazon DocumentDB クラスターへの接続

ステップ 6: Amazon DocumentDB クラスターに接続する

これで、mongo シェルを使用して Amazon DocumentDB クラスターに接続する準備が整いました。

Amazon DocumentDB クラスターに接続するには
  1. Amazon DocumentDB コンソールを開きます。[クラスター] で、クラスター識別子を選択してクラスターを選択します。

  2. [接続とセキュリティ] タブの、[mongo シェルでこのクラスターに接続する][コピー] を選択します。

  3. AWS Cloud9 環境で、このコマンドをターミナルに貼り付けます。<insertYourPassword> を正しいパスワードと交換します。

このコマンドを入力した後、コマンドプロンプトが rs0:PRIMARY> になれば、Amazon DocumentDB クラスターに接続されています。

変更ストリームを有効にする

ステップ 7: 変更ストリームを有効にする

本チュートリアルでは、Amazon DocumentDB クラスター内にある docdbdemo データベースの products コレクションへの変更を追跡します。これを行うには、[変更ストリーム] を有効にします。まず、docdbdemo データベースを作成し、レコードを挿入してテストします。

クラスター内に新しいデータベースを作成するには
  1. AWS Cloud9 環境で、Amazon DocumentDB クラスターへの接続が維持されているかを確認します。

  2. ターミナルウィンドウで、次のコマンドを使用して、docdbdemo という名前の新しいデータベースを作成します。

    use docdbdemo
  3. 次に、以下のコマンドを使用してレコードを docdbdemo に挿入します。

    db.products.insert({"hello":"world"})

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

    WriteResult({ "nInserted" : 1 })
  4. すべてのデータベースを一覧表示するには、以下のコマンドを使用します。

    show dbs

    出力に docdbdemo データベースが含まれていることを確認してください。

    docdbdemo 0.000GB

次に、次のコマンドを使用して、docdbdemo データベースの products コレクションの変更ストリームを有効にします。

db.adminCommand({modifyChangeStreams: 1, database: "docdbdemo", collection: "products", enable: true});

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

{ "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }

インターフェイス VPC エンドポイントを作成する

ステップ 8: インターフェース VPC エンドポイントを作成する

次に、インターフェイス VPC エンドポイントを作成して、Lambda と Secrets Manager (後でクラスターアクセス認証情報を保存するために使用) がデフォルト VPC に接続できるようにします。

インターフェイス VPC エンドポイントを作成するには
  1. [VPC] コンソールを開きます。左側のメニューの [仮想プライベートクラウド] で、[エンドポイント] を選択します。

  2. [エンドポイントの作成] を選択します。次の構成でエンドポイントを作成します。

    • [名前タグ] に「lambda-default-vpc」を入力します。

    • [サービスカテゴリ] で、[AWS サービス] を選択します。

    • サービスには、検索ボックスで「lambda」と入力します。フォーマット com.amazonaws.<region>.lambda のサービスを選択してください。

    • [VPC] で「デフォルトの VPC」を 選択します。

    • サブネット には、各アベイラビリティーゾーンの横にあるボックスをチェックします。それぞれのアベイラビリティゾーンに正しいサブネット ID を選択します。

    • [IP アドレスの種類] には [IPv4] を選択します。

    • セキュリティグループには、デフォルトの VPC セキュリティグループ (default のグループ名) と、以前に作成したセキュリティグループ (DocDBTutorial のグループ名) を選択します。

    • 他のデフォルト設定をすべて維持します。

    • [エンドポイントの作成] を選択します。

  3. [エンドポイントの作成] を再び選択します。次の構成でエンドポイントを作成します。

    • [名前タグ] に「secretsmanager-default-vpc」を入力します。

    • [サービスカテゴリ] で、[AWS サービス] を選択します。

    • サービスには、検索ボックスで「secretsmanager」と入力します。フォーマット com.amazonaws.<region>.secretsmanager のサービスを選択してください。

    • [VPC] で「デフォルトの VPC」を 選択します。

    • サブネット には、各アベイラビリティーゾーンの横にあるボックスをチェックします。それぞれのアベイラビリティゾーンに正しいサブネット ID を選択します。

    • [IP アドレスの種類] には [IPv4] を選択します。

    • セキュリティグループには、デフォルトの VPC セキュリティグループ (default のグループ名) と、以前に作成したセキュリティグループ (DocDBTutorial のグループ名) を選択します。

    • 他のデフォルト設定をすべて維持します。

    • [エンドポイントの作成] を選択します。

これで、このチュートリアルのクラスターセットアップの部分は完了です。

実行ロールを作成する

ステップ 9: 実行ロールを作成する

次のステップでは、Lambda 関数を作成します。まず、クラスターにアクセスするためのアクセス許可を関数に付与する実行ロールを作成する必要があります。これを行うには、最初に IAM ポリシーを作成してから、次にこのポリシーを IAM ロールにアタッチします。

IAM ポリシーを作成するには
  1. IAM コンソールの [ポリシー] ページ を開き、[ポリシーの作成] を選択します。

  2. [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" } ] }
  3. [次へ: タグ][次へ: 確認] の順に選択します。

  4. [Name] (名前) に AWSDocumentDBLambdaPolicy と入力します。

  5. [Create policy] を選択します。

IAM ロールを作成するには
  1. IAM コンソールの [ロール] ページを開いて、[ロールの作成] を選択します。

  2. [信頼できるエンティティを選択] には、次のオプションを選択します。

    • [信頼できるエンティティタイプ]: AWS サービス

    • [ユースケース]: Lambda

    • [Next] を選択します。

  3. [アクセス権限の追加] では、作成したばかりの AWSDocumentDBLambdaPolicy ポリシーを選択し、AWSLambdaBasicExecutionRole と同様に関数に Amazon CloudWatch Logs への書き込み権限を付与します。

  4. [Next] を選択します。

  5. [Role name] (ロール名) にAWSDocumentDBLambdaExecutionRoleと入力します。

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

Lambda 関数を作成する

ステップ 10: Lambda 関数を作成する

以下のコード例を使用すれば、Amazon DocumentDB イベント入力を受け取り、そこに含まれるメッセージを処理できます。

.NET
AWS SDK for .NET
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

.NET を使用した Lambda での Amazon DocumentDB イベントの消費。

using Amazon.Lambda.Core; using System.Text.Json; using System; using System.Collections.Generic; using System.Text.Json.Serialization; //Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace LambdaDocDb; public class Function { /// <summary> /// Lambda function entry point to process Amazon DocumentDB events. /// </summary> /// <param name="event">The Amazon DocumentDB event.</param> /// <param name="context">The Lambda context object.</param> /// <returns>A string to indicate successful processing.</returns> public string FunctionHandler(Event evnt, ILambdaContext context) { foreach (var record in evnt.Events) { ProcessDocumentDBEvent(record, context); } return "OK"; } private void ProcessDocumentDBEvent(DocumentDBEventRecord record, ILambdaContext context) { var eventData = record.Event; var operationType = eventData.OperationType; var databaseName = eventData.Ns.Db; var collectionName = eventData.Ns.Coll; var fullDocument = JsonSerializer.Serialize(eventData.FullDocument, new JsonSerializerOptions { WriteIndented = true }); context.Logger.LogLine($"Operation type: {operationType}"); context.Logger.LogLine($"Database: {databaseName}"); context.Logger.LogLine($"Collection: {collectionName}"); context.Logger.LogLine($"Full document:\n{fullDocument}"); } public class Event { [JsonPropertyName("eventSourceArn")] public string EventSourceArn { get; set; } [JsonPropertyName("events")] public List<DocumentDBEventRecord> Events { get; set; } [JsonPropertyName("eventSource")] public string EventSource { get; set; } } public class DocumentDBEventRecord { [JsonPropertyName("event")] public EventData Event { get; set; } } public class EventData { [JsonPropertyName("_id")] public IdData Id { get; set; } [JsonPropertyName("clusterTime")] public ClusterTime ClusterTime { get; set; } [JsonPropertyName("documentKey")] public DocumentKey DocumentKey { get; set; } [JsonPropertyName("fullDocument")] public Dictionary<string, object> FullDocument { get; set; } [JsonPropertyName("ns")] public Namespace Ns { get; set; } [JsonPropertyName("operationType")] public string OperationType { get; set; } } public class IdData { [JsonPropertyName("_data")] public string Data { get; set; } } public class ClusterTime { [JsonPropertyName("$timestamp")] public Timestamp Timestamp { get; set; } } public class Timestamp { [JsonPropertyName("t")] public long T { get; set; } [JsonPropertyName("i")] public int I { get; set; } } public class DocumentKey { [JsonPropertyName("_id")] public Id Id { get; set; } } public class Id { [JsonPropertyName("$oid")] public string Oid { get; set; } } public class Namespace { [JsonPropertyName("db")] public string Db { get; set; } [JsonPropertyName("coll")] public string Coll { get; set; } } }
Go
SDK for Go V2
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

Go を使用して Lambda で Amazon DocumentDB イベントの消費。

package main import ( "context" "encoding/json" "fmt" "github.com/aws/aws-lambda-go/lambda" ) type Event struct { Events []Record `json:"events"` } type Record struct { Event struct { OperationType string `json:"operationType"` NS struct { DB string `json:"db"` Coll string `json:"coll"` } `json:"ns"` FullDocument interface{} `json:"fullDocument"` } `json:"event"` } func main() { lambda.Start(handler) } func handler(ctx context.Context, event Event) (string, error) { fmt.Println("Loading function") for _, record := range event.Events { logDocumentDBEvent(record) } return "OK", nil } func logDocumentDBEvent(record Record) { fmt.Printf("Operation type: %s\n", record.Event.OperationType) fmt.Printf("db: %s\n", record.Event.NS.DB) fmt.Printf("collection: %s\n", record.Event.NS.Coll) docBytes, _ := json.MarshalIndent(record.Event.FullDocument, "", " ") fmt.Printf("Full document: %s\n", string(docBytes)) }
JavaScript
SDK for JavaScript (v3)
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

JavaScript を使用して Lambda で Amazon DocumentDB イベントの消費。

console.log('Loading function'); exports.handler = async (event, context) => { event.events.forEach(record => { logDocumentDBEvent(record); }); return 'OK'; }; const logDocumentDBEvent = (record) => { console.log('Operation type: ' + record.event.operationType); console.log('db: ' + record.event.ns.db); console.log('collection: ' + record.event.ns.coll); console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2)); };

TypeScript を使用して Lambda で Amazon DocumentDB イベントの消費。

import { DocumentDBEventRecord, DocumentDBEventSubscriptionContext } from 'aws-lambda'; console.log('Loading function'); export const handler = async ( event: DocumentDBEventSubscriptionContext, context: any ): Promise<string> => { event.events.forEach((record: DocumentDBEventRecord) => { logDocumentDBEvent(record); }); return 'OK'; }; const logDocumentDBEvent = (record: DocumentDBEventRecord): void => { console.log('Operation type: ' + record.event.operationType); console.log('db: ' + record.event.ns.db); console.log('collection: ' + record.event.ns.coll); console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2)); };
PHP
SDK for PHP
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

PHP を使用して Lambda で Amazon DocumentDB イベントの消費。

<?php require __DIR__.'/vendor/autoload.php'; use Bref\Context\Context; use Bref\Event\Handler; class DocumentDBEventHandler implements Handler { public function handle($event, Context $context): string { $events = $event['events'] ?? []; foreach ($events as $record) { $this->logDocumentDBEvent($record['event']); } return 'OK'; } private function logDocumentDBEvent($event): void { // Extract information from the event record $operationType = $event['operationType'] ?? 'Unknown'; $db = $event['ns']['db'] ?? 'Unknown'; $collection = $event['ns']['coll'] ?? 'Unknown'; $fullDocument = $event['fullDocument'] ?? []; // Log the event details echo "Operation type: $operationType\n"; echo "Database: $db\n"; echo "Collection: $collection\n"; echo "Full document: " . json_encode($fullDocument, JSON_PRETTY_PRINT) . "\n"; } } return new DocumentDBEventHandler();
Python
SDK for Python (Boto3)
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

Python を使用して Lambda で Amazon DocumentDB イベントの消費。

import json def lambda_handler(event, context): for record in event.get('events', []): log_document_db_event(record) return 'OK' def log_document_db_event(record): event_data = record.get('event', {}) operation_type = event_data.get('operationType', 'Unknown') db = event_data.get('ns', {}).get('db', 'Unknown') collection = event_data.get('ns', {}).get('coll', 'Unknown') full_document = event_data.get('fullDocument', {}) print(f"Operation type: {operation_type}") print(f"db: {db}") print(f"collection: {collection}") print("Full document:", json.dumps(full_document, indent=2))
Ruby
SDK for Ruby
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

Ruby を使用して Lambda で Amazon DocumentDB イベントの消費。

require 'json' def lambda_handler(event:, context:) event['events'].each do |record| log_document_db_event(record) end 'OK' end def log_document_db_event(record) event_data = record['event'] || {} operation_type = event_data['operationType'] || 'Unknown' db = event_data.dig('ns', 'db') || 'Unknown' collection = event_data.dig('ns', 'coll') || 'Unknown' full_document = event_data['fullDocument'] || {} puts "Operation type: #{operation_type}" puts "db: #{db}" puts "collection: #{collection}" puts "Full document: #{JSON.pretty_generate(full_document)}" end
Rust
SDK for Rust
注記

GitHub には、その他のリソースもあります。サーバーレスサンプルリポジトリで完全な例を検索し、設定および実行の方法を確認してください。

Rust を使用して Lambda で Amazon DocumentDB イベントの消費。

use lambda_runtime::{service_fn, tracing, Error, LambdaEvent}; use aws_lambda_events::{ event::documentdb::{DocumentDbEvent, DocumentDbInnerEvent}, }; // Built with the following dependencies: //lambda_runtime = "0.11.1" //serde_json = "1.0" //tokio = { version = "1", features = ["macros"] } //tracing = { version = "0.1", features = ["log"] } //tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } //aws_lambda_events = "0.15.0" async fn function_handler(event: LambdaEvent<DocumentDbEvent>) ->Result<(), Error> { tracing::info!("Event Source ARN: {:?}", event.payload.event_source_arn); tracing::info!("Event Source: {:?}", event.payload.event_source); let records = &event.payload.events; if records.is_empty() { tracing::info!("No records found. Exiting."); return Ok(()); } for record in records{ log_document_db_event(record); } tracing::info!("Document db records processed"); // Prepare the response Ok(()) } fn log_document_db_event(record: &DocumentDbInnerEvent)-> Result<(), Error>{ tracing::info!("Change Event: {:?}", record.event); Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) .with_target(false) .without_time() .init(); let func = service_fn(function_handler); lambda_runtime::run(func).await?; Ok(()) }
Lambda 関数を作成するには
  1. サンプルコードを index.js という名前のファイルにコピーします。

  2. 以下のコマンドを使用して、デプロイパッケージを作成します。

    zip function.zip index.js
  3. CLI コマンドを使用して、関数を作成します。us-east-1 を AWS リージョンに、123456789012 をアカウント ID に置き換えます。

    aws lambda create-function \ --function-name ProcessDocumentDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs22.x \ --region us-east-1 \ --role arn:aws:iam::123456789012:role/AWSDocumentDBLambdaExecutionRole

Lambda イベントソースマッピングを作成します。

ステップ 11 Lambda イベントソースマッピングを作成する

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

イベントソースマッピングを作成するには
  1. Lambda コンソールの [関数] ページを開きます。

  2. 先ほど作成した ProcessDocumentDBRecords 関数を選択します。

  3. [設定] タブを選択してから、左側のメニューで [トリガー] を選択します。

  4. [Add trigger] を選択します。

  5. [トリガー設定] で、[Amazon DocumentDB] をソースとして選択します。

  6. イベントソースマッピングには、次の設定制限があります。

    • [Amazon DocumentDB クラスター]: 先ほど作成したクラスターを選択します。

    • [データベース名]: docdbdemo

    • [コレクション名]: 製品

    • [バッチサイズ]: 1

    • [開始位置]: 最新

    • [認証]: BASIC_AUTH

    • [Secrets Manager キー]: 先ほど作成した DocumentDBSecret を選択します。

    • [バッチウィンドウ]: 1

    • [フルドキュメント設定]: UpdateLookup

  7. [追加] を選択します。イベントソースマッピングの作成には数分かかる場合があります。

関数をテストする - 手動呼び出し

ステップ 12: 手動呼び出しで関数をテストする

関数とイベントソースマッピングが正しく作成されたことをテストするには、invoke コマンドを使用して関数を呼び出します。そのためには、まず次のイベント JSON を input.txt という名前のファイルにコピーします。

{ "eventSourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:canaryclusterb2a659a2-qo5tcmqkcl03", "events": [ { "event": { "_id": { "_data": "0163eeb6e7000000090100000009000041e1" }, "clusterTime": { "$timestamp": { "t": 1676588775, "i": 9 } }, "documentKey": { "_id": { "$oid": "63eeb6e7d418cd98afb1c1d7" } }, "fullDocument": { "_id": { "$oid": "63eeb6e7d418cd98afb1c1d7" }, "anyField": "sampleValue" }, "ns": { "db": "docdbdemo", "coll": "products" }, "operationType": "insert" } } ], "eventSource": "aws:docdb" }

次に、以下のコマンドを使用して、このイベントを処理する関数を呼び出します。

aws lambda invoke \ --function-name ProcessDocumentDBRecords \ --cli-binary-format raw-in-base64-out \ --region us-east-1 \ --payload file://input.txt out.txt

以下のようなレスポンスが表示されます。

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

関数がイベントを正常に処理したかどうかは、CloudWatch Logs を確認することで確認できます。

CloudWatch Logs による手動呼び出しを確認するには
  1. Lambda コンソールの [関数] ページを開きます。

  2. [モニタリング] タブから、[CloudWatch のログを表示] を選択します。これにより、CloudWatch コンソールの関数に関連する特定のロググループに移動します。

  3. 最新のログストリームを選択します。ログメッセージには、イベント JSON が表示されます。

関数のテスト - レコードを挿入

ステップ 13: レコードを挿入して関数をテストします。

Amazon DocumentDB データベースと直接やり取りして、エンドツーエンドのセットアップをテストします。次のステップでは、レコードを挿入して更新し、削除します。

レコードを挿入するには
  1. AWS Cloud9 環境の Amazon DocumentDB クラスターに再接続します。

  2. このコマンドを使用して、次の docdbdemo データベースを使用していることを確認してください。

    use docdbdemo
  3. docdbdemo データベースの products コレクションにレコードを挿入します。

    db.products.insert({"name":"Pencil", "price": 1.00})

関数のテスト - レコードの更新

ステップ 14: レコードを更新して機能をテストします。

次に、以下のコマンドを使用して、挿入したレコードを更新します。

db.products.update( { "name": "Pencil" }, { $set: { "price": 0.50 }} )

CloudWatch Logs をチェックして、関数がこのイベントを正常に処理したことを確認します。

関数のテスト - レコードの削除

ステップ 15: レコードを削除して機能をテストします。

最後に、次のコマンドを使用して更新したレコードを削除します。

db.products.remove( { "name": "Pencil" } )

CloudWatch Logs をチェックして、関数がこのイベントを正常に処理したことを確認します。

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

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

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

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

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

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

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

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

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

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

VPC エンドポイントを削除するには
  1. [VPC] コンソールを開きます。左側のメニューの [仮想プライベートクラウド] で、[エンドポイント] を選択します。

  2. 作成したエンドポイントを選択します。

  3. [Actions] (アクション)、[Delete VPC endpoints] (VPC エンドポイントを削除) の順に選択します。

  4. テキスト入力フィールドに delete を入力します。

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

Amazon DocumentDB クラスターを削除するには
  1. Amazon DocumentDB コンソールを開きます。

  2. 本チュートリアル用に作成した Amazon DocumentDB クラスターを選択し、削除保護を無効にします。

  3. メインの [クラスター] ページで、作成した Amazon DocumentDB クラスターを再度選択します。

  4. [アクション][削除] の順に選択します。

  5. [最終クラスタースナップショットの作成][いいえ] を選択します。

  6. テキスト入力フィールドに delete を入力します。

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

シークレットを Secrets Manager で削除するには
  1. Secrets Manager コンソールを開きます。

  2. このチュートリアルで作成したシークレットを選択します。

  3. [アクション][シークレットの削除] を選択します。

  4. [Schedule deletion] (削除をスケジュールする) を選択します。

Amazon EC2 セキュリティグループを削除するには
  1. EC2 コンソールを開きます。[ネットワークとセキュリティ] で、[セキュリティグループ] を選択します。

  2. このチュートリアルで作成したセキュリティグループを選択します。

  3. [アクション][セキュリティグループの削除] の順に選択します。

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

AWS Cloud9 環境を削除するには
  1. AWS Cloud9 コンソールを開きます。

  2. このチュートリアル用に作成した環境を選択します。

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

  4. テキスト入力フィールドに delete を入力します。

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