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

所要時間3分
0

AWS Lambda 関数を Amazon Simple Notification Service (Amazon SNS) トピックにサブスクライブしようとすると、認証エラーが発生します。どうすればこのエラーを解決できますか?

簡単な説明

Lambda 関数を SNS トピックにサブスクライブすると、次の理由で認証エラーが発生することがあります。

  • Lambda 関数が含まれている AWS アカウントとは別の AWS アカウントからサブスクリプションを作成しようとした。
  • または -
  • サブスクリプションの作成に使用した AWS Identity and Access Management (IAM) アイデンティティに、次の API オペレーションを実行するための許可がない。
    (Lambda) AddPermission
    (Amazon SNS) Subscribe

この問題を解決するには、エラーの原因に応じて、次のいずれかを実行する必要があります。

  • 関数が存在する AWS アカウントから、Lambda 関数を SNS トピックにサブスクライブしていることを確認します。
  • または -
  • 使用している IAM アイデンティティに、Lambda AddPermission および SNS Subscribe API オペレーションの両方を実行する許可があることを確認します。

解決方法

Lambda が返すエラーメッセージに基づいて、エラーの原因を確認する

関数が存在する AWS アカウントとは異なる AWS アカウントからサブスクリプションを作成すると、Lambda は次のいずれかのエラーを返します。

AWS CLI のエラー例: Lambda 関数が含まれているアカウントとは別のアカウントからサブスクリプションを作成しようとした

An error occurred (AuthorizationError) when calling the Subscribe operation: The account YOUR_AWS_ACCOUNT_ID_1 is not the owner of the endpoint arn:aws:lambda:us-east-1:YOUR_AWS_ACCOUNT_ID_2:function: your_Lambda_function_ARN

AWS マネジメントコンソールのエラー例: Lambda 関数が含まれているアカウントとは別のアカウントからサブスクリプションを作成しようとした

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:us-west-2:XXXXXXX:function:XXXXXXX

正しいアカウントを使用しているが、IAM アイデンティティに必要な許可がない場合、Lambda または SNS は次のいずれかのエラーを返します。

AWS CLI のエラー例: サブスクリプションの作成に使用した IAM アイデンティティに、Lambda AddPermission アクションを実行するための許可がない

An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::XXXXXXX:user/XXXXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:us-west-2:XXXXXX:function:XXXXXXX because no identity-based policy allows the lambda:AddPermission action

AWS マネジメントコンソールのエラー例: サブスクリプションの作成に使用した IAM アイデンティティに、Lambda AddPermission アクションを実行するための許可がない

Error code: AccessDeniedException - Error message: User: arn:aws:sts:XXXXXXXX:assumed-role/XXXXXXXX/XXXXX-XXXXXX is not 
authorized to perform: lambda:AddPermission on resource: 
arn:aws:lambda:us-west-2:XXXXXXXXX:function:XXXXXXX because no 
identity-based policy allows the lambda:AddPermission action

SNS Subscribe アクションを実行するための許可がない IAM アイデンティティを使用しようとした場合の AWS CLI エラー例

An error occurred (AuthorizationError) when calling the Subscribe operation: User: arn:aws:iam::XXXXXXX:user/XXXXXXXX is not authorized to perform: SNS:Subscribe on resource: arn:aws:sns:us-west-2:XXXXXXXX:XXXXXXX because no resource-based policy allows the SNS:Subscribe action

関数が存在する AWS アカウントから、Lambda 関数を SNS トピックにサブスクライブしていることを確認する

Lambda コンソールまたは AWS CLI を使用して、Lambda 関数を SNS トピックにサブスクライブできます。

Lambda コンソールを使用して SNS トピックに関数をサブスクライブするには

注: Lambda コンソールを使用して SNS トリガーを追加すると、コンソールはプリンシパル service:sns.amazonaws.com からの lambda:InvokeFunction 許可を自動的に許可します。

1.    Lambda コンソールの関数ページで関数を選択します。

2.    [Overview] (概要) で、[Add trigger] (トリガーを追加) を選択します。

3.    [トリガーの設定] で、[Select a trigger] (トリガーの選択)、[SNS] の順に選択します。

4.    [SNS トピック] に、別の AWS アカウントから SNS トピックの Amazon リソースネーム (ARN) を貼り付けます。

5.    [トリガーの有効化] チェックボックスをオンにします。

6.    [Add] (追加) を選択します。

詳細については、「Lambda 関数オプションの設定」を参照してください。

注: 次のエラーが表示された場合は、使用している IAM アイデンティティに Subscribe API アクションの許可を付与する必要があります。トラブルシューティングの手順については、「Amazon SNS トピックにサブスクライバーを追加しようとするときの認証エラーを解決するにはどうすればよいですか?」の記事を参照してください。

An error occurred (AuthorizationError) when calling the Subscribe operation: User: your_IAM_user_or_role is not authorized to perform: SNS:Subscribe on resource: your_SNS_topic_ARN

AWS CLI を使用して SNS トピックに関数をサブスクライブするには

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

1.    Lambda 関数が存在する AWS アカウントに属する IAM ユーザーを使用して AWS CLI を設定します。

aws configure --profile-name your_profile_name

重要: IAM ユーザーの AWS アクセスキー IDシークレットキーを必ず渡してください。

2.    プリンシパル service:sns.amazonaws.com から lambda:InvokeFunction アクセス許可を追加して、SNS トピックからの Lambda 呼び出しを許可します。

aws lambda add-permission --function-name your_lambda_function_name --statement-id sns_invoke_permission --action lambda:InvokeFunction --principal sns.amazonaws.com --source-arn your_sns_topic_arn

3.    Lambda 関数を SNS トピックにサブスクライブします。

aws sns subscribe --topic-arn your_sns_topic_ARN --protocol lambda --notification-endpoint your_lambda_function_arn --profile your_profile_name_passed_on_#1

注: 次のエラーが表示された場合は、使用している IAM アイデンティティに Subscribe API アクションの許可を付与する必要があります。トラブルシューティングの手順については、「Amazon SNS トピックにサブスクライバーを追加しようとするときの認証エラーを解決するにはどうすればよいですか?」の記事を参照してください。

An error occurred (AuthorizationError) when calling the Subscribe operation: User: your_IAM_user_or_role is not authorized to perform: SNS:Subscribe on resource: your_SNS_topic_ARN

Lambda AddPermission および SNS Subscribe API オペレーションを実行するための許可が、使用している IAM アイデンティティにあることを確認する

IAM アイデンティティのアイデンティティベースのポリシーを確認します。IAM アイデンティティが次の両方のアクションを実行することをポリシーで明示的に許可していることを確認します。
lambda:AddPermission
SNS:Subscribe

アイデンティティベースのポリシーが必要な許可を付与しない場合は、必要な許可をポリシーに追加します。その後、関数が存在する AWS アカウントから、Lambda 関数を SNS トピックにサブスクライブします。


コメントはありません

関連するコンテンツ