如何用R的aws.s3包将版本控制S3桶对象回退至历史版本
问题根因
你遇到的两个错误都是参数传值位置和S3接口要求不匹配导致的:
- 无法获取历史版本对象:
aws.s3包的get_object()接口中,versionId属于查询参数,不是请求头,你将它放在headers参数中不会被S3识别,因此默认返回最新版本的对象。 - 复制对象报400非法请求:有两个不满足接口要求的点:
- S3复制请求中指定源对象的历史版本,需要在源路径中拼接
versionId参数,不能通过普通请求头传递 - 将对象复制到自身时,必须显式指定
x-amz-metadata-directive头为REPLACE,否则S3会判定请求非法
- S3复制请求中指定源对象的历史版本,需要在源路径中拼接
正确实现代码
获取指定版本的对象
# 正确传入query参数获取历史版本 get_object( "object", bucket, as = "text", query = list(versionId = version_old) ) # 预期输出:"old\n"
回退对象到指定历史版本
# 构造带版本号的源对象路径,添加必选请求头完成复制 copy_object( from_object = paste0("object?versionId=", version_old), to_object = "object", from_bucket = bucket, to_bucket = bucket, headers = list(`x-amz-metadata-directive` = "REPLACE") ) # 验证回退结果 get_object("object", bucket, as = "text") # 预期输出:"old\n"
该实现完全符合AWS官方推荐的版本回退最佳实践,操作后会生成一个新的对象版本,内容与指定的历史版本一致,原有所有版本历史都会保留。
内容的提问来源于stack exchange,提问作者landau
相关产品推荐
相关产品推荐

