CloudWatch アラームによってトリガーされたときに Amazon SNS が Lambda 関数を呼び出さないのはなぜですか?

所要時間2分
0

Amazon CloudWatch アラームによってトリガーされたときに、Amazon Simple Notification Service (Amazon SNS) が AWS Lambda 関数を呼び出すようにしたいと考えています。

簡単な説明

次のシナリオでは、Lambda 関数を呼び出せません。

  • Lambda 関数のリソースポリシーが、SNS トピックから関数を呼び出すためのアクセスを許可していない。このシナリオでは、「Lambda 関数のリソースベースのポリシードキュメントを確認する」セクションの手順を実行します。
  • Lambda 関数の呼び出しが遅延する。このシナリオでは、「Amazon SNS 配信ログを確認する」セクションの手順を実行します。

注: この解決策は、SNSトピックで Publish APIを呼び出すことはできるが、Amazon SNS と Lambda の統合でエラーが発生していることを前提としています。SNS トピックでアクティビティが見られない場合は、「CloudWatch アラームトリガーの SNS 通知を受信しなかったのはなぜですか?」を参照してください。 そのアクティビティには、次の CloudWatch メトリクスが含まれることがあります。 NumberOfMessagesPublishedNumberOfNotificationsDeliveredNumberOfNotificationsFailed

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

Lambda 関数のリソースベースのポリシードキュメントを確認する

Amazon SNS が Lambda 関数を非同期で呼び出すと、Lambda は 202 HTTP ステータスコードを Amazon SNS に返します。ステータスコードは、Lambda がメッセージを後で処理するために受け入れたことを示します。詳細については、「Asynchronous invocation」を参照してください。応答が失敗した場合は、Amazon SNS の配信ログで詳細を確認してください。

アカウントのシナリオに基づいて解決策を選択します。

SNS トピックと Lambda 関数が同じアカウントにある場合:

1.    Lambda コンソールを開きます。

2.    ナビゲーションペインで [関数] を選択し、目的の関数を選択します。

3.    [設定] タブを選択し、[許可] を選択します。

4.    [リソースベースのポリシー] セクションで、[ステートメント ID] 列からポリシーステートメントを選択するとポリシードキュメントが表示されます。表示されるポリシードキュメントは次のとおりです。

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

注: JSON でポリシードキュメントを表示するには、 [リソースベースのポリシー] セクションで ** [ポリシードキュメントを表示]** を選択します。

関数を呼び出すためのアクセス許可を Amazon SNS に付与する Lambda リソースポリシーがない場合は、ポリシードキュメントに次の関数を追加します。ここでは、Lambda コンソール、AWS CLI、または AWS CloudShell を使用します。

コマンドラインは以下のように使用します。

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

注: your-lambda-function-nameyour-aws-regionyour-aws-account-idyour-sns-topic-nameは、ご自身の値で置き換えます。AWS CLI コマンドはデフォルトの AWS リージョンを使用します。Lambda 関数が別のリージョンにある場合は、--region フラグを使用してデフォルトのリージョンをオーバーライドできます。

Lambda コンソールは以下のように使用します。

1.    Lambda コンソールを開きます。

2.    ナビゲーションペインで [関数] を選択し、目的の関数を選択します。

3.    [設定] タブを選択し、[許可] を選択します。

4.    [リソースベースのポリシー] セクションで、[許可を追加] を選択します。

5.    [プリンシパル] には [sns.amazonaws.com] を選択します。

6.    [アクション] には [Lambda:InvokeFunction] を選択します。

7.    **[ステートメント ID]**には一意の ID を入力します。

8.    [保存] を選択します。

SNS トピックと Lambda 関数が異なるアカウントにある場合:

1.    cross-account permissions を設定します。

2.    CloudWatch ログで、配信ステータスのログ記録を使用して、Amazon SNS による Lambda または NumberOfNotificationsDelivered CloudWatch メトリクスへのメッセージ送信が正常に完了したことを確認します。

Amazon SNS と Lambda の間の成功した応答の例:

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

Amazon SNS の配信ログを確認する

SNS トピックの Lambda 関数への配信ログを確認します。 応答が成功すると、202 ステータスコードが表示されます。

SNS トピックの CloudWatch ログを表示するには、次の操作を行います。

1.    CloudWatch コンソールを開きます。

2.    ナビゲーションペインで [ログ] を選択し、次に [ロググループ] を選択します。

3.    フィルターの検索ボックスに、SNS トピックの名前を入力します。SNS トピックの 2 つのロググループが表示されます。1 つは成功用、もう 1 つは失敗用です。

4.    成功のロググループを選択します。

5.    [ログストリーム] セクションで [すべて検索] を選択します。

注: [最終のイベント時刻] 列でリクエストのタイムスタンプを確認することもできます。次に、Lambda 関数の Amazon リソースネーム (ARN) と名前を検索します。

6.    [ログストリーム] 列でログストリームを選択して開きます。

結果が表示されない場合は、次の操作を行います。

1.    [ロググループ] で、失敗のロググループを選択します。

2.    [ログストリーム] セクションで [すべて検索] を選択します。

3.    [ログストリーム] 列でログストリームを選択して開きます。

失敗したロググループのトラブルシューティングを行うには、次の操作を行います。

1.    Lambda 関数の X-Ray トレース滞留時間が長くないか確認します。長い場合は、CloudWatch コンソールを使用して、そのリージョンの Lambda 関数のエラーとスロットルの数が最も少ないことを確認します。すべての関数を選択してから、エラースロットルのメトリクスを選択してください。

注: 内部の Lambda キューは、関数全体で何百ものエラーやスロットルが非同期で呼び出された場合でもバックアップできます。  このバックアップにより、関数の呼び出しに遅延が生じる可能性があります。望ましくない遅延を避けるために、エラーとスロットルレートを最小限に抑えることをお勧めします。詳細については、「Asynchronous invocation」を参照してください。

2.    送信先の Amazon Simple Queue Service (Amazon SQS) キューまたは Lambda 関数 を個別に処理するように設定します。これにより、メッセージの損失が回避されます。Lambda 関数の非同期イベントの最大経過時間が 6 時間になる可能性があるため、この処理が実行されます。

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

関連するコンテンツ