【发布时间】:2020-07-16 22:35:20
【问题描述】:
我的代码将对象从账户 A 复制到账户 B
import json
import boto3
from datetime import datetime, timedelta
def lambda_handler(event, context):
# TODO implement
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:
if "Contents" in page:
for object in page['Contents']:
if object['LastModified'] < datetime.now().astimezone() - timedelta(minutes=5): # <-- Change time period here
print(f"Moving {object['Key']}")
# Copy object
s3_client.copy_object(
ACL='bucket-owner-full-control',
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'])
else:
print("No Contents key for page!")
lambda 函数角色策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": [
"s3:PutObject*",
"s3:List*",
"s3:GetObject*",
"s3:GetBucketLocation",
"s3:DeleteObject*"
],
"Resource": [
"arn:aws:s3:::Bucket-A/*",
"arn:aws:s3:::bucket-A"
]
},
{
"Sid": "",
"Effect": "Allow",
"Action": [
"s3:PutObjectAcl",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bucket-B/*"
}
]
}
aws s3api get-object-acl --bucket bucket-b --key key1
{
"Owner": {
"DisplayName": "accountA",
"ID": "MYIDA"
},
"Grants": [
{
"Grantee": {
"DisplayName": "accountA",
"ID": "MyIDA",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "accountb",
"ID": "MyIDB",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
从账户 A 复制到账户 B 到账户 B 时如何更改对象的所有者
{
"Owner": {
"DisplayName": "accountB",
"ID": "MYIDB"
},
【问题讨论】:
-
您的代码在执行复制时正确设置了 ACL。因此,该对象归拥有存储桶的 AWS 账户所有,而不是特定用户。
-
不,该对象归转移对象的帐户所有,即帐户 A,我希望它到帐户 b
-
如果来自 Account-A 的凭证用于将对象复制到 Account-B 拥有的存储桶中,则指定
ACL='bucket-owner-full-control'将把控制权交给 Account-B。如果来自 Account-B 的凭据用于将对象从 Account-A 复制到 Account-B,则 Account-B 将拥有它(不需要 ACL)。 -
如果您看到 get acl 命令,它将所有者作为帐户 A,并且我正在使用附加到 lambda 的角色。我应该用帐户 B 凭据替换它吗?
-
最好使用来自目标帐户的凭据,这样可以避免 ACL 问题。请注意,这意味着需要修改源存储桶上的存储桶策略,以允许
GetObject访问用于复制的 IAM 角色或 IAM 用户。
标签: amazon-web-services amazon-s3