使用 Amazon SNS 通知调用 Lambda 函数
您可以使用 Lambda 函数处理 Amazon Simple Notification Service (Amazon SNS) 通知。Amazon SNS 支持将 Lambda 函数作为发送到主题的消息的目标。您可以将函数订阅到同一账户或其他 AWS 账户中的主题。有关详细的演练过程,请参阅教程:将 AWS Lambda 与 Amazon Simple Notification Service 结合使用。
Lambda 仅支持标准 SNS 主题的 SNS 触发器。不支持 FIFO 主题。
对于异步调用,Lambda 对消息排队并处理重试。如果无法联系到 Lambda 或消息被拒绝,Amazon SNS 将在几个小时内以递增的间隔重试。有关详细信息,请参阅 Amazon SNS 常见问题中的可靠性
警告
Lambda 事件源映射至少处理每个事件一次,有可能出现重复处理记录的情况。为避免与重复事件相关的潜在问题,我们强烈建议您将函数代码设为幂等性。要了解更多信息,请参阅 AWS 知识中心的如何使我的 Lambda 函数具有幂等性
主题
使用控制台为 Lambda 函数添加 Amazon SNS 主题触发器
要添加 SNS 主题作为 Lambda 函数的触发器,最简单的方法是使用 Lambda 控制台。当您通过控制台添加触发器时,Lambda 会自动设置必要的权限和订阅以开始从 SNS 主题接收事件。
添加 SNS 主题作为 Lambda 函数的触发器(控制台)
打开 Lamba 控制台的函数页面
。 -
选择您要为其添加触发器的函数的名称。
-
选择配置,然后选择触发器。
-
选择添加触发器。
-
在触发器配置下的下拉菜单中,选择 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" } } ] }