跳至内容

如何设置带有 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 控制台,然后在左侧面板中选择 Topics(主题)。
  2. 选择 Create topic(创建主题),再选择 Topic type(主题类型),然后输入 Topic name(主题名称)。
  3. 向下滚动并选择 Create Topic(创建主题)。

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

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

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

在账户 B 中创建 Lambda 函数

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

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

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

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

测试配置

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

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

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

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

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

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

从账户 B 打开 Amazon SNS 控制台

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

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