如何设置 Amazon S3 事件通知来调用另一个 AWS 账户中的 Lambda 函数?
我希望我的 Amazon Simple Storage Service (Amazon S3) 存储桶调用另一个 AWS 账户中的 AWS Lambda 函数。
解决方法
要设置 Amazon S3 存储桶以使其调用另一个 AWS 账户中的 Lambda 函数,请完成以下步骤:
**重要事项:**Lambda 函数必须与您的 S3 存储桶位于同一 AWS 区域中。
有关如何迁移函数的信息,请参阅如何使用 Lambda 控制台将 Lambda 函数迁移到另一个 AWS 账户或区域?
更新 Lambda 函数的基于资源的权限策略,向 Amazon S3 授予调用权限
AWS 管理控制台
要更新 Lambda 函数的基于资源的权限策略以向 Amazon S3 授予调用权限,请完成以下步骤:
- 使用 Lambda 函数所在的 AWS 账户,在 Lambda 控制台上打开 Functions page(函数页面)。
- 选择您希望由 Amazon S3 调用的 Lambda 函数的名称。
- 从 Configuration(配置)选项卡中,选择 Permissions(权限)。
- 在 Resource-based policy(基于资源的策略)部分,选择 Add permissions(添加权限)。
- 在 Policy statement(策略声明)窗格中,选择 AWS service(AWS 服务)。随即将出现 Service(服务)下拉列表。
- 在 Service(服务)下拉列表中,选择 S3 以查看更多字段。
- 对于 Statement ID(语句 ID),输入唯一的语句 ID 以区分您在策略中创建的语句。
- 对于 Source account(源账户),输入托管您的 S3 存储桶的账户的 AWS 账户 ID。
- 对于 Source ARN(来源 ARN),输入您的 S3 存储桶的 ARN。请使用下列格式:
**注意:**将 bucket_name 替换为您的 S3 存储桶的名称。arn:aws:s3:::bucket_name - 对于 Action(操作),从下拉列表中选择 lambda:InvokeFunction。
- 选择 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_name、bucket_name 和unique_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 函数?

