在以下情况下,我尝试使用python boto3 AWS lambda函数将一个小时以上的文件从一个s3存储桶移动到另一个s3存储桶:
我得到了一些使用@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'])
如何修改以满足需求
答案 0 :(得分:3)
这不是问题。您只需在存储桶之间复制对象,Amazon S3便会解决它。
这有点困难,因为代码将使用一组凭据,并且必须对源存储桶具有ListBucket
和GetObject
访问权限,并且对目标存储桶具有PutObject
权限。 / p>
此外,如果正在使用源帐户中的凭据,则必须使用ACL='bucket-owner-full-control'
执行复制,否则目标帐户将无权访问该对象。使用目标帐户中的凭据执行复制时,不需要这样做。
假设Lambda代码在Account-A
中运行,并且正在将对象复制到Account-B
。 IAM角色(Role-A
)已分配给Lambda函数。授予Role-A
对Account-A
中的存储桶的访问权限非常容易。但是,Lambda函数将需要对PutObject
中的存储桶(Bucket-B
)中的Account-B
的权限。因此,您需要向Bucket-B
添加存储桶策略,以允许Role-A
到PutObject
进入存储桶。这样,Role-A
有权读取Bucket-A
并写入Bucket-B
。
因此,将它们放在一起:
Role-A
)Role-A
)授予必要的访问权限copy_object()
命令中,添加ACL='bucket-owner-full-control'
(这是唯一需要的编码更改)答案 1 :(得分:1)
另一种方法是使用Amazon S3 Replication,它可以复制存储桶内容:
复制通常在组织需要在不同区域中提供其数据的另一个副本或仅出于备份目的时使用。例如,可以将关键的公司信息复制到普通用户无法访问的另一个AWS账户。这样,如果删除了某些数据,则在其他位置会有另一个副本。
复制需要在源桶和目标桶上激活版本控制。如果需要加密,请使用标准的Amazon S3 encryption options。数据在传输过程中也会被加密。
您可以配置源存储桶和目标存储桶,然后通过提供前缀或标签来指定要复制的对象。只有激活复制后,才可以复制对象。现有对象将不被复制。故意不删除删除内容,以免进行恶意操作。参见:What Does Amazon S3 Replicate?
S3复制没有“附加”费用,但是在区域之间移动对象时,您仍将为数据传输费用以及API请求(这是微不足道的费用)加上存储费用承担费用。