使用AWS Lambda将文件从一个s3存储桶移动到AWS中的另一个存储桶

时间:2020-05-28 07:01:08

标签: python amazon-web-services amazon-s3 boto3

在以下情况下,我尝试使用python boto3 AWS lambda函数将一个小时以上的文件从一个s3存储桶移动到另一个s3存储桶:

  1. 两个存储桶可以在同一帐户中,也可以在不同区域。
  2. 两个存储桶都可以位于不同的帐户和不同的区域。
  3. 两个存储桶都可以位于不同的帐户和相同的区域。

我得到了一些使用@John Rotenstein提到的python代码移动文件的帮助

import boto3
from datetime import datetime, timedelta

SOURCE_BUCKET = 'bucket-a'
DESTINATION_BUCKET = 'bucket-b'

s3_client = boto3.client('s3')

# Create a reusable Paginator
paginator = s3_client.get_paginator('list_objects_v2')

# Create a PageIterator from the Paginator
page_iterator = paginator.paginate(Bucket=SOURCE_BUCKET)

# Loop through each object, looking for ones older than a given time period
for page in page_iterator:
    for object in page['Contents']:
        if object['LastModified'] < datetime.now().astimezone() - timedelta(hours=1):   # <-- Change time period here
            print(f"Moving {object['Key']}")

            # Copy object
            s3_client.copy_object(
                Bucket=DESTINATION_BUCKET,
                Key=object['Key'],
                CopySource={'Bucket':SOURCE_BUCKET, 'Key':object['Key']}
            )

            # Delete original object
            s3_client.delete_object(Bucket=SOURCE_BUCKET, Key=object['Key'])

如何修改以满足需求

2 个答案:

答案 0 :(得分:3)

在区域之间移动

这不是问题。您只需在存储桶之间复制对象,Amazon S3便会解决它。

在帐户之间移动

这有点困难,因为代码将使用一组凭据,并且必须对源存储桶具有ListBucketGetObject访问权限,并且对目标存储桶具有PutObject权限。 / p>

此外,如果正在使用源帐户中的凭据,则必须使用ACL='bucket-owner-full-control'执行复制,否则目标帐户将无权访问该对象。使用目标帐户中的凭据执行复制时,不需要这样做。

假设Lambda代码在Account-A中运行,并且正在将对象复制到Account-B。 IAM角色(Role-A)已分配给Lambda函数。授予Role-AAccount-A中的存储桶的访问权限非常容易。但是,Lambda函数将需要对PutObject中的存储桶(Bucket-B)中的Account-B的权限。因此,您需要Bucket-B 添加存储桶策略,以允许Role-APutObject进入存储桶。这样,Role-A有权读取Bucket-A并写入Bucket-B

因此,将它们放在一起:

  • 为Lambda函数创建IAM角色(Role-A
  • 相同帐户中的存储桶赋予角色必要的读取/写入访问权限
  • 对于其他帐户中的存储桶,添加一个存储桶策略,该策略向IAM角色(Role-A)授予必要的访问权限
  • copy_object()命令中,添加ACL='bucket-owner-full-control'(这是唯一需要的编码更改)
  • 不用担心跨区域执行任何操作,它应该会自动运行

答案 1 :(得分:1)

另一种方法是使用Amazon S3 Replication,它可以复制存储桶内容:

  • 在同一区域内或区域之间
  • 在同一AWS账户内或在不同账户之间

复制通常在组织需要在不同区域中提供其数据的另一个副本或仅出于备份目的时使用。例如,可以将关键的公司信息复制到普通用户无法访问的另一个AWS账户。这样,如果删除了某些数据,则在其他位置会有另一个副本。

复制需要在源桶和目标桶上激活版本控制。如果需要加密,请使用标准的Amazon S3 encryption options。数据在传输过程中也会被加密。

您可以配置源存储桶和目标存储桶,然后通过提供前缀或标签来指定要复制的对象。只有激活复制后,才可以复制对象。现有对象将被复制。故意不删除删除内容,以免进行恶意操作。参见:What Does Amazon S3 Replicate?

S3复制没有“附加”费用,但是在区域之间移动对象时,您仍将为数据传输费用以及API请求(这是微不足道的费用)加上存储费用承担费用。