AWS Ruby绑定与AWS CLI的S3不相同?



我希望能够在存储在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。

相关内容

  • 没有找到相关文章

最新更新