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 関数を冪等にするにはどうすればよいですか?
トピック
コンソールを使用した Lambda 関数の Amazon SNS トピックトリガーの追加
SNS トピックを Lambda 関数のトリガーとして追加する最も簡単な方法は、Lambda コンソールを使用することです。コンソールからトリガーを追加すると、Lambda は SNS トピックからのイベントの受信を開始するために必要なアクセス許可とサブスクリプションを自動的に設定します。
SNS トピックを Lambda 関数のトリガーとして追加するには (コンソール)
Lambda コンソールの [関数ページ]
を開きます。 -
トリガーを追加する対象の関数の名前を選択します。
-
[設定] を選択し、[トリガー] を選択します。
-
[Add trigger] を選択します。
-
[トリガーの設定] の下のドロップダウンリストから [SNS] を選択します。
-
[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-arnarn: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-endpointarn: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"
}
}
]
}