我希望更改一些 Python 3 代码,该代码当前将 SSE-C 编码文件从一个 S3 存储桶复制到另一个。在目标 S3 存储桶上,文件将以 Glacier 灵活检索格式存储,目前这是通过在目标存储桶上设置的生命周期转换来实现的。然而,这会导致许多问题,因为它是异步的。
理想情况下,我想复制文件,以便目标直接写入 GFR 存储类。但是,当我查看 boto3 s3 客户端副本的文档时,我发现 ExtraArgs 允许的参数如此处记录的那样只有:
ALLOWED_DOWNLOAD_ARGS = ['ChecksumMode', 'VersionId', 'SSECustomerAlgorithm', 'SSECustomerKey', 'SSECustomerKeyMD5', 'RequestPayer', 'ExpectedBucketOwner']
所以 StorageClass
不在那里,这意味着这是不可能的。但是,我随后看到了相关问题的
这个答案,这似乎暗示可以参考看似矛盾的AWS链接来完成,该链接表明:
您还可以通过使用 PUT 对象 - 复制 API 操作创建对象副本,将已存储在 Amazon S3 中的对象的存储类别更改为任何其他存储类别。但是,您无法使用 PUT 对象 - 复制来复制存储在 S3 Glacier 灵活检索或 S3 Glacier Deep Archive 存储类中的对象。您也无法从 S3 One Zone-IA 转换到 S3 Glacier 即时检索。给出的代码(感谢作者您可以使用相同的键名并指定请求标头,将对象复制到同一存储桶中:
将
x-amz-metadata-directive
标题设置为 COPY。将
x-amz-storage-class
标头设置为您要使用的存储类别。
Frederic Henri)如下:
import boto3
s3 = boto3.client('s3')
copy_source = {
'Bucket': 'mybucket',
'Key': 'mykey'
}
s3.copy(
copy_source, 'mybucket', 'mykey',
ExtraArgs = {
'StorageClass': 'STANDARD_IA',
'MetadataDirective': 'COPY'
}
)
但是,从上面的第一个参考来看,ExtraArgs
上的两个键对于S3客户端
copy
操作都无效,所以我很困惑这是否可以依赖。另外,它似乎是在原位更改文件而不是复制它。我希望将我的代码更改为:
extra_args = {
'CopySourceSSECustomerAlgorithm': <algorithm-string>,
'CopySourceSSECustomerKey': <plaintext-key>,
'SSECustomerAlgorithm': <algorithm-string>,
'SSECustomerKey': <plaintext-key>,
'StorageClass': 'GLACIER', # Adding these two directives to action an immediate
'MetadataDirective': 'COPY' # transition to Glacier Flexible Retrieval in the Target
}
...
response = client.copy(source, target_bucket, target_key, ExtraArgs=extra_args)
我打算尝试一下,但如果有人能确认它是否受支持或者我是否误解了它的工作原理,我将不胜感激。
copy_object - Boto3文档,它支持StorageClass='GLACIER_IR'
:
response = client.copy_object(
Bucket='string',
CopySource={'Bucket': 'string', 'Key': 'string'},
Key='string',
StorageClass='GLACIER_IR'
)