AWS S3 與 CloudFront 以及 S3 生命周期配置
20180704 chenxin
發現一個S3權限問題.
在S3的s3-cdn-test存儲桶(存儲桶權限非公開)里創建test-cdn文件夾(貌似文件夾是不能設置權限的).
在test-cdn文件夾下創建的dir1/dir2/t.txt等文件夾與文件,權限為公開.
可以通過 https://s3.amazonaws.com/s3-cdn-test/test-cdn/dir1/dir2/t.txt 訪問該文件.按照一般的權限說明來看的話,應該是不能訪問的.
經過多次訪問驗證,test-cdn文件夾以及子文件夾均權限訪問,但內部的所有文件均可以訪問.
aws的解釋:
蒙維AWS西南蒙老師:
關鍵是需要理解s3沒有目錄的概念,只有存儲桶和文件兩級概念,只是因為文件名支持正斜線,可以在控制台上顯示為目錄形式.
你可以設置iam策略讓用戶直接訪問某個具體文件,所以就可以訪問https://s3.amazonaws.com/s3-cdn-test/test-cdn/2.png了.
其實用命令行或sdk來理解s3存儲桶的操作更直接些.
不緩存
排除部分文件或目錄不在cdn節點上緩存,用戶的請求直接回源.
precedence(優先級):數字小的先匹配.
配置文件結構: /xbzj-taihe-bei/ios_res/v2/*
配置緩存時間(用戶自定義):將TTL默認的1天,修改為0
查看器使用HTTPS與cloudfront通信
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html
在未設置自己的HTTPS的情況下,訪問自己的域名下文件(CNAME到CF的域名),只支持HTTP,不支持HTTPS:
https://xbzj-taihe-bei-cloudf.soomigame.com/test/t.txt 會報錯
https://d107gs8ktc78p6.cloudfront.net/test/t.txt 可以正常訪問
CF的"行為"里允許配置固定目錄下的走HTTPS.
使用自己的域名訪問CF的HTTPS(而不是CF自帶的證書)
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-https-alternate-domain-names.html
關於全球訪問同一套源站的2個CDN部署說明
參考案例:
https://kekek.cc/post/global-cdn.html
同一套源站
關於全球同服CDN境內境外問題.使用同一個源站(S3),通過阿里雲的智能DNS解析,將國內的用戶CNAME解析到國內CDN,境外用戶CNAME解析到cloudfront的域名.
如果境內CDN節點訪問境外S3卡頓的話,可以另建1套源站放國內,保持國內和國外2個源站同步.
或者兩套源站
境外用S3作源站,cloudfront訪問S3.
境內用OSS做源站,阿里CDN訪問OSS.
通過預熱服來更新這2個源站(要測試預熱服到國內OSS是否穩定).
智能解析(用於區分境內用戶還是境外用戶)
通過阿里雲解析服務,將境內用戶CNAME解析到境內CDN,境外用戶CNAME解析到cloudfront地址.
cloudfront的訪問日志收集便於問題分析
開啟日志,需要先創建1個S3存儲桶 xbzj-cloudfront-log,存儲桶里建文件夾cf-logs,便於日志存放.
然后在Edit里開啟:
Logging On
Bucket for Logs xbzj-cloudfront-log.s3.amazonaws.com
Log Prefix cf-logs/
S3生命周期配置(過期自動刪除)
需求1(固定文件夾和固定文件前綴)
日志文件會自動記錄到該S3存儲桶內的cf-logs文件夾下(文件名以E3NG8ZPS6O9U1U開頭),然后將過期的文件自動刪除.
配置
名稱和范圍: delete-cdn-log-file
添加用於限制前綴/標簽范圍的篩選條件: cf-logs/E3NG8ZPS6O9U1U (注意,存儲桶的名稱不要包含在條件中,區分大小寫).cf-logs是文件夾,后面是對象前綴.
轉換: 留空,不設置
過期:
勾選->"當前版本"和"先前版本"
"使對象的向前版本過期" ->3 天
"永久刪除以前版本"->10 天(因為未啟用版本控制,故這里不會生效)
"清理未完成的分段上傳"-> 7 天
屬性
完成后,對象屬性如下
對象 E3NG8ZPS6O9U1U.2018-09-12-02.50a5f1ee.gz (UTC時間 2018/09/12 02:00時)
鍵 E3NG8ZPS6O9U1U.2018-09-12-02.50a5f1ee.gz 大小 14.1 KB
到期日期 9月 16, 2018 8:00:00 上午 GMT+0800 # 如果生命周期配置錯誤(前綴沒有匹配到對象),這里會顯示"N/A"
過期規則 delete-cdn-log-file
ETag e9...d593
上次修改時間 9月 12, 2018 10:01:46 上午 GMT+0800
對象 URL https://...e.gz
咨詢AWS S3 生命周期的答復說明(對象未及時刪除的原因說明)
若您曾經啟用過版本的話,您會有當前版本及先前版本,我由后端工具上看您的xbzj-cloudfront-log桶並沒有啟用過版本。所以可以省略掉先前版本的刪除設定。
以您目前的設定:
若您今天設定生命周期的設置,生命周期會於隔天UTC零時進行統計,當符合以下條件,就會進行排程刪除,因為是排程刪除,並異步刪除他,這會與您看到當下檔案的到期日期再順延一些時間才會刪除,以您原本提供的檔案到日期為2018年9月16日,在加上您設置生命周期的時間,他需要時間執行,所以不會立即刪除該檔案,當然依照我們上次回復給您的內容,標注過期的檔案不會再與您收取相關的儲存時間費用。
當前版本創建時間超過3天,會進行刪除。所以刪除的時間至少會是當前版本創建時間3天以后,我們會進行排程刪除,您目前的檔案都會依照此規則排程刪除。
以前版本創建超過10天,會進行刪除,所以刪除的時間會是以前版本創建超過10天以后刪除,您目前沒有檔案符合此規則,所以不會依照此規則處理。
清理未完成的分段上傳,當檔案過大時,主控台或是AWS CLI或是AWS SDK會進行分段上傳,但是若分段上傳沒有完成的話,您這邊的設置會是以上傳當天經過7天以后刪除。
需求2 (不固定文件夾)
S3存儲桶名稱: sns-log-xbzj,需要刪除類似以下的過期文件(設置30天過期).
SMSUsageReports/ap-southeast-1/2018/09/29/001.csv.gz
SMSUsageReports/us-east-1/2018/12/05/001.csv.gz
管理->添加生命周期->前綴配置為"SMSUsageReports/"即可.
需求3(整個存儲桶)
S3存儲桶名稱: sns-log-xbzj,需要定期自動刪除該桶下的所有文件(設置3天過期).
管理->添加生命周期->前綴留空(則會匹配整個存儲桶).