AWS Boto3 S3 复制不复制标签



我有一个函数,可以更改 S3 对象的存储类。该函数有效,但复制标签


def to_deep_archive(s3_key):
'''
Set the storage to DEEP_ARCHIVE
Copied from https://stackoverflow.com/questions/39309846/how-to-change-storage-class-of-existing-key-via-boto3
'''
s3 = boto3.client('s3')
# Source data to move to DEEP_ARCHIVE
copy_source = {
'Bucket' : BUCKET,
'Key' : s3_key
}
# TODO : encryption
# convert to DEEP_ARCHIVE by copying
s3.copy(
copy_source,
BUCKET,
s3_key,
ExtraArgs = {
'StorageClass' : 'DEEP_ARCHIVE',
'MetadataDirective' : 'COPY',
'TaggingDirective' : 'COPY',
'ServerSideEncryption' : 'AES256'
}
)

没有抛出任何例外。我的角色策略如下所示:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:DeleteObjectTagging",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
"s3:ReplicateTags"
],
"Resource": "arn:aws:s3:::my_bucket/*"
}
]
}

我的存储桶策略如下所示:

{
"Sid": "Stmt1492757001621",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::my_account:role/my_role"
},
"Action": [
"s3:GetObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
"s3:DeleteObjectTagging",
"s3:ListBucket",
"s3:ReplicateTags"
],
"Resource": [
"arn:aws:s3:::my_bucket/*",
"arn:aws:s3:::my_bucket"
]
}

我还需要做什么吗?

我发现s3.copy()如何处理TaggingTaggingDirective额外的参数存在有趣的差异。

根据s3transfer/copyies.py的源代码,它似乎执行了s3.copy(),底层实现取决于对象的大小。如果超过某个multipart_threshold,则使用s3_client.upload_part_copy()上传。如果低于阈值,则使用普通s3_client.copy_object()上传,文件大小限制为 5GB。从copy_object文档中:

使用此 API 在单个原子操作中创建最大 5 GB 的对象副本。但是,要复制大于 5 GB 的对象,您必须使用分段上传分段 - 复制 (UploadPartCopy) API。

不幸的是,TaggingTaggingDirective论点得到了copy_object()的支持,但没有得到upload_part_copy()的支持。在此处查看后者的文档。因此,TaggingDirective在提交upload_part_copy()请求时被明确列入黑名单作为要排除的参数,但对于提供参数和Taggingcopy_object(),则不会执行相同的操作。

总之,这两种标记ExtraArgs似乎都应该适用于小文件,但不适用于大文件。因此,我将恢复为在复制后执行后续put_object_tagging()调用,由于额外的 API 调用以及复制和标记之间的延迟,这是不幸的。

您可以使用复制对象和TaggingDirective='COPY'来复制带有标签的 s3 对象。

response = s3.copy_object(
Bucket='destination bucket',
CopySource={'Bucket': 'source bucket',
'Key': object["Key"]},
Key=object["Key"],
TaggingDirective='COPY'
)

最新更新