使用 Amazon SNS 通知叫用 Lambda 函數 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon SNS 通知叫用 Lambda 函數

您可以使用 Lambda 函數來處理 Amazon Simple Notification Service (Amazon SNS) 通知。Amazon SNS 支援 Lambda 函數作為傳送至主題之訊息的目標。您可以將自己的函數訂閱至相同帳戶或其他 AWS 帳戶中的主題。如需詳細演練,請參閱教學課程:搭 AWS Lambda 配 Amazon 簡易通知服務使用

Lambda 僅支援標準 SNS 主題的 SNS 觸發器。不支援先進先出主題。

針對非同步叫用,Lambda 會將訊息排入佇列並處理重試。如果 Amazon SNS 無法連接至 Lambda 或訊息遭到拒絕,Amazon SNS 會在數小時中以增加的間隔重試。如需詳細資訊,請參閱 Amazon SNS 常見問答集中的可靠性

警告

Lambda 事件來源對應至少處理每個事件一次,並且可能會重複處理記錄。為了避免與重複事件相關的潛在問題,我們強烈建議您將函數代碼設為冪等。若要深入了解,請參閱 AWS 知識中心如何讓 Lambda 函數具有冪等性

使用主控台為 Lambda 函數新增 Amazon SNS 主題觸發器

若要將 SNS 主題新增為 Lambda 函數的觸發器,最簡單的方法是使用 Lambda 主控台。當您透過主控台新增觸發器時,Lambda 會自動設定必要的權限和訂閱,以開始接收來自 SNS 主題的事件。

若要將 SNS 主題新增為 Lambda 函數 (主控台) 的觸發器
  1. 開啟 Lambda 主控台中的函數頁面

  2. 選擇您要為其新增觸發程式的函數名稱。

  3. 選擇 [組態],然後選擇 [觸發器]。

  4. 選擇 Add trigger (新增觸發條件)

  5. 在 [觸發器設定] 下方的下拉式功能表中,選擇 [SNS]。

  6. 對於 SNS 主題,請選擇要訂閱的 SNS 主題。

為 Lambda 函數手動新增 Amazon SNS 主題觸發器

若要手動設定 Lambda 函數的 SNS 觸發器,您需要完成下列步驟:

  • 為您的函數定義以資源為基礎的策略,以允許 SNS 調用它。

  • 向 Amazon SNS 主題訂閱您的 Lambda 函數。

    注意

    如果您的 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" } } ] }