チュートリアル: クロスアカウント Amazon SQS キューをイベントソースとして使用する - AWS Lambda

チュートリアル: クロスアカウント Amazon SQS キューをイベントソースとして使用する

このチュートリアルでは、別のAWSアカウントで、 Amazon Simple Queue Service (Amazon SQS) キューからのメッセージを使用する Lambda 関数を作成します。  このチュートリアルには 2 つのAWSアカウントが含まれています: アカウント A Lambda 関数を含むアカウントを参照します。アカウント B Amazon SQS キューを含むアカウントを参照します。

前提条件

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

以下の手順を完了するには、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 ドキュメントを含むコマンドを再フォーマットする必要があります。

実行ロールを作成する (アカウント A)

アカウント A で、必要なAWSリソースにアクセスするためのアクセス許可を関数に付与する実行ロールを作成します。

実行ロールを作成するには
  1. AWS Identity and Access Management (IAM) コンソールの [Roles page (ロールページ)] を開きます。

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

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

    • 信頼されたエンティティ - AWS Lambda

    • アクセス許可 - AWSLambdaSQSQueueExecutionRole

    • [ロール名]cross-account-lambda-sqs-role

AWSLambdaSQSQueueExecutionRole ポリシーには、Amazon SQS から項目を読み取り、Amazon CloudWatch Logs にログを書き込むために関数が必要とするアクセス許可があります。

関数を作成する (アカウント A)

[アカウント A] で、Amazon SQS メッセージを処理する Lambda 関数を作成します。Lambda 関数と Amazon SQS キューは同じ AWS リージョンに存在する必要があります。

この例では、Node.js 18 コードが各メッセージを CloudWatch Logs のログに書き込みます。

例 index.mjs
export const handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }
関数を作成するには
注記

以下の手順を実行すると、Node.js 18 で関数が作成されます。他の言語では、手順は似ていますが、いくつかの詳細が異なります。

  1. サンプルコードをファイル名 index.mjs で保存します。

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

    zip function.zip index.mjs
  3. create-function AWS Command Line Interface (AWS CLI) コマンドを使用して関数を作成します。

    aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role

関数をテストする (アカウント A)

アカウント A で、invoke AWS CLIコマンドおよびサンプルの Amazon SQS イベントを使用して、手動で Lambda 関数をテストします。

ハンドラーが例外をスローせずに正常に戻る場合、Lambda はメッセージが正しく処理されたと見なし、キュー内の新しいメッセージの読み取りを開始します。メッセージが正常に処理された後、Lambdaはメッセージをキューから自動的に削除します。ハンドラーが例外をスローした場合、Lambda はメッセージの バッチが正常に処理されなかったと見なし、Lambdaは同じメッセージのバッチで関数を呼び出します。

  1. 次の JSON をファイル名 input.txt で保存します。

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue", "awsRegion": "us-east-1" } ] }

    "body"にキューからの実際のメッセージが含まれている場合、先行する JSON は、Amazon SQS が Lambda 関数に送信する可能性のあるイベントをシミュレートします。

  2. 次の invoke AWS CLI コマンドを実行します。

    aws lambda invoke --function-name CrossAccountSQSExample \ --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 でサポートされているグローバルコマンドラインオプション」を参照してください。

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

Amazon SQS キュー を作成する (アカウント B)

アカウント B で、アカウント A の Lambda 関数がイベントソースとして使用できる Amazon SQS キューを作成します。Lambda 関数と Amazon SQS キューは同じ AWS リージョンに存在する必要があります。

キューを作成するには
  1. Amazon SQS コンソール を開きます。

  2. [キューの作成] を選択します。

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

    • タイプスタンダード

    • 名前LambdaCrossAccountQueue

    • 設定 – デフォルト設定のままにします。

    • アクセスポリシー – [Advanced (アドバンスト)] を選択します。次の JSON ポリシーをペーストします:

      { "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue" } ] }

      このポリシーは、アカウント A で Lambda 実行ロールに、この Amazon SQS キューからのメッセージを使用するアクセス許可を付与します。

  4. キューの作成後、Amazon リソースネーム (ARN)を記録します。こちらは、次のセクションでキューを Lambda 関数と関連付ける際に必要になります。

イベントソースを設定する (アカウント A)

[アカウント A] で、[アカウント B] の Amazon SQS キューと Lambda 関数の間に、次の create-event-source-mapping AWS CLIコマンドを実行してイベントソースマッピングを作成します。

aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

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

aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

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

これにより、次のようにセットアップをテストできます。

  1. アカウント BAmazon SQS コンソールを開きます。

  2. 前に作成した [LambdaCrossAccountQueue] を選択します。

  3. [メッセージの送信と受信] を選択します。

  4. [メッセージ本文] にテストメッセージを入力します。

  5. [メッセージの送信] を選択します。

[アカウント A] の Lambda 関数がメッセージを受信します。Lambda はキューに更新をポーリングし続けます。新しいメッセージがあると、Lambda はキューからのこの新しいイベントデータを使用して関数を呼び出します。   関数が実行され、Amazon CloudWatch にログが作成されます。CloudWatch コンソールでログを表示できます。

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

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

[アカウント A] で、実行ロールと Lambda 関数をクリーンアップします。

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

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

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

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

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

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

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

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

[アカウント B] で、Amazon SQS キューをクリーンアップします。

Amazon SQS キューを削除するには
  1. AWS Management Console にサインインし、Amazon SQS コンソール (https://console.aws.amazon.com/sqs/) を開きます。

  2. 作成したキューを選択します。

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

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

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