Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 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。

