如何使用 Lambda 函数将文件从一个 Amazon S3 存储桶复制到另一个存储桶?
我想使用 AWS Lambda 函数将文件从一个 Amazon Simple Storage Service (Amazon S3) 存储桶复制到另一个存储桶。
解决方法
按照以下步骤创建 Lambda 函数,用于将文件从源 Amazon S3 存储桶复制到目标 S3 存储桶。
创建源和目标 S3 存储桶
**注意:**如果已经创建了源和目标 S3 存储桶,则可以跳过此步骤。
完成以下步骤:
- 打开 Amazon S3 控制台。
- 选择创建存储桶。
- 对于 Bucket name(存储桶名称),输入源存储桶的名称。
- 选择 Create bucket(创建存储桶)。
- 对您的目标存储桶重复步骤 1-4。
有关详细信息,请参阅创建存储桶。
创建 Lambda 函数
完成以下步骤:
-
在 Lambda 控制台中打开 Functions(函数)页面。
-
选择 Create function(创建函数),然后选择 Author from scratch(从头开始创作)。
-
对于 Function name(函数名称),输入您的函数的名称。
-
从 Runtime(运行时)下拉列表中,选择 Python 3.13。
-
展开 Change default execution role(更改默认执行角色),然后选择 Create a new role with basic permissions(创建具有基本权限的新角色)。
-
选择创建函数。
-
选择代码选项卡,然后粘贴以下 Python 代码:
import boto3 import botocore import json import os import logging logger = logging.getLogger() logger.setLevel(logging.INFO) s3 = boto3.resource('s3') def lambda_handler(event, context): logger.info("New files uploaded to the source bucket.") key = event['Records'][0]['s3']['object']['key'] source_bucket = event['Records'][0]['s3']['bucket']['name'] destination_bucket = os.environ['destination_bucket'] source = {'Bucket': source_bucket, 'Key': key} try: response = s3.meta.client.copy(source, destination_bucket, key) logger.info("File copied to the destination bucket successfully!") except botocore.exceptions.ClientError as error: logger.error("There was an error copying the file to the destination bucket") print('Error Message: {}'.format(error)) except botocore.exceptions.ParamValidationError as error: logger.error("Missing required parameters while calling the API.") print('Error Message: {}'.format(error))**注意:**从 Lambda 函数收到的事件对象中查找 source_bucket 名称。您可以将 destination_bucket 名称存储为环境变量。
-
选择 Deploy(部署)。
Lambda 创建了一个执行角色,用于向该函数授予将日志上传到 Amazon CloudWatch 的权限。有关详细信息,请参阅 Create a Lambda function with the console。
为 Lambda 函数创建 Amazon S3 触发器
完成以下步骤:
- 在 Lambda 控制台中打开“函数”页面。
- 在函数中,选择 Lambda 函数。
- 在函数概述中,选择添加触发器。
- 从触发器配置下拉列表中,选择 S3。
- 在存储桶中,输入您的源存储桶的名称。
- 从事件类型下拉列表中,选择所有对象创建事件。
**注意:**请将此步骤配置为使用 POST、PUT 或“分段上传”事件类型来上传对象。 - 选择我确认不建议将相同的 S3 存储桶用于输入和输出同意选项,然后选择添加。
有关详细信息,请参阅教程: Using an Amazon S3 trigger to invoke a Lambda function。
为 Lambda 函数的执行角色提供 IAM 权限
要将文件复制到目标 S3 存储桶,请为 Lambda 函数的执行角色添加 AWS Identity and Access Management (IAM) 权限。使用类似于以下的基于资源的策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "putObject", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::destination-s3-bucket/*" ] }, { "Sid": "getObject", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::source-s3-bucket/*" ] } ] }
注意:
- 请将 destination-s3-bucket 替换为您的 S3 目标存储桶,将 source-s3-bucket 替换为您的 S3 源存储桶。
- 请将资源 ARN 末尾的 /* 替换为环境所需的前缀值,以限制权限。
- 最佳做法是授予执行任务的最低权限。
- 要复制带有对象标签的对象,执行角色必须具有 s3:GetObjectTagging 和 s3:PutObjectTagging 权限。您必须对源存储桶中的源对象具有 s3:GetObjectTagging 权限,对目标存储桶中的对象具有 s3:PutObjectTagging 权限。
有关详细信息,请参阅 Granting Lambda function access to AWS services。

