我想将我的 AWS Lambda 函数订阅到 AWS 账户中的 Amazon Simple Notification Service (Amazon SNS) 主题。该如何操作?
解决方法
**注意:**本文遵循教程:将 AWS Lambda 与 Amazon Simple Notification Service 结合使用中的说明。但是,本文提供了同一账户设置说明。有关先决条件和跨账户设置说明,请参阅此教程。
1. 运行以下命令创建 Amazon SNS 主题:
**注意:**请将 lambda-same-account 替换为您所需的主题名称。
$ aws sns create-topic --name lambda-same-account
记下命令输出中返回的主题 Amazon Resource Name (ARN)。稍后您会用到此信息。
2. 为 Lambda 创建执行角色以访问 AWS 资源。记下角色的 ARN。稍后您会用到此信息。
3. 创建部署程序包。(执行教程中的步骤 1 和 2。)
4. 运行以下命令创建 Lambda 函数:
**注意:**请将 sns-same-account 替换您所需的函数名称。将 arn:aws:iam::123456789012:role/service-role/lambda-sns-role 替换为执行角色的 ARN。
$ aws lambda create-function --function-name sns-same-account \
--zip-file fileb://function.zip --handler index.handler --runtime nodejs14.x \
--role arn:aws:iam::123456789012:role/service-role/lambda-sns-role \
--timeout 60
记下命令输出中返回的函数的 ARN。在下一步中,您需要用到它。
5. 运行以下命令为您的 Amazon SNS 主题添加 Lambda 权限:
**注意:**请将 sns-same-account 替换为您指定的函数名称。将 arn:aws:sns:us-east-1:123456789012:lambda-same-account 替换为您的主题的 ARN。
$ aws lambda add-permission --function-name sns-same-account \
--source-arn arn:aws:sns:us-east-1:123456789012:lambda-same-account \
--statement-id sns-same-account --action "lambda:InvokeFunction" \
--principal sns.amazonaws.com
6. 运行以下命令以将 Lambda 函数订阅到 Amazon SNS 主题:
**注意:**请将 arn:aws:sns:us-east-1:123456789012:lambda-same-account 替换为您的主题的 ARN。将 arn:aws:lambda:us-east-1:123456789012:function:sns-same-account 替换为您的函数的 ARN。
$ aws sns subscribe --protocol lambda \
--topic-arn arn:aws:sns:us-east-1:123456789012:lambda-same-account \
--notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:sns-same-account
7. 运行以下命令,通过发布示例消息来测试订阅:
**注意:**请将 arn:aws:sns:us-east-1:123456789012:lambda-same-account 替换为您的主题的 ARN。
$ aws sns publish --message "Hello World" --subject Test \
--topic-arn arn:aws:sns:us-east-1:123456789012:lambda-same-account
命令输出会返回消息 ID,确认消息已发布到您的主题。
8. (可选)运行以下命令以确认 Amazon CloudWatch Logs 中是否已调用 Lambda 函数:
**注意:**请将 sns-same-account 替换为您的函数名称。
$ aws logs describe-log-streams --log-group-name /aws/lambda/sns-same-account
记下返回的 logStreamName。然后,使用以下命令检索日志:
**注意:**请将 sns-same-account 替换为您函数的名称,将 logStreamName 替换为 describe-log-streams 返回的 logStreamName。
$ aws logs get-log-events --log-group-name /aws/lambda/sns-same-account \
--log-stream-name 'logStreamName'
相关信息
通过 Amazon SNS 调用 AWS Lambda 函数