【问题标题】:AWS S3 copy files from one bucket to other using boto3AWS S3 使用 boto3 将文件从一个存储桶复制到另一个存储桶
【发布时间】:2023-02-01 07:25:39
【问题描述】:

我计划使用 AWS Python SDK (Boto3) 将文件从一个存储桶复制到另一个存储桶。下面是我从 AWS 文档中获得的相同代码:

dest_object.copy_from(CopySource={
                'Bucket': self.object.bucket_name,
                'Key': self.object.key
            })

我的问题是如何触发此代码以及我应该在哪里部署此代码? 我最初想到的是 Lambda 函数,但我正在寻找替代选项,以防 Lambda 因较大文件(1 TB 等)而超时。

我可以使用 Airflow 以某种方式触发此代码吗?可以通过 Lambda 调用吗?寻求 AWS 专家的建议。

【问题讨论】:

  • 你能告诉我们更多关于什么会“触发”这个文件副本吗?例如,它是一次性活动,还是每天一次?你想复制吗全部存储桶中的文件还是特定文件?你是全部复制吗新的存储桶中出现的文件?这些信息将帮助我们推荐合适的解决方案。
  • @JohnRotenstein 我需要复制出现在 source bucket 中的所有新文件。仅供参考,在同一代码中,我还计划添加删除功能,以便在将文件复制到目标存储桶后从源存储桶中删除文件。

标签: amazon-web-services amazon-s3 amazon-ec2 aws-lambda airflow


【解决方案1】:

将新文件复制到另一个存储桶的最简单方法是使用Amazon S3 Replication。它会自动将新对象复制到选定的存储桶中,无需代码。

但是,这不能满足您在复制传入文件后将其删除的要求。因此,你应该创建一个 AWS Lambda 函数并添加一个 S3 触发器.每当在存储桶中创建对象时,这将触发 Lambda 函数。

Lambda 函数应该:

  • event参数中提取桶和对象名称
  • 复制对象到目标桶
  • 删除原来的对象

代码看起来像:

import boto3
import urllib

TARGET_BUCKET = 'target_bucket' # Change this

def lambda_handler(event, context):

    s3_resource = boto3.resource('s3')

    # Loop through each incoming object
    for record in event['Records']:

        # Get incoming bucket and key
        source_bucket = record['s3']['bucket']['name']
        source_key = urllib.parse.unquote_plus(record['s3']['object']['key'])

        # Copy object to different bucket
        copy_source = {
            'Bucket': source_bucket,
            'Key': source_key
        }
        s3_resource.Bucket(TARGET_BUCKET).Object(source_key).copy(copy_source)

        # Delete original object
        s3_resource.Bucket(source_bucket).Object(source_key).delete()

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2022-06-12
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多