メニュー
AWS Lambda
開発者ガイド

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

このセクションでは、CLI コマンドを使用して、Lambda 関数アカウントおよび Amazon SNS トピックアカウントにアクセス権限を設定し、サブスクリプションをテストします。

  1. アカウント A から Amazon SNS トピックを作成:

    Copy
    aws sns create-topic \ --name lambda-x-account

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

  2. アカウント B から Lambda 関数を作成します。ランタイムパラメータには、デプロイパッケージを作成したときに選択したコードサンプルによって、nodejs6.10nodejs4.3python3.6python2.7 または java8 のいずれかを選択します。

    Copy
    aws lambda create-function \ --function-name SNS-X-Account \ --runtime runtime language \ --role role arn \ --handler handler-name \ --description "SNS X Account Test Function" \ --timeout 60 \ --memory-size 128 \ --zip-file fileb://path/LambdaWithSNS.zip

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

  3. アカウント A からアカウント B にトピックをサブスクライブするアクセス権限を追加します。

    Copy
    aws sns add-permission \ --region us-east-1 \ --topic-arn Amazon SNS topic arn \ --label lambda-access \ --aws-account-id B \ --action-name Subscribe ListSubscriptionsByTopic Receive
  4. アカウント B から、Amazon SNS からの呼び出しを許可する Lambda アクセス権限を追加します。

    Copy
    aws lambda add-permission \ --function-name SNS-X-Account \ --statement-id sns-x-account \ --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com \ --source-arn Amazon SNS topic arn

    これに応じて、Lambda が以下の JSON コードを返します。ステートメント値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列のバージョンです。

    Copy
    { "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-1:B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-1:A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}" }

    注記

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

  5. アカウント B から、Lambda 関数でトピックをサブスクライブします。

    Copy
    aws sns subscribe \ --topic-arn Amazon SNS topic arn \ --protocol lambda \ --notification-endpoint arn:aws:lambda:us-east-1:B:function:SNS-X-Account

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

    Copy
    { "SubscriptionArn": "arn:aws:sns:us-east-1:A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
  6. これで、アカウント A でサブスクリプションをテストできます。テキストファイルに「Hello World」と入力して、message.txt として保存します。次に、以下のコマンドを実行します。

    Copy
    aws sns publish \ --topic-arn arn:aws:sns:us-east-1:A:lambda-x-account \ --message file://message.txt \ --subject Test

    メッセージが Amazon SNS サービスに受け入れられたことを示す、一意の識別子を伴うメッセージ ID が返されます。その後、Amazon SNS はトピックのサブスクライバーにこのメッセージの配信を試みます。

注記

また、message パラメーターに直接 JSON 文字列を入力することもできますが、テキストファイルを使用するとメッセージに改行を使用できます。

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