我想将我的 AWS Lambda 函数订阅到另一个账户中的 Amazon Simple Notification Service (Amazon SNS) 主题。
简短描述
使用 Amazon SNS 控制台,向 Amazon SNS 主题添加跨账户 AWS Lambda 订阅。
解决方法
先决条件
在开始之前,请确保:
- Lambda 函数资源策略允许 SNS 调用该函数。
- SNS 主题访问策略允许 Lambda 订阅该主题。
注意: SNS 主题位于账户 A 中,Lambda 函数位于账户 B 中。
订阅跨账户 Lambda 函数
可以通过两种方法为 SNS 主题订阅跨账户 Lambda 函数:
- 在账户 B 中通过 Lambda 控制台添加 SNS 触发器
- 在账户 B(具有 Lambda 函数的账户)中通过 SNS 控制台添加 Lambda 订阅
创建资源
在账户 A 中创建 SNS 主题:
- 打开 Amazon SNS 控制台,然后在左侧面板中选择主题。
- 选择创建主题,选择主题类型,然后输入主题名称。
- 向下滚动并选择创建主题。
允许账户 B 对该主题执行订阅操作。
- 编辑主题访问策略以向账户 B 授予 sns:Subscribe 权限。
- 添加如下所示的策略声明,然后保存:
{
"Sid": "Allow-AccountB-To-Subscribe",
"Effect": "Allow",
"Principal": {
"AWS": ""
},
"Action": "sns:Subscribe",
"Resource": ""
}
注意:对于主体,将其 <AccountB> 替换为您的具有 Lambda 函数的账号。对于资源字段,将其 <SNSTopicARN> 替换为您的 SNS 主题的 Amazon 资源名称(ARN)。
在账户 B 中创建 Lambda 函数:
- 在 AWS Lambda 控制台上打开函数页面。然后选择创建函数。
- 输入函数名称。
- 对于执行角色,请选择创建具有基本 Lambda 权限的新角色。Lambda 创建了一个执行角色,向该函数授予将日志上传到 Amazon CloudWatch 的权限。
- 向下滚动并选择创建函数按钮。
通过在 Lambda 控制台上添加触发器来订阅 Lambda 函数(选项 1)
- 在 AWS Lambda 控制台上打开函数页面,然后选择您之前创建的函数。
- 选择添加触发器按钮。
- 在触发器配置页面上,从下拉列表中选择 SNS。
- 将主题 ARN 复制到 SNS 主题字段中。
- 选择添加按钮。
账户 A 中的 SNS 主题现在可以在账户 B 中调用您的 Lambda 函数。
测试配置
测试方式:向 SNS 主题发布消息。
注意: 当您从 Lambda 控制台添加触发器时,Lambda 会自动为 Amazon SNS 添加必要的权限,以便从该触发器调用您的 Lambda 函数。
通过从 SNS 控制台添加订阅来订阅 Lambda 函数(选项 2)
此选项要求您明确授予 SNS 服务主体执行 lambda:InvokeFunction 操作的权限。
允许 SNS 服务主体调用 Lambda 函数。
在 Lambda 控制台的函数页面上,选择您之前创建的函数。然后完成以下步骤:
- 选择配置选项卡,然后选择权限。
- 向下滚动到基于资源的策略部分。然后,选择添加权限按钮。
- 选择 AWS 服务,然后从下拉列表中选择 SNS。然后,填写以下字段:
将语句 ID 设置为 AllowSNSToInvokeFunction
将之前创建的 SNS 主题的 ARN 复制到源 ARN
在操作中选择 lambda:InvokeFunction
- 选择保存。
- 为 Lambda 创建 SNS 订阅。
从账户 B 打开 Amazon SNS 控制台。
- 在左侧面板上,选择订阅。
- 选择创建订阅按钮。
- 将账户 A 中的 SNS 主题的 ARN 复制到主题 ARN 字段中。
- 从协议下拉列表中选择 AWS Lambda。
- 将 Lambda 函数的 ARN 复制到端点字段中
- 向下滚动并选择创建订阅按钮。
**注意:**确保从拥有 Lambda 函数的 AWS 账户(账户 B)将 Lambda 函数订阅到 SNS 主题。如果您尝试使用具有 SNS 主题的账户(账户 A)创建订阅,则会出现以下错误:
Error code: AccessDeniedException - Error message: User: arn:aws:sts::XXXXXXX:XXXXXXX/XXXXX/XXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:region:XXXXXXX:function:XXXXXXX
相关信息
结合使用 AWS Lambda 与 Amazon Simple Notification Service
当我尝试将 Lambda 函数订阅到 Amazon SNS 主题时,为什么收到授权错误消息?