如何使用 Lambda 函数将文件从一个 Amazon S3 存储桶复制到另一个存储桶?
我想使用 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 boto3import 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。
相关信息
相关内容
- AWS 官方已更新 10 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 1 年前