AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:将 AWS Lambda 与 Amazon Simple Notification Service 结合使用

您可以在一个 AWS 账户中使用 Lambda 函数来订阅单独的 AWS 账户中的 Amazon SNS 主题。在本教程中,您使用 AWS Command Line Interface 执行 AWS Lambda 操作,例如,创建 Lambda 函数,创建 Amazon SNS 主题以及授予权限以允许这两类资源相互访问。

先决条件

This tutorial assumes that you have some knowledge of basic Lambda operations and the Lambda console. If you haven't already, follow the instructions in 开始使用 AWS Lambda to create your first Lambda function.

To follow the procedures in this guide, you will need a command line terminal or shell to run commands. Commands are shown in listings preceded by a prompt symbol ($) and the name of the current directory, when appropriate:

~/lambda-project$ this is a command this is output

For long commands, an escape character (\) is used to split a command over multiple lines.

On Linux and macOS, use your preferred shell and package manager. On Windows 10, you can install the Windows Subsystem for Linux to get a Windows-integrated version of Ubuntu and Bash.

在本教程中,您将使用两个账户。AWS CLI 命令通过以下方式对此进行说明:使用两个命名配置文件,每个配置为用于不同的账户。如果您使用具有不同名称的配置文件,或者使用默认配置文件和一个命名配置文件,请根据需要修改命令。

创建一个 Amazon SNS 主题

从账户 A,创建源 Amazon SNS 主题。

$ aws sns create-topic --name lambda-x-account --profile accountA

记下该命令返回的主题 ARN。在将权限添加到 Lambda 函数以订阅主题时,需要使用此 ARN。

创建执行角色

从账户 B 中,创建执行角色,此角色向您的函数授予访问 AWS 资源的权限。

创建执行角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 Create role (创建角色)

  3. 创建具有以下属性的角色。

    • 可信任的实体AWS Lambda

    • 权限AWSLambdaBasicExecutionRole

    • 角色名称 (角色名称)lambda-sns-role

AWSLambdaBasicExecutionRole 策略具有函数将日志写入 CloudWatch Logs 所需的权限。

创建 Lambda 函数

从账户 B 中,创建处理来自 Amazon SNS 的事件的函数。以下示例代码接收 Amazon SNS 事件输入并对其所包含的消息进行处理。为了展示这个过程,代码会将一些传入的事件数据写入 CloudWatch Logs。

注意

有关使用其他语言的示例代码,请参阅 示例函数代码

例 index.js

console.log('Loading function'); exports.handler = function(event, context, callback) { // console.log('Received event:', JSON.stringify(event, null, 4)); var message = event.Records[0].Sns.Message; console.log('Message received from SNS:', message); callback(null, "Success"); };

创建函数

  1. 将示例代码复制到名为 index.js 的文件中。

  2. 创建部署程序包。

    $ zip function.zip index.js
  3. 使用 create-function 命令创建 Lambda 函数。

    $ aws lambda create-function --function-name SNS-X-Account \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs8.10 \ --role arn:aws:iam::01234567891B:role/service-role/lambda-sns-execution-role \ --timeout 60 --profile accountB

记下该命令返回的函数 ARN。在添加权限以允许 Amazon SNS 调用函数时,需要使用此 ARN。

设置跨账户权限

从账户 A 中,授予账户 B 订阅主题的权限:

$ aws sns add-permission --label lambda-access --aws-account-id 12345678901B \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --action-name Subscribe ListSubscriptionsByTopic Receive --profile accountA

从账户 B 中,添加 Lambda 权限以允许从 Amazon SNS 进行调用。

$ aws lambda add-permission --function-name SNS-X-Account \ --source-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --statement-id sns-x-account --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB { "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-2:01234567891A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}" }

在添加策略时,请不要使用 --source-account 参数将源账户添加到 Lambda 策略。Amazon SNS 事件源不支持源账户,并且将导致访问被拒绝。

创建订阅

从账户 B 中,将 Lambda 函数订阅到主题。在将消息发送到账户 A 中的 lambda-x-account 主题时,Amazon SNS 将调用账户 B 中的 SNS-X-Account 函数。

$ aws sns subscribe --protocol lambda \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --notification-endpoint arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account \ --profile accountB { "SubscriptionArn": "arn:aws:sns:us-east-2:12345678901A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }

输出包含主题订阅的 ARN。

测试订阅

从账户 A 中测试订阅。在一个文本文件中键入 Hello World,并将该文本文件另存为 message.txt。然后运行以下命令:

$ aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --profile accountA

这将返回一个具有唯一标识符的消息 ID,指示 Amazon SNS 服务已接受消息。然后,Amazon SNS 会尝试将它传输给主题订阅者。或者,您可以直接将 JSON 字符串提供给 message 参数,但使用文本文件将允许消息中出现换行符。

要了解有关 Amazon SNS 的更多信息,请参阅什么是 Amazon Simple Notification Service