使用boto3更改s3对象CacheControl

时间:2019-02-26 12:56:11

标签: python amazon-s3 boto3

我正在尝试从S3中已经存在的文件中更改CacheControl属性。 我发现我最好的选择是将此对象复制到更改其元数据的相同路径。代码很简单:

    file_key = 'index.html'
    s3_object = s3_resource.Object(bucket_name, file_key)
    s3_object.copy_from(CopySource={'Bucket':bucket_name, 'Key':file_key},
        CacheControl='no-cache',
        MetadataDirective='REPLACE')

没有MetadataDirective='REPLACE',此代码将不起作用,但会使文件丢失所有其他元数据。我可以手动设置所有元数据,但是将来可能会引起问题。

是否可以更改一个元数据并保留所有其他元数据?

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,并且能够从一些文档和其他人的解决方案中组合出一个解决方案。在不丢失现有元数据的情况下执行此操作的关键是从现有对象中显式设置元数据:

bucket_name = "xxxxx"
key = "yyyyy"

s3 = boto3.resource("s3",
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name=AWS_REGION,
)
s3_object = s3.Object(bucket_name, key)
s3_object.copy_from(
    CopySource={"Bucket": bucket_name, "Key": key},
    CacheControl="max-age=86400",
    Metadata=s3_object.metadata, # This copies existing metadata
    MetadataDirective="REPLACE",
)