我希望能够在存储在S3桶中的50多个文件上设置元数据,但是AWS CLI不直接支持简单地更改元数据。元数据的目的是在web浏览器请求这些文件时发出HTTP 301重定向。每个桶只允许50条规则,因此必须应用每个对象的元数据,而不是用XML或JSON编写规则。
AWS CLI只支持在复制过程中设置元数据;AWS CLI和sdk的这种缺陷是不幸的,但是作为所有语言绑定基础的REST接口显然不提供这种功能。我已经看到了几种执行复制的方法,包括(重新)复制文件本身以及在复制期间设置元数据。
这里有一种这样的方法,它(重新)将old_file.html
复制到S3桶并设置所需的元数据(导致HTTP 301重定向的标头):
$ aws s3 cp
old_file.html
s3://bucket_name/old_file.html
--website-redirect /new_file.html
尴尬,但可行。如果使用CloudFront,在301重定向实际发送到web浏览器之前需要缓存失效:
$ aws cloudfront create-invalidation
--distribution-id "$AWS_CLOUDFRONT_DIST_ID"
--paths "old_file.html"
没问题。稍等无效操作发生,重定向最终会成功。
在使用Ruby v3绑定时,事情似乎变得更加困难。以上的尴尬似乎没有直接的类比。
等效Ruby代码的建议?当然,我可以从Ruby中调用AWS CLI(如果我必须的话,我会这样做),但这感觉像是作弊。
AWS文档有时用比必要的更复杂的方式解释事情。这就是将本地文件(old_path
)上传到bucket
,并将对该文件的请求重定向到先前上传的另一个文件(new_path
)所需要的全部操作。
def redirect(bucket, old_path, new_path)
s3 = Aws::S3::Client.new
s3.put_object({
body: IO.read(old_path),
bucket: bucket,
key: old_path,
website_redirect_location: new_path,
})
end
代码假设~/.aws/config
存在。否则,Aws::S3::Client.new
将引发异常。
我在这里详细写过:HTTP 301重定向与Jekyll和AWS S3。