Amazon SNS が AWS Lambda 関数を呼び出さないのはなぜですか? また、問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 6 月 3 日

AWS Lambda 関数を使用して Amazon Simple Notification Service (Amazon SNS) 通知を処理していますが、Amazon SNS トピックが関数を呼び出しません。Lambda 関数を呼び出さない Amazon SNS 通知をトラブルシューティングするにはどうすればよいですか?

簡単な説明

Amazon SNS メッセージイベントSNS トピックにサブスクライブしている Lambda 関数を呼び出さない場合、次の 5 つの理由が考えられます。

解決方法

重要: まだ設定していない場合は、Amazon SNS トピックの Amazon CloudWatch 配信ステータスログ記録を設定します。詳細については、CloudWatch を使用した Amazon SNS トピックのモニタリングをご参照ください。

SNS トピックに発行している IAM ID に、SNS トピックに発行するために必要なアクセス許可があることを確認する

Amazon SNS の Amazon CloudWatch メトリクスで、NumberOfMessagesPublished メトリクスを確認します 。関数の呼び出しに使用している IAM エンティティによって行われた Publish リクエストが NumberOfMessagesPublished メトリクスに記録されない場合は、次の手順を実行します。

1.    Publish API リクエストを行っている IAM エンティティに、SNS トピックに発行するために必要なアクセス許可があることを確認します。詳細および特定のポリシーステートメントの例については、Amazon SNS のアクセスコントロールのケース例を参照してください。

2.    SNS トピックのアクセス許可ポリシーにより、Publish API 呼び出しを行う IAM エンティティが "SNS:Publish" アクションを使用することが許可されていることを確認します。アクセス許可ポリシーの詳細と例については、Amazon SNS トピックのアクセス許可を参照してください。

Amazon SNS が関数を呼び出すことを許可するために必要なアクセス許可が Lambda 関数にあることを確認する

関数のアクセス許可ポリシーを表示するには、AWS Lambda のリソースベースのポリシーを使用するの手順に従います。関数のポリシーに SNS トピックの "lambda:invokeFunction" アクションが含まれていない場合は、必要なアクセス許可を含めるようにポリシーを更新します。

Lambda 関数のフィルターポリシーが SNS トピックから送信されるメッセージ属性と一致することを確認します。

Amazon SNS の CloudWatch メトリクスで、NumberOfNotificationsFilteredOut メトリクスを確認します。関数を呼び出すために使用している IAM エンティティによって行われた Publish リクエストが NumberOfNotificationsFilteredOut メトリクスに表示されている場合は、次の手順を実行します。

1.    以下の手順を実行して、Lambda 関数の SNS トピックサブスクリプションフィルターポリシーを表示します。
Amazon SNS コンソールを開きます。
左側のナビゲーションパネルで、[Subscriptions] (サブスクリプション) を選択します。
[Edit] (編集) ページで、[Subscription filter policy] (サブスクリプションフィルターポリシー) セクションを展開します。

2.    サブスクリプションフィルターポリシーを確認して、Publish リクエストメッセージ属性がフィルターポリシーで必要な属性と一致することを確認します。属性が一致しない場合は、Publish リクエストメッセージ属性を更新して、フィルターポリシーで必要な属性と一致するようにします。

注: 詳細については、Amazon SNS サブスクリプションのフィルターポリシーを参照してください。

Lambda 関数がスロットリングされていないことを確認する

(商用リージョンでホストされている SNS トピックの場合) Lambda 関数が SNS トピックと同じリージョンでホストされていることを確認する

注: 商用 AWS リージョンでホストされている Amazon SNS トピックは、商用リージョンに存在しない Lambda 関数を呼び出すことはできません。Amazon SNS がサポートする AWS リージョンの最新リストについては、Amazon Simple Notification Service エンドポイントとクォータを参照してください。

Lambda 関数の Amazon リソースネーム (ARN) と Amazon SNS トピックを確認します。Amazon SNS トピックが商用 AWS リージョンでホストされており、その関数がオプトインリージョンでホストされている場合は、次の手順を実行します。

1.    Amazon SNS トピックと同じリージョンで、新しい Lambda 関数を作成します。

2.    オプトインリージョンでホストされている関数に対して Invoke API 呼び出しを行うように、関数の設定を構成します。

重要: SDK リージョン設定を更新してください。

リージョン設定を変更する Python (Boto 3) コマンドの例

#us-east-1 client
lambda_us_east_1_client = boto3.client('lambda',  region_name='us-east-1')
#us_west_1 client
lambda_us_west_1_client = boto3.client('lambda',  region_name='us-west-1')

リージョン設定を変更する JavaScript/Node.js コマンドの例

//us-east-1 client
var lambda_us_east_1_client = new AWS.Lambda({apiVersion: '2015-03-31',region: 'us-east-1'});
//us_west_1 client
var lambda_us_east_1_client = new AWS.Lambda({apiVersion: '2015-03-31', region: 'us-west-1'});

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?