如何设置带有 SNS 主题的跨账户 AWS Lambda 订阅?

2 分钟阅读
0

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

  1. 打开 Amazon SNS 控制台,然后在左侧面板中选择主题
  2. 选择创建主题,选择主题类型,然后输入主题名称
  3. 向下滚动并选择创建主题

允许账户 B 对该主题执行订阅操作。

  1. 编辑主题访问策略以向账户 B 授予 sns:Subscribe 权限。
  2. 添加如下所示的策略声明,然后保存
{
  "Sid": "Allow-AccountB-To-Subscribe",
  "Effect": "Allow",
  "Principal": {
    "AWS": ""
  },
  "Action": "sns:Subscribe",
  "Resource": ""
}

注意:对于主体,将其 <AccountB> 替换为您的具有 Lambda 函数的账号。对于资源字段,将其 <SNSTopicARN> 替换为您的 SNS 主题的 Amazon 资源名称(ARN)。

在账户 B 中创建 Lambda 函数

  1. AWS Lambda 控制台上打开函数页面。然后选择创建函数
  2. 输入函数名称
  3. 对于执行角色,请选择创建具有基本 Lambda 权限的新角色。Lambda 创建了一个执行角色,向该函数授予将日志上传到 Amazon CloudWatch 的权限。
  4. 向下滚动并选择创建函数按钮。

通过在 Lambda 控制台上添加触发器来订阅 Lambda 函数(选项 1)

  1. AWS Lambda 控制台上打开函数页面,然后选择您之前创建的函数。
  2. 选择添加触发器按钮。
  3. 在触发器配置页面上,从下拉列表中选择 SNS
  4. 将主题 ARN 复制到 SNS 主题字段中。
  5. 选择添加按钮。

账户 A 中的 SNS 主题现在可以在账户 B 中调用您的 Lambda 函数。

测试配置

测试方式:向 SNS 主题发布消息。
注意: 当您从 Lambda 控制台添加触发器时,Lambda 会自动为 Amazon SNS 添加必要的权限,以便从该触发器调用您的 Lambda 函数。

通过从 SNS 控制台添加订阅来订阅 Lambda 函数(选项 2)

此选项要求您明确授予 SNS 服务主体执行 lambda:InvokeFunction 操作的权限。

允许 SNS 服务主体调用 Lambda 函数。

在 Lambda 控制台的函数页面上,选择您之前创建的函数。然后完成以下步骤:

  1. 选择配置选项卡,然后选择权限
  2. 向下滚动到基于资源的策略部分。然后,选择添加权限按钮。
  3. 选择 AWS 服务,然后从下拉列表中选择 SNS。然后,填写以下字段:
    语句 ID 设置为 AllowSNSToInvokeFunction
    将之前创建的 SNS 主题的 ARN 复制到源 ARN
    操作中选择 lambda:InvokeFunction
  4. 选择保存
  5. 为 Lambda 创建 SNS 订阅。

从账户 B 打开 Amazon SNS 控制台

  1. 在左侧面板上,选择订阅
  2. 选择创建订阅按钮。
  3. 将账户 A 中的 SNS 主题的 ARN 复制到主题 ARN 字段中。
  4. 协议下拉列表中选择 AWS Lambda
  5. 将 Lambda 函数的 ARN 复制到端点字段中
  6. 向下滚动并选择创建订阅按钮。

**注意:**确保从拥有 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 主题时,为什么收到授权错误消息?

AWS 官方
AWS 官方已更新 10 个月前