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
  • 如果你想用自己的 key 來做 server-side encryption,會包含以下的 header:
    • x-amz-server-side-encryption-customer-algorithm
    • x-amz-server-side-encryption-customer-key
    • x-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 天。

參考資料


This site uses Just the Docs, a documentation theme for Jekyll.