将s3 Bucket中的现有文件复制到另一个s3存储桶

时间:2018-03-27 07:15:22

标签: amazon-web-services amazon-s3 aws-sdk boto3

我有一个包含大量文件的现有s3存储桶。我想每1分钟运行一个lambda函数,并将这些文件复制到另一个目标s3存储桶。

我的功能是:

s3 = boto3.resource('s3')
clientname=boto3.client('s3')
def lambda_handler(event, context):
    bucket = 'test-bucket-for-transfer-check'
    try:
        response = clientname.list_objects(
            Bucket=bucket,
            MaxKeys=5
        )

        for record in response['Contents']:
            key = record['Key']
            copy_source = {
                'Bucket': bucket,
                'Key': key
            }
            try:
                destbucket = s3.Bucket('serverless-demo-s3-bucket')
                destbucket.copy(copy_source, key)
                print('{} transferred to destination bucket'.format(key))

            except Exception as e:
                print(e)
                print('Error getting object {} from bucket {}. '.format(key, bucket))
                raise e
    except Exception as e:
        print(e)
        raise e

现在我如何确保该函数每次运行时都复制新文件?

1 个答案:

答案 0 :(得分:0)

假设有问题的两个铲斗是Bucket-A和Bucket-B
并且要完成的任务是从Bucket-A复制文件 - >桶-B

  1. Lamba-1(问题中的代码)从Bucket-A读取所有文件,并在循环中将它们逐个复制到Bucket-B。
  2. 在同一个循环中,它还会在DynamoDb表中输入一个条目 " Copy_Logs"使用列File_key和Flag。 其中File_Key是文件的对象键 和Flag设置为false,表示复制操作的状态
  3. 现在在Bucket-B上配置事件,以便在每次放置和多部分上传时调用Lambda-2
  4. 现在,Lambda-2将从S3通知有效负载读取对象密钥,并在标志设置为true的情况下更新其在DynamoDb表中的相应记录。
  5. 现在您拥有DynamoDb表中的所有记录" Copy-Logs"哪些文件已成功复制,哪些文件未复制。

    HIH

    [更新]
    我错过了最后一部分。它是单向同步。您还可以从两个存储桶中获取文件的列表/名称,然后区分这些集(文件名)并将其余部分上传到目标存储桶。