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 トピックを作成します。
- Amazon SNS コンソールを開き、左側のパネルで [トピック] を選択します。
- [トピックの作成] を選択し、[トピックタイプ] を選択して、[トピック名] を入力します。
- 下にスクロールして [トピックを作成] を選択します。
アカウント B がトピックに対して登録アクションを実行することを許可します。
- トピックアクセスポリシーを編集して、アカウント B に SNS: Subscribe 権限を付与します。
- 以下に示すポリシーステートメントを追加し、保存します。
{
"Sid": "Allow-AccountB-To-Subscribe",
"Effect": "Allow",
"Principal": {
"AWS": ""
},
"Action": "sns:Subscribe",
"Resource": ""
}
注:****[プリンシパル] で、 <AccountB> Lambda 関数を持つアカウント番号に置換します。[リソース] フィールドで、 <SNSTopicARN> SNS トピックの Amazon リソースネーム (ARN) に置換します。
アカウント B に Lambda 関数を作成します。
- AWS Lambda コンソールの [関数] ページを開きます。[関数を作成] を選択します。
- 関数名を入力します。
- [実行ロール] で、[基本的な Lambda 権限を持つ新しいロールを作成する] を選択します。Lambda は、関数が Amazon CloudWatch にログをアップロードするためのアクセス権を付与する [実行ロール] を作成します。
- 下にスクロールして、[関数の作成] ボタンを選択します。
Lambda コンソールにトリガーを追加して Lambda 関数をする (オプション 1)
- AWS Lambda コンソールの [関数] ページを開き、以前に作成した関数を選択します。
- [トリガーを追加] ボタンを選択します。
- トリガー設定ページで、ドロップダウンリストから [SNS] を選択します。
- **[SNS トピック]**フィールドに、トピック ARN を貼り付けます。
- [追加] ボタンを選択します。
アカウント A の SNS トピックがアカウント B の Lambda 関数を呼び出すことができるようになりました。
設定をテストする
SNS トピックにメッセージを公開してテストします。
注: Lambda コンソールからトリガーを追加すると、Lambda は Amazon SNS に対してこのトリガーから Lambda 関数を呼び出すために必要なアクセス権限を自動的に追加します。
SNS コンソールからサブスクリプションを追加して Lambda 関数を登録する (オプション 2)
このオプションでは、lambda:InvokeFunction アクションを実行するためのアクセス権限を SNS サービスプリンシパルに明示的に付与する必要があります。
SNS サービスプリンシパルが Lambda 関数を呼び出すことを許可します。
Lambda コンソールの関数ページで、前に作成した関数を選択します。その後、以下の手順を実行します。
- [設定] タブを選択し、 [権限] を選択します。
- [リソースベースのポリシー] セクションまでスクロールします。次に、[権限の追加] ボタンを選択します。
- [AWS サービス] を選択し、ドロップダウンリストから [SNS] を選択します。次に、フィールドに値を入力します。
[ステートメント ID] で、AllowSNSToInvokeFunction に設定します
[ソース ARN] で、以前に作成した SNS トピックの ARN を貼り付けます
[アクション] で [lambda:InvokeFunction] を選択します
- [保存] を選択します。
- Lambda の SNS サブスクリプションを作成します。
アカウント B から、Amazon SNS コンソールを開きます。
- 左側のパネルで [サブスクリプション] を選択します。
- [サブスクリプションの作成] ボタンを選択します。
- アカウント A の SNS トピックの ARN を [トピック ARN] フィールドに貼り付けます。
- [プロトコル] ドロップダウンリストから [AWS Lambda] を選択します。
- Lambda 関数の ARN を [エンドポイント] フィールドに貼り付けます。
- 下にスクロールして、[サブスクリプションを作成] ボタンを選択します。
**注:**必ず、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 トピックに登録しようとすると認証エラーが発生するのはなぜですか?