我想設定能夠對存盤在 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(如果必須的話,我會這樣做),但這感覺像是在作弊。
uj5u.com熱心網友回復:
AWS 檔案有時會以比必要更復雜的方式解釋事物。這就是將本地檔案 ( old_path
) 上傳到a 所需的全部內容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 Redirects with Jekyll and AWS S3。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470559.html