将文件从 AWS S3 复制到另一个 S3 中的 Glacier 灵活检索

问题描述 投票:0回答:1

我希望更改一些 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)
我打算尝试一下,但如果有人能确认它是否受支持或者我是否误解了它的工作原理,我将不胜感激。

amazon-web-services amazon-s3 copy boto3 amazon-glacier
1个回答
0
投票
您可以使用

copy_object - Boto3文档,它支持StorageClass='GLACIER_IR'

response = client.copy_object( Bucket='string', CopySource={'Bucket': 'string', 'Key': 'string'}, Key='string', StorageClass='GLACIER_IR' )
    
© www.soinside.com 2019 - 2024. All rights reserved.