跳至内容

如何使用 Lambda 函数将文件从一个 Amazon S3 存储桶复制到另一个存储桶?

2 分钟阅读
0

我想使用 AWS Lambda 函数将文件从一个 Amazon Simple Storage Service (Amazon S3) 存储桶复制到另一个存储桶。

解决方法

按照以下步骤创建 Lambda 函数,用于将文件从源 Amazon S3 存储桶复制到目标 S3 存储桶。

创建源和目标 S3 存储桶

**注意:**如果已经创建了源和目标 S3 存储桶,则可以跳过此步骤。

完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 选择创建存储桶
  3. 对于 Bucket name(存储桶名称),输入源存储桶的名称。
  4. 选择 Create bucket(创建存储桶)。
  5. 对您的目标存储桶重复步骤 1-4。

有关详细信息,请参阅创建存储桶

创建 Lambda 函数

完成以下步骤:

  1. 在 Lambda 控制台中打开 Functions(函数)页面。

  2. 选择 Create function(创建函数),然后选择 Author from scratch(从头开始创作)。

  3. 对于 Function name(函数名称),输入您的函数的名称。

  4. Runtime(运行时)下拉列表中,选择 Python 3.13

  5. 展开 Change default execution role(更改默认执行角色),然后选择 Create a new role with basic permissions(创建具有基本权限的新角色)。

  6. 选择创建函数

  7. 选择代码选项卡,然后粘贴以下 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 名称存储为环境变量。

  8. 选择 Deploy(部署)。

Lambda 创建了一个执行角色,用于向该函数授予将日志上传到 Amazon CloudWatch 的权限。有关详细信息,请参阅 Create a Lambda function with the console

为 Lambda 函数创建 Amazon S3 触发器

完成以下步骤:

  1. 在 Lambda 控制台中打开“函数”页面
  2. 函数中,选择 Lambda 函数。
  3. 函数概述中,选择添加触发器
  4. 触发器配置下拉列表中,选择 S3
  5. 存储桶中,输入您的源存储桶的名称。
  6. 事件类型下拉列表中,选择所有对象创建事件
    **注意:**请将此步骤配置为使用 POST、PUT 或“分段上传”事件类型来上传对象。
  7. 选择我确认不建议将相同的 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:GetObjectTaggings3:PutObjectTagging 权限。您必须对源存储桶中的源对象具有 s3:GetObjectTagging 权限,对目标存储桶中的对象具有 s3:PutObjectTagging 权限。

有关详细信息,请参阅 Granting Lambda function access to AWS services

相关信息

如何对来自 Amazon S3 的“403 拒绝访问”错误进行故障排除?

如何允许我的 Lambda 函数访问我的 Amazon S3 存储桶?

AWS 官方已更新 10 个月前