Python 使用boto3更改s3对象缓存控件

Python 使用boto3更改s3对象缓存控件,python,amazon-s3,boto3,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}, CacheCont

我正在尝试从已经在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'
,此代码将无法工作,但它会使文件丢失其所有其他元数据。我可以手动设置所有元数据,但这可能会在将来导致问题


有没有办法更改一个元数据并保留所有其他元数据?

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

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",
)

你找到解决办法了吗?我也在同一条船上。我必须使用MetadataDirective='REPLACE'才能使其工作,但是我的所有其他元数据(不一定在HeadObject的元数据字段中)(如内容处置)都会丢失。很明显,我可以手动将其设置为应该的状态,但这并不像可持续性/未来证明那么容易。