如何设置 Amazon S3 事件通知来调用另一个 AWS 账户中的 Lambda 函数?

2 分钟阅读
0

我希望我的 Amazon Simple Storage Service (Amazon S3) 存储桶调用另一个 AWS 账户中的 AWS Lambda 函数。

解决方法

要设置 Amazon S3 存储桶以使其调用另一个 AWS 账户中的 Lambda 函数,请完成以下步骤:

  1. 更新 Lambda 函数的基于资源的权限策略,向 Amazon S3 授予调用权限
  2. 创建 Amazon S3 事件通知来调用您的 Lambda 函数

**重要事项:**Lambda 函数必须与您的 S3 存储桶位于同一 AWS 区域中。

有关如何迁移函数的信息,请参阅如何使用 Lambda 控制台将 Lambda 函数迁移到另一个 AWS 账户或区域?

更新 Lambda 函数的基于资源的权限策略,向 Amazon S3 授予调用权限

AWS 管理控制台

要更新 Lambda 函数的基于资源的权限策略以向 Amazon S3 授予调用权限,请完成以下步骤:

  1. 使用 Lambda 函数所在的 AWS 账户,在 Lambda 控制台上打开 Functions page(函数页面)。
  2. 选择您希望由 Amazon S3 调用的 Lambda 函数的名称。
  3. Configuration(配置)选项卡中,选择 Permissions(权限)。
  4. Resource-based policy(基于资源的策略)部分,选择 Add permissions(添加权限)。
  5. Policy statement(策略声明)窗格中,选择 AWS service(AWS 服务)。随即将出现 Service(服务)下拉列表。
  6. Service(服务)下拉列表中,选择 S3 以查看更多字段。
  7. 对于 Statement ID(语句 ID),输入唯一的语句 ID 以区分您在策略中创建的语句。
  8. 对于 Source account(源账户),输入托管您的 S3 存储桶的账户的 AWS 账户 ID
  9. 对于 Source ARN(来源 ARN),输入您的 S3 存储桶的 ARN。请使用下列格式:
    arn:aws:s3:::bucket_name
    **注意:**将 bucket_name 替换为您的 S3 存储桶的名称。
  10. 对于 Action(操作),从下拉列表中选择 lambda:InvokeFunction
  11. 选择 Save(保存)。

有关更多信息,请参阅在 Lambda 中使用基于资源的策略

AWS CLI

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误消息,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

更新您的 Lambda 函数的基于资源的权限策略,使用类似于以下内容的 add-permission API 向 Amazon S3 授予调用权限:

aws lambda add-permission \--function-name LambdaFunction_name \
--action lambda:InvokeFunction \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::bucket_name \
--source-account account-id \
--statement-id "unique_statement_ID"

注意:LambdaFunction_namebucket_nameunique_statement_ID 替换为您的变量。

创建 Amazon S3 事件通知来调用您的 Lambda 函数

AWS 管理控制台

按照说明使用 Amazon S3 控制台来激活和配置事件通知

AWS CLI

要创建调用您的 Lambda 函数的 Amazon S3 事件通知,请使用 put-bucket-notification-configuration 命令。

**重要事项:**在使用 put-bucket-notification 命令之前,请确认您没有在 S3 存储桶上配置任何其他事件通知。put-bucket-notification-configuration 命令会对任何现有的通知配置执行替换操作,而不是附加操作。

要检查您的存储桶是否已经有事件通知,请运行以下命令:

aws s3api get-bucket-notification-configuration --bucket bucket_name

如果前面的命令返回空的 JSON 对象或没有响应,则表明您没有现有的事件通知配置。使用以下配置创建并保存一个名为 notification.json 的新文件:

{
"LambdaFunctionConfigurations": [
    {
      "Id": "my-lambda-function-s3-event-configuration",
      "LambdaFunctionArn": "LambdaFunction_ARN",
      "Events": [ "s3:ObjectCreated:" ],
      "Filter": {
        "Key": {
          "FilterRules": [
            {
              "Name": "prefix"|"suffix",
              "Value": "string"
            }
          ]
        }
      }
    }
  ]
}

**注意:**将 LambdaFunction_ARN 替换为您的 Lambda 函数 ARN。将前缀和后缀替换为筛选规则的变量。

如果 get-bucket-notification-configuration 返回现有的事件通知配置 JSON,则将现有 JSON 配置另存为名为 notification.json 的文件。将您的新 Lambda 通知配置添加到现有的 LambdaFunctionConfigurations 密钥中,或使用以下示例所示的 JSON 语法创建新密钥。将密钥添加到 notification.json 文件中:

{
... # Non Lambda event configurations like SNS, SQS etc. ,
"LambdaFunctionConfigurations": [
    {
      "Id": "my-lambda-function-s3-event-configuration",
      "LambdaFunctionArn": "LambdaFunction_ARN",
      "Events": [ "s3:ObjectCreated:" ],
      "Filter": {
        "Key": {
          "FilterRules": [
            {
              "Name": "prefix"|"suffix",
              "Value": "string"
            }
          ]
        }
      }
    },
    {...}, #Other pre-existing Lambda Function configurations
  ]
}

创建 notification.json 后,运行以下命令来更新您的 S3 事件通知配置:

aws s3api put-bucket-notification-configuration \
--bucket bucket_name \
--notification-configuration file://notification.json

**注意:**将 bucket_name 替换为您的 S3 存储桶的名称。

测试 Lambda 函数

要使用 Lambda 控制台来测试 Lambda 函数,请参阅使用虚拟事件来测试 Lambda 函数。如果事件通知未调用您的函数,请参阅为什么我的 Amazon S3 事件通知没有调用我的 Lambda 函数?

相关信息

如何允许我的 Lambda 函数访问我的 Amazon S3 桶?

我在创建 Amazon S3 事件通知时,为什么会出现“无法验证以下目标配置”错误?

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