Amazon SNS 通知を使用した Lambda 関数の呼び出し - AWS Lambda

Amazon SNS 通知を使用した Lambda 関数の呼び出し

Lambda 関数を使用して、Amazon Simple Notification Service (Amazon SNS) 通知を処理することができます。Amazon SNS では、トピックに送信されるメッセージのターゲットとして Lambda 関数がサポートされます。関数は、同じアカウントまたは他の AWS アカウントのトピックにサブスクライブできます。詳細なチュートリアルについては、「チュートリアル: Amazon Simple Notification Service での AWS Lambda の使用」を参照してください。

Lambda は、標準 SNS トピックの SNS トリガーのみをサポートします。FIFO トピックはサポートされていません。

Lambda は、メッセージをキューに入れ、再試行を処理することで、SNS メッセージを非同期的に処理します。Amazon SNS が Lambda に到達できない場合、またはメッセージが拒否される場合、Amazon SNS は、数時間にわたって間隔を増やして再試行します。詳細については、Amazon SNS のよくある質問の中の信頼性を参照してください。

警告

Lambda 非同期呼び出しは各イベントを少なくとも 1 回処理し、レコードの重複処理が発生する可能性があります。重複するイベントに関連する潜在的な問題を避けるため、関数コードを冪等にすることを強くお勧めします。詳細については、AWS ナレッジセンターの「Lambda 関数を冪等にするにはどうすればよいですか?」を参照してください。

Powertools for AWS Lambda のべき等性ユーティリティ

Powertools for AWS Lambda のべき等性ユーティリティは、Lambda 関数をべき等にします。Python、TypeScript、Java、および .NET で使用できます。詳細については、Powertools for AWS Lambda (Python) ドキュメントの「べき等性ユーティリティ」、Powertools for AWS Lambda (TypeScript) ドキュメントの「べき等性ユーティリティ」、Powertools for AWS Lambda (Java) ドキュメントの「べき等性ユーティリティ」、および Powertools for AWS Lambda (.NET) ドキュメントの「べき等性ユーティリティ」を参照してください。

コンソールを使用した Lambda 関数の Amazon SNS トピックトリガーの追加

SNS トピックを Lambda 関数のトリガーとして追加する最も簡単な方法は、Lambda コンソールを使用することです。コンソールからトリガーを追加すると、Lambda は SNS トピックからのイベントの受信を開始するために必要なアクセス許可とサブスクリプションを自動的に設定します。

SNS トピックを Lambda 関数のトリガーとして追加するには (コンソール)
  1. Lambda コンソールの関数ページを開きます。

  2. トリガーを追加する対象の関数の名前を選択します。

  3. [設定] を選択し、[トリガー] を選択します。

  4. [トリガーを追加] を選択します。

  5. [トリガーの設定] の下のドロップダウンリストから [SNS] を選択します。

  6. [SNS トピック] で、サブスクライブする SNS トピックを選択します。

Lambda 関数の Amazon SNS トピックトリガーの手動追加

Lambda 関数の SNS トリガーを手動で設定するには、次のステップを完了する必要があります。

  • 関数に対するリソースベースのポリシーを定義して、SNS がその関数を呼び出すことを許可します。

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

    注記

    SNS トピックと Lambda 関数が異なる AWS アカウントにある場合は、SNS トピックへのクロスアカウントサブスクリプションを許可するための追加のアクセス許可も付与する必要があります。詳細については、「Amazon SNS サブスクリプションのクロスアカウントのアクセス許可を付与する」を参照してください。

AWS Command Line Interface (AWS CLI) を使用して、これらの両方のステップを完了できます。まず、SNS 呼び出しを許可するためのリソースベースのポリシーを Lambda 関数に対して定義するには、次の AWS CLI コマンドを使用します。--function-name の値は Lambda 関数名に置き換え、--source-arn の値は SNS トピック ARN に置き換えてください。

aws lambda add-permission --function-name example-function \ --source-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \ --statement-id function-with-sns --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com

関数を SNS トピックにサブスクライブするには、次の AWS CLI コマンドを使用します。--topic-arn の値は SNS トピック ARN に置き換え、--notification-endpoint の値は Lambda 関数 ARN に置き換えてください。

aws sns subscribe --protocol lambda \ --region us-east-1 \ --topic-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \ --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:example-function

SNS イベントシェイプのサンプル

Amazon SNS は、メッセージやメタデータが含まれたイベントを使用して、関数を非同期的に呼び出します。

例 Amazon SNS メッセージイベント
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2019-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda", "Subject": "TestInvoke" } } ] }