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

2 分钟阅读
0

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

解决方法

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

创建源和目标 Amazon S3 存储桶

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

完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 选择创建存储桶
  3. 对于存储桶名称,输入源存储桶的名称。
  4. AWS 区域下拉列表中,选择您的 AWS 区域。
  5. 选择创建存储桶
  6. 对您的目标存储桶重复步骤 1-4。

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

创建 Lambda 函数

完成以下步骤:

  1. 在 Lambda 控制台中打开“函数”页面

  2. 选择创建函数,然后选择从头开始创作

  3. 对于函数名称,输入您的函数的名称。

  4. 运行时下拉列表中,选择 Python 3.11

  5. 展开更改默认执行角色,然后选择创建具有基本权限的新角色

  6. 选择创建函数

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

  8. 选择部署

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 存储桶用于输入和输出同意选项,然后选择添加

有关详细信息,请参阅 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:GetObjectTaggings3:PutObjectTagging 权限。您必须对源存储桶中的源对象具有 s3:GetObjectTagging 权限,对目标存储桶中的对象具有 s3:PutObjectTagging 权限。

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

相关信息

如何对来自 Amazon S3 的 403 访问被拒绝错误执行故障排查?

如何允许我的 Lambda 执行角色访问我的 Amazon S3 存储桶?

AWS 官方
AWS 官方已更新 6 个月前