AWS Lambda
開発者ガイド

チュートリアル: Amazon Simple Notification Service で AWS Lambda を使用する

1 つの AWS アカウントの Lambda 関数を使用して、別の AWS アカウントにある Amazon SNS トピックをサブスクライできます。このチュートリアルでは AWS Command Line Interface を使用して、Lambda 関数の作成、Amazon SNS トピックの作成、これら 2 つのリソースに相互にアクセスするアクセス権限の付与などの AWS Lambda オペレーションを実行します。

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。まだ作成していない場合は、AWS Lambda の使用開始 の指示に従って、まず Lambda 関数を作成します。

このガイドの手順に従うには、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/lambda-project$ this is a command this is output

コマンドが長い場合は、エスケープ文字 (\) を使用して、コマンドを複数の行に分割します。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

このチュートリアルでは、2 つのアカウントを使用します。この AWS CLI コマンドは、それぞれが別のアカウントで使用されるように設定された 2 つの 名前付きプロファイル を使用して実行します。異なる名前のプロファイル、またはデフォルトのプロファイルと名前付きのプロファイルを使用する場合、必要に応じてコマンドを変更します。

Amazon SNS トピックの作成

アカウント A からソース Amazon SNS トピックを作成します。

$ aws sns create-topic --name lambda-x-account --profile accountA

コマンドによって返されるトピックの ARN をメモします。これは、Lambda 関数にアクセス権限を追加してトピックをサブスクライブするときに必要になります。

実行ロールを作成する

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

実行ロールを作成するには

  1. IAM コンソールの [Roles] ページを開きます。

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

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

    • [信頼されたエンティティ] – [AWS Lambda]。

    • [アクセス許可] – [AWSLambdaBasicExecutionRole]。

    • ロール名lambda-sns-role

AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

Lambda 関数の作成

アカウント B で、Amazon SNS からのイベントを処理する関数を作成します。以下のコード例では、Amazon SNS イベント入力を受け取り、含まれるメッセージを処理します。このコードでは説明のために、受信イベントデータの一部が CloudWatch Logs に書き込まれます。

注記

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

例 index.js

console.log('Loading function'); exports.handler = function(event, context, callback) { // console.log('Received event:', JSON.stringify(event, null, 4)); var message = event.Records[0].Sns.Message; console.log('Message received from SNS:', message); callback(null, "Success"); };

関数を作成するには

  1. サンプルコードを index.js という名前のファイルにコピーします。

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

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

    $ aws lambda create-function --function-name SNS-X-Account \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs8.10 \ --role arn:aws:iam::01234567891B:role/service-role/lambda-sns-execution-role \ --timeout 60 --profile accountB

コマンドによって返される関数の ARN をメモします。これは、Amazon SNS に関数の呼び出しを許可するアクセス権限を追加するときに必要になります。

クロスアカウント権限のセットアップ

アカウント A から、アカウント B にトピックをサブスクライブするアクセス権限を付与します。

$ aws sns add-permission --label lambda-access --aws-account-id 12345678901B \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --action-name Subscribe ListSubscriptionsByTopic Receive --profile accountA

アカウント B から、Amazon SNS からの呼び出しを許可する Lambda アクセス権限を追加します。

$ aws lambda add-permission --function-name SNS-X-Account \ --source-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --statement-id sns-x-account --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB { "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-2:01234567891A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}" }

ポリシーを追加する際に、--source-account パラメータを使用してソースアカウントを Lambda ポリシーに追加しないでください。ソースアカウントは Amazon SNS イベントソースとしてサポートされていないため、アクセスが拒否されます。

サブスクリプションの作成

アカウント B から、Lambda 関数でトピックをサブスクライブします。メッセージがアカウント A の lambda-x-account トピックに送信されると、Amazon SNS はアカウント B から SNS-X-Account 関数を呼び出します。

$ aws sns subscribe --protocol lambda \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --notification-endpoint arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account \ --profile accountB { "SubscriptionArn": "arn:aws:sns:us-east-2:12345678901A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }

出力には、トピックのサブスクリプションの ARN が含まれています。

サブスクリプションのテスト

アカウント A でサブスクリプションをテストします。テキストファイルに「Hello World」と入力して、message.txt として保存します。次に、以下のコマンドを実行します。

$ aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --profile accountA

これは、メッセージが Amazon SNS サービスによって承諾されたことを示す一意の識別子があるメッセージ ID を返します。Amazon SNS は次に、これをトピックのサブスクライブに配信することを試みます。また、message パラメーターに直接 JSON 文字列を入力することもできますが、テキストファイルを使用するとメッセージに改行を使用できます。

Amazon SNS の詳細については、「Amazon Simple Notification Service とは」を参照してください。