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 トピックのモニタリングをご参照ください。
Amazon SNS の Amazon CloudWatch メトリクスで、NumberOfMessagesPublished メトリクスを確認します 。関数の呼び出しに使用している IAM エンティティによって行われた Publish リクエストが NumberOfMessagesPublished メトリクスに記録されない場合は、次の手順を実行します。
1. Publish API リクエストを行っている IAM エンティティに、SNS トピックに発行するために必要なアクセス許可があることを確認します。詳細および特定のポリシーステートメントの例については、Amazon SNS のアクセスコントロールのケース例を参照してください。
2. SNS トピックのアクセス許可ポリシーにより、Publish API 呼び出しを行う IAM エンティティが "SNS:Publish" アクションを使用することが許可されていることを確認します。アクセス許可ポリシーの詳細と例については、Amazon SNS トピックのアクセス許可を参照してください。
関数のアクセス許可ポリシーを表示するには、AWS Lambda のリソースベースのポリシーを使用するの手順に従います。関数のポリシーに SNS トピックの "lambda:invokeFunction" アクションが含まれていない場合は、必要なアクセス許可を含めるようにポリシーを更新します。
Amazon SNS の CloudWatch メトリクスで、NumberOfNotificationsFilteredOut メトリクスを確認します。関数を呼び出すために使用している IAM エンティティによって行われた Publish リクエストが NumberOfNotificationsFilteredOut メトリクスに表示されている場合は、次の手順を実行します。
1. 以下の手順を実行して、Lambda 関数の SNS トピックサブスクリプションフィルターポリシーを表示します。 Amazon SNS コンソールを開きます。 左側のナビゲーションパネルで、[Subscriptions] (サブスクリプション) を選択します。 [Edit] (編集) ページで、[Subscription filter policy] (サブスクリプションフィルターポリシー) セクションを展開します。
2. サブスクリプションフィルターポリシーを確認して、Publish リクエストメッセージ属性がフィルターポリシーで必要な属性と一致することを確認します。属性が一致しない場合は、Publish リクエストメッセージ属性を更新して、フィルターポリシーで必要な属性と一致するようにします。
注: 詳細については、Amazon SNS サブスクリプションのフィルターポリシーを参照してください。
「「レートを超過しました」というエラーと 429「TooManyRequestsException」というエラーの Lambda 関数のスロットリングをトラブルシューティングするにはどうすればよいですか?」の手順に従います。
AWS リージョンでホストされている Amazon SNS トピックは、同じ AWS リージョンに存在しない Lambda 関数を呼び出すことはできません。Amazon SNS がサポートするリージョンの最新リストについては、「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'});