SNS トピックを使用してクロスアカウントの AWS Lambda サブスクリプションをセットアップする方法を教えてください。

所要時間2分
0

AWS Lambda 関数を別のアカウントの Amazon Simple Notification Service (Amazon SNS) トピックに登録したいと考えています。

簡単な説明

Amazon SNS コンソールを使用して、クロスアカウントの AWS Lambda サブスクリプションを Amazon SNS トピックに追加します。

解決策

前提条件

始める前に、次のことを確認してください。

  • Lambda 関数リソースポリシーにより、SNS は関数を呼び出すことができます。
  • SNS トピックアクセスポリシーにより、Lambda はトピックに登録できます。

: SNS トピックはアカウント A にあり、Lambda 関数はアカウント B にあります。

クロスアカウントの Lambda 関数を登録する

クロスアカウントの Lambda 関数を SNS トピックに登録するには、次の 2 つの方法があります。

  • アカウント B の Lambda コンソールから SNS トリガーを追加します。
  • アカウント B (Lambda 関数を使用するアカウント) の SNS コンソールから Lambda サブスクリプションを追加します。

リソースを作成する

アカウント A に SNS トピックを作成します。

  1. Amazon SNS コンソールを開き、左側のパネルで [トピック] を選択します。
  2. [トピックの作成] を選択し、[トピックタイプ] を選択して、[トピック名] を入力します。
  3. 下にスクロールして [トピックを作成] を選択します。

アカウント B がトピックに対して登録アクションを実行することを許可します。

  1. トピックアクセスポリシーを編集して、アカウント B に SNS: Subscribe 権限を付与します。
  2. 以下に示すポリシーステートメントを追加し、保存します
{
  "Sid": "Allow-AccountB-To-Subscribe",
  "Effect": "Allow",
  "Principal": {
    "AWS": ""
  },
  "Action": "sns:Subscribe",
  "Resource": ""
}

注:****[プリンシパル] で、 <AccountB> Lambda 関数を持つアカウント番号に置換します。[リソース] フィールドで、 <SNSTopicARN> SNS トピックの Amazon リソースネーム (ARN) に置換します。

アカウント B に Lambda 関数を作成します。

  1. AWS Lambda コンソールの [関数] ページを開きます。[関数を作成] を選択します。
  2. 関数名を入力します。
  3. [実行ロール] で、[基本的な Lambda 権限を持つ新しいロールを作成する] を選択します。Lambda は、関数が Amazon CloudWatch にログをアップロードするためのアクセス権を付与する [実行ロール] を作成します。
  4. 下にスクロールして、[関数の作成] ボタンを選択します。

Lambda コンソールにトリガーを追加して Lambda 関数をする (オプション 1)

  1. AWS Lambda コンソール[関数] ページを開き、以前に作成した関数を選択します。
  2. [トリガーを追加] ボタンを選択します。
  3. トリガー設定ページで、ドロップダウンリストから [SNS] を選択します。
  4. **[SNS トピック]**フィールドに、トピック ARN を貼り付けます。
  5. [追加] ボタンを選択します。

アカウント A の SNS トピックがアカウント B の Lambda 関数を呼び出すことができるようになりました。

設定をテストする

SNS トピックにメッセージを公開してテストします。
: Lambda コンソールからトリガーを追加すると、Lambda は Amazon SNS に対してこのトリガーから Lambda 関数を呼び出すために必要なアクセス権限を自動的に追加します。

SNS コンソールからサブスクリプションを追加して Lambda 関数を登録する (オプション 2)

このオプションでは、lambda:InvokeFunction アクションを実行するためのアクセス権限を SNS サービスプリンシパルに明示的に付与する必要があります。

SNS サービスプリンシパルが Lambda 関数を呼び出すことを許可します。

Lambda コンソールの関数ページで、前に作成した関数を選択します。その後、以下の手順を実行します。

  1. [設定] タブを選択し、 [権限] を選択します。
  2. [リソースベースのポリシー] セクションまでスクロールします。次に、[権限の追加] ボタンを選択します。
  3. [AWS サービス] を選択し、ドロップダウンリストから [SNS] を選択します。次に、フィールドに値を入力します。
    [ステートメント ID] で、AllowSNSToInvokeFunction に設定します
    [ソース ARN] で、以前に作成した SNS トピックの ARN を貼り付けます
    [アクション][lambda:InvokeFunction] を選択します
  4. [保存] を選択します。
  5. Lambda の SNS サブスクリプションを作成します。

アカウント B から、Amazon SNS コンソールを開きます。

  1. 左側のパネルで [サブスクリプション] を選択します。
  2. [サブスクリプションの作成] ボタンを選択します。
  3. アカウント A の SNS トピックの ARN を [トピック ARN] フィールドに貼り付けます。
  4. [プロトコル] ドロップダウンリストから [AWS Lambda] を選択します。
  5. Lambda 関数の ARN を [エンドポイント] フィールドに貼り付けます。
  6. 下にスクロールして、[サブスクリプションを作成] ボタンを選択します。

**注:**必ず、Lambda 関数がある AWS アカウント (アカウント B) から Lambda 関数を SNS トピックに登録してください。SNS トピックを持つアカウント (アカウント A) からサブスクリプションを作成しようとすると、次のエラーが表示されます。

Error code: AccessDeniedException - Error message: User: arn:aws:sts::XXXXXXX:XXXXXXX/XXXXX/XXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:region:XXXXXXX:function:XXXXXXX

関連情報

Amazon Simple Notification Service で AWS Lambda を使用する

Lambda 関数を Amazon SNS トピックに登録しようとすると認証エラーが発生するのはなぜですか?

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません