Simple Storage Service (S3)
S3 為 AWS 的物件存儲服務。
使用 Cloudflare CDN 來加快 S3 物件的存取速度
很推薦使用 Cloudflare CDN 來加快 S3 物件的存取速度,讓你的使用者更快地存取到 S3 上的物件。
[!NOTE]
AWS 本身也有 CDN 服務 CloudFront,但是 Cloudflare 有提供免費方案。
如果要在 S3 上使用 Cloudflare 的 CDN,首先需要有一個自己的網域,並將該網域託管於 Cloudflare 上。假設我擁有一個網域 example.com,我想要建立一個子網域 s3.example.com 來指向 S3 上的物件。
首先在 S3 上建立一個 bucket,名稱為 s3.example.com,並將 bucket 設定為開放所有人讀取。建立好之後,細心的你可能會發現 S3 bucket 的網址與一般名稱的網址有所不同:
- 一般名稱的網址:
https://<your-bucket-name>.s3.us-west-2.amazonaws.com - 類型名稱的網址:
https://s3.us-west-2.amazonaws.com/<your-bucket-name>
[!IMPORTANT]
S3 bucket 的名稱必須要與網域名稱相同。
Bucket 建立好之後,來到 Cloudflare 的管理頁面,新增一個子網域 s3.example.com,接著在這個子網域底下新增一個 CNAME 紀錄,將其指向 S3 的網域 s3.us-west-2.amazonaws.com。
[!WARNING]
根據 S3 的地區不同,網址也會有所不同,請確認你的 S3 bucket 的地區。
上傳一個檔案 image.jgp 到 S3 bucket 上,等到 Cloudflare 的 proxy 生效之後 (通常只需要幾分鐘),就能透過 https://s3.example.com/image.jpg 來存取 S3 上的物件。
[!NOTE]
當用戶訪問
https://s3.example.com/image.jpg時,Cloudflare 會將用戶的請求轉發到 S3 上,並將 S3 上的物件快取到 Cloudflare 的節點上,下次用戶再次訪問時,就會直接從 Cloudflare 的節點上取得物件,而不用再次訪問 S3。這能進一步降低 S3 流量的費用。
SAA 筆記
- S3 支援每秒 3500 次的
PUT/POST/DELETE請求,與每秒 5500 次的GET請求。 - S3 Multipart Upload 是 S3 本來就具備的功能,當上傳的檔案超過 5GB,S3 會將其切割成多個檔案上傳,但頻寬問題還是會遇到。
- S3 不支援 AES-128,只有 AES-256。
- S3 access point 可以管理或限制其他 AWS 資源對於 S3 的訪問。
- S3 支援 pre-signed URL,可以讓私有物件公開一段時間,時間到了就會恢復成不公開。
- Object Lock 可以避免檔案被覆蓋或是刪除,Object Lock 的啟用會讓 Version 失效。
- S3 Object Lock 提供兩種模式:
- Governance mode:大多用戶都無法刪除與覆蓋檔案,只有擁有權限的用戶才可以。
- Compliance mode:全部用戶都無法刪除與覆蓋檔案,連 root 用戶都不行。
- Object Lock 的保護時間也提供兩種模式:Retention Period vs. Legal Hold。
- 兩者很類似,也可以同時使用,都是避免檔案被刪除或覆蓋。
- Retention Period 對檔案的保護只會持續一段時間。
- Legal Hold 對檔案的保護時間會一直持續,直到用戶解除 Legal Hold。
- S3 可以送 event 到以下幾個服務:
- SNS
- SQS
- Lambda
- Transfer Acceleration 目的在最佳化從世界各地傳輸到 S3 儲存。
- 如果想將資料從各國快速的上傳到某一區的 S3,可以使用 Transfer Acceleration。
- 要在 S3 上建立一個靜態網站有幾個條件:
- 一個在 Route 53 上註冊的 FQDN。
- S3 bucket,注意 bucket name 必須要與註冊的 FQDN 相同。
- S3 bucket 如果是使用 server side encryption,header 會有
x-amz-server-side-encryption。- 指定 AES256,會是
x-amz-server-side-encryption:AES256。 - 指定 KMS,會是
x-amz-server-side-encryption:aws:kms。
- 指定 AES256,會是
- 如果你想用自己的 key 來做 server-side encryption,會包含以下的 header:
x-amz-server-side-encryption-customer-algorithmx-amz-server-side-encryption-customer-keyx-amz-server-side-encryption-customer-key-MD5
- S3 Select 操作是根據 S3 Bucket name 與 Object’s Key (檔案名稱),來對檔案的內容進行搜尋。
- 想快速地返回 S3 Archive 資料可以使用 Expedited retrievals 功能,如果真的有需求,建議優先買好 Provisioned capacity 放著。
- Provisioned capacity 定義了能快速回傳 Archive 的資料量,Provisioned capacity 提供約三個容量單位,每個容量單位每五分鐘至少可執行 3 次加急檢索,並提供高達 150 MB/s 的檢索吞吐量。
- S3 Requester Pays Feature 是當你想分享資料卻不想造成費用的一種方式,由下載資料方付資料的傳輸費用。
- 你可以在上傳檔案到 S3 的時候設定檔案開放的權限,但不常用,大部分還是根據 bucket 的 policy。
- Object 的 owner 預設是上傳者的,即使上傳到的 bucket 屬於其他帳號,要讓 bucket owner 擁有 object 的權限,需要在上傳時設定
x-amz-acl: bucket-owner-full-control。 - 從 Glacier 轉移資料到 S3 會有以下幾種選擇:
- Expedited:1-5 分鐘。
- Bulk:5-12 小時。
- 除了 standard tier,其餘 tier 都要求一定的保留時間,如果在保留時間內刪除,會收取額外費用。
- S3 可以建立 Presigned URL,讓下載物件的連結有時效性
- 根據不同的身份,建立的 Presigned URL 也會有不同的最大時效性
- IAM instance profile – 有效期最長為 6 小時。
- AWS Security Token Service – 使用長期安全憑證簽署時,有效期限最長為 36 小時或臨時憑證的持續時間(以先到者為準)。
- IAM user - 當您使用 AWS 的簽章版本為 4 時,有效期限最長為 7 天。