簡體   English   中英

Amazon S3 和 Cloudfront 緩存,如何清除緩存或同步它們的緩存

[英]Amazon S3 and Cloudfront cache, how to clear cache or synchronize their cache

我有一個每 10 分鍾運行一次並更新內容類型和 x-amz-meta 的 cron 作業。 但是從昨天開始,似乎在 cron 作業運行之后,亞馬遜並沒有接受所做的更改(刷新他的緩存)。

我什至去手動進行了更改,但沒有更改...

上傳視頻時,它具有application/x-mp4內容類型,cron 作業將其更改為video/mp4

盡管 S3 具有正確的內容類型video/mp4 cloudfront 顯示application/x-mp4 (舊內容類型)....

cron 作業在過去 6 個月內一直正常工作,沒有出現任何問題。

亞馬遜緩存有什么問題? 如何同步緩存?

使用 Invalidations 清除緩存,您可以將路徑放在要清除的文件中,也可以簡單地使用通配符清除所有內容。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api

這也可以使用 API 來完成! http://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html

AWS PHP SDK 現在有這些方法,但如果你想使用更輕松的東西,請查看這個庫: http : //www.subchild.com/2010/09/17/amazon-cloudfront-php-invalidator/

user3305600 的解決方案不起作用,因為將其設置為零相當於使用源緩存標頭。

至於實際代碼

獲取您的 CloudFront 分配 ID

aws cloudfront list-distributions

使分配中的所有文件無效,因此 CloudFront 獲取新文件

aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /

我實際的完整發布腳本是

#!/usr/bin/env bash

BUCKET=mysite.com
SOURCE_DIR=dist/

export AWS_ACCESS_KEY_ID=xxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
export AWS_DEFAULT_REGION=eu-west-1


echo "Building production"
if npm run build:prod ; then
   echo "Build Successful"
else
  echo "exiting.."
  exit 1
fi


echo "Removing all files on bucket"
aws s3 rm s3://${BUCKET} --recursive


echo "Attempting to upload site .."
echo "Command:  aws s3  sync $SOURCE_DIR s3://$BUCKET/"
aws s3  sync ${SOURCE_DIR} s3://${BUCKET}/
echo "S3 Upload complete"

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths / --profile=myawsprofile

echo "Deployment complete"  

參考

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/get-invalidation.html

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html

這是通過 AWS 使 CloudFront 上所有文件的緩存無效的手動方法

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

S3 不用於實時開發,但如果您真的想測試新部署的網站,請使用

http://yourdomain.com/index.html?v=2
http://yourdomain.com/init.js?v=2

最后添加版本參數將停止使用文件的緩存版本,瀏覽器將從服務器存儲桶中獲取文件的新副本

Cloudfront 將緩存文件/對象,直到緩存到期。 默認為 24​​ 小時。 如果您已將其更改為較大的值,則需要更長的時間。

如果您需要強制清除緩存,請使用invalidation 它是單獨收費的。

另一種選擇是更改 URL(對象鍵),因此它始終獲取新對象。

如果您正在尋找使緩存無效的最小解決方案,那么曼哈頓博士解決方案的這個編輯版本應該足夠了。 請注意,我指定了根 / 目錄以表明我希望刷新整個站點。

export AWS_ACCESS_KEY_ID=<Key>
export AWS_SECRET_ACCESS_KEY=<Secret>
export AWS_DEFAULT_REGION=eu-west-1

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=<distributionId> --paths / --profile=<awsprofile>

區域代碼可以在這里找到

您還需要使用 aws cli 創建配置文件。 使用aws configure --profile選項。 以下是來自亞馬遜的示例片段。

$ aws configure --profile user2
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: text

(編輯:不起作用)截至 2014 年,您可以隨時清除緩存,請仔細閱讀文檔或轉到您的分發設置>行為>編輯

對象緩存使用( Origin Cache Headers自定義

最小 TTL = 0

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

不要使用失效。 它們無法恢復,您將被收取費用。 他們對我有用的唯一方法是減少 TTL 並等待。

問候

我相信使用 * 會使分發中的整個緩存無效。 我目前正在嘗試,我會進一步更新

無效請求截圖

更新:

它按預期工作。 請注意,您可以通過指定對象路徑來使您想要的對象無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM