如何在同一账户中将 Lambda 函数订阅到 Amazon SNS 主题?

上次更新时间:2021 年 4 月 22 日

我想将我的 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'

这篇文章对您有帮助吗?


您是否需要账单或技术支持?