我想使用 AWS Lambda 函数将文件从 Amazon Simple Storage Service (Amazon S3) 存储桶复制到另一个存储桶。
解决方法
按照以下步骤创建 Lambda 函数,将文件从源 Amazon S3 存储桶复制到目标 S3 存储桶。
创建源和目标 Amazon S3 存储桶
**注意:**如果已经创建了源和目标 S3 存储桶,则可以跳过此步骤。
完成以下步骤:
- 打开 Amazon S3 控制台。
- 选择创建存储桶。
- 对于存储桶名称,输入源存储桶的名称。
- 从 AWS 区域下拉列表中,选择您的 AWS 区域。
- 选择创建存储桶。
- 对您的目标存储桶重复步骤 1-4。
有关详细信息,请参阅创建存储桶。
创建 Lambda 函数
完成以下步骤:
-
在 Lambda 控制台中打开“函数”页面。
-
选择创建函数,然后选择从头开始创作。
-
对于函数名称,输入您的函数的名称。
-
从运行时下拉列表中,选择 Python 3.11。
-
展开更改默认执行角色,然后选择创建具有基本权限的新角色。
-
选择创建函数。
-
选择代码选项卡,然后粘贴以下 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 名称存储为环境变量。
-
选择部署。
Lambda 创建了一个执行角色,向该函数授予将日志上传到 Amazon CloudWatch 的权限。有关详细信息,请参阅 Create a Lambda function with the console。
为 Lambda 函数创建 Amazon S3 触发器
完成以下步骤:
- 在 Lambda 控制台中打开“函数”页面。
- 在函数中,选择 Lambda 函数。
- 在函数概述中,选择添加触发器。
- 从触发器配置下拉列表中,选择 S3。
- 在存储桶中,输入您的源存储桶的名称。
- 从事件类型下拉列表中,选择所有对象创建事件。
**注意:**请将此步骤配置为使用 POST、PUT 或“分段上传”事件类型来上传对象。
- 选择我确认不建议将相同的 S3 存储桶用于输入和输出同意选项,然后选择添加。
有关更多信息,请参阅 Tutorial: 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 function access to AWS services。
相关信息
如何对来自 Amazon S3 的 403 访问被拒绝错误执行故障排查?
如何允许我的 Lambda 执行角色访问我的 Amazon S3 存储桶?