AWS-Basic-S3

來份鍋包肉發表於2022-04-14

Amazon Simple Storage Service,簡稱 S3 服務,是 AWS 2006 年推出的第一個服務,用於提供物件儲存服務。其在可擴充性,資料可用性,安全性和效能都有著非常不錯的體驗,而且宣稱可以儲存無限的資料。

塊儲存,物件儲存,檔案儲存

在介紹 S3 前,我們還是先來看下什麼是物件儲存服務,以及和檔案儲存,塊儲存有什麼區別。

塊儲存:

塊儲存直接提供最原始的磁碟空間給主機使用,主機在使用前需要對申請到的磁碟空間,進行邏輯劃分,比如 LVM 操作,劃分出 N 個邏輯硬碟,然後再利用系統對其進行格式化,生成檔案系統,比如像 ext4,ntfs 等等。

優點:

  • 寫入資料時,由於主機掛載的邏輯硬碟實際上分佈在很多的物理機上,可以實現並行寫入,提高讀寫效率。
  • 可以將多塊廉價的硬碟組裝成一個打的邏輯硬碟,提供容量和速度。

缺點:

  • 主機無法直接訪問塊儲存的內容,需要購買光纖交換機
  • 主機無法共享資料,由於其檔案系統都在主機上,不同的主機可能有不同的檔案系統,所以檔案分享可能有存在問題。

檔案儲存:

理解了塊儲存,檔案儲存就很好理解了,可以將其認為是在塊儲存上加上了一層檔案系統,而不同主機可以直接共享這個檔案系統。比如常見的 SMB,FTP,NFS 檔案伺服器。檔案儲存一般都擁有目錄,子目錄等樹狀的檔案結構,我們通過路徑來查詢檔案。比如我們之間可以使用自己的筆記本,搭建一個 FTP 的伺服器用於共享檔案。

優點:

  • 使用方便,不同主機間容易共享資料
  • 便宜,訪問檔案儲存,正常的 Internet 就可以了,不需要購買額外的光纖交換機

缺點:

  • 傳輸速度慢,因為走乙太網。

物件儲存服務:

物件儲存常見於各大雲端儲存業務的提供商,比如 AWS 的 S3, 百度網盤,阿里雲盤等。

物件儲存整合了塊儲存,傳輸速度快。檔案儲存,易於共享的兩大好處。

物件儲存不同於塊儲存和檔案儲存,是二層一種扁平化的檔案結構。當把一個檔案存入時,會寫入三部分的資訊:

  • key:唯一標識該檔案的名稱
  • raw data:檔案內容本身
  • metadata:用於描述檔案的一些必要資訊,比如存在那幾個服務上,建立時間,索引型別等等任意大小的資料。

在具體儲存時,物件儲存不同檔案儲存,將 metadata 單獨寫入控制節點的資料伺服器,其餘的伺服器儲存真正的檔案本身。

比如我們有四臺資料伺服器 A,B,C,D,A 為控制節點儲存 metadata ,BCD 為資料節點(稱為 OSD). 這時我們寫入一個檔案 test.log 檔案。

則該檔案會被打散存入 B,C,D。而 metadata 包含該檔案儲存在 B,C,D 等路徑資訊會存放在 A 伺服器上。

這樣在讀取時,就可以實現併發讀取的效果,實現了塊儲存的功能。

由於物件儲存會有專門的物件儲存軟體管理,其本身又有檔案系統,自然檔案也非常容易共享了。

下圖參照 b 站上一個非常好的對比架構圖,連結在參照中:

image-20220411214845863

這張圖很好的描述了三者之間實現的不同。

S3 介紹

在 S3 中儲存中,我們將儲存資料的地方叫桶,存入任意型別的資料叫物件。

在上面的介紹中,我們知道,物件儲存很重要的一個概念就是 key,這裡對應 S3 中桶的名字。

由於 S3 是全球跨區域的服務,所以桶的名字在全球內必須唯一,但桶的實際的儲存位置只會在某一個區域。

在 S3 中,對於物件來說,通過物件的 key 和版本 ID 唯一標識一個物件。

其中 key 可以是一個完整的路徑,由字首 + 物件名稱組成。

4my-organization

my.great_photos-2014/jan/myvacation.jpg

videos/2014/birthday/video1.wmv

我們可以通過 URL 來唯一訪問一個 S3 儲存的物件:

https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/photos/puppy.jpg, DOC-EXAMPLE-BUCKET

其中 DOC-EXAMPLE-BUCKET 為桶名,photos/puppy.jpg 為 key 名

S3 中的物件常由如下內容組成:

  • Metadata: 後設資料
  • key/value: 唯一名字和對應的資料
  • Tags:AWS 對許多資源都可以打 tag,方便管理
  • Version ID,用於啟用版本控制。

S3 許可權

在 AWS 中,安全是非常重要的一部分,而訪問許可權是重中之重。在 aws 中,有兩種訪問的策略,一種是基於身份的訪問。一種是基於資源策略的訪問。

對於基於身份的策略,會將允許訪問哪些資源的操作附加到 AWS 賬戶中的,使用者,組和角色中。

比如在 IAM,建立了一個使用者,並對這個使用者授予完全訪問 S3 的許可權:

image-20220412210744023

對於基於資源的策略,會對資源直接進行控制,允許哪類委託人進行訪問。但不是所有的服務有能有基於資源的訪問策略。

這部分會在下面詳細說明。

在具體訪問時,如果 IAM 委託人滿足如下條件,才能去訪問對應的資源:

  • 該委託人具有 IAM 上身份的許可權允許或者對應資源行有允許該委託人訪問的許可權。
  • 同時其基於資源的策略或者基於資源的策略,沒有明確的顯示拒絕。

Principal - 委託人,指對 AWS 資源執行操作的人員或者應用程式。

S3 策略實踐 - 為 bucket 中的物件設定公共訪問

在 S3 中,基於資源的訪問方式一共有兩種:

  • 基於 ACL 的方式進行管理,預設已經關閉,不推薦
  • 基於儲存桶的方式進行管理。

接下來會依次對這兩種方式進行演示。在開始之前,預設已經建立了好了一個 bucket,並在裡面上傳了一個圖片。

image-20220409133609463

image-20220412212103721

新建一個 bucket 後,可以看到其狀態為:儲存桶和物件不是公有的。這時訪問 bucket 裡面的物件會提示 access denied.

image-20220409134410755

在 AWS 中預設是禁用公共訪問的,所以在使用兩種方式開啟前,需要將阻止所有公開訪問功能關閉。

點選建立的儲存桶,選擇許可權。

image-20220409133251676

image-20220409133403395

此時該 bucket 的狀態變為:物件可以是公有的。

image-20220409133456220

通過 ACL 設定公共訪問

ACL 的方式, AWS 預設已經關閉,原因在於 AWS 不推薦 ACL 的方式管理 bucket,而更加推薦 bucket 策略的方式。

如果需要使用 ACL,需要手動開啟。

image-20220409134201587

接著為想要公開的訪問的物件設定公開 acl.

image-20220409134811224

image-20220409134838861

此時物件已經可以正常訪問了。

通過儲存桶策略設定公有

點選建立的儲存桶,找到儲存桶策略,點選編輯。

image-20220412212848145

這時就可以通過 json 的方式管理儲存桶了。

至於在編寫策略時可以通過參考策略示例和策略生成器兩種編寫策略,這裡以策略生成器為例,自動生成一個讀取物件的策略。

其中 Principal 等編寫方式,可以參考這篇文件

image-20220412213821126

然後將生成的策略,貼上:

image-20220412214058336

version 表示 api 版本

此時改儲存桶的狀態變為公開,自然改物件也可以正常訪問了。

image-20220412214134359

S3 版本控制

S3 支援為桶中的檔案開啟版本控制,但需要在桶級別開啟。開啟版本控制後:

  • 可以保護意外刪除的物件
  • 回滾到之前的版本

點選所在桶的屬性,開啟版本控制。再次上傳一個同名的檔案,點選顯示版本後,可以檢視上傳的同名檔案。

image-20220412215159719

這裡有一點需要注意,就是當顯示版本處於 disable 狀態時,刪除物件,並不會真正的刪除,只是標記了刪除。

這種標記刪除的方式,由於依然佔用儲存空間,所以是繼續收費的。

這裡我們將檔案刪除後,發現在顯示版本 disable 的情況下,是無法看到檔案的,只有將顯示版本開啟後,刪除才能真正刪除。

image-20220412215935612

將刪除標記刪除後,就可恢復之前的檔案版本。同理選擇三個文字,刪除後就是永久刪除。

S3 跨域

CORS(跨資源共享)是一種基於 HTTP 頭的機制,讓瀏覽器去訪問除了自己本身這臺伺服器以外其他伺服器的資源。

處於安全性的考慮,瀏覽器僅允許同源資源的訪問,當請求資源的 origin(域名,協議或者埠)三者中只有出現一個不同,瀏覽器會出現跨域報錯問題。

但在一些場景下,必須要載入其他伺服器上的資源,比如需要一些字型,一些圖片等等需求。比如在如下場景中,一個站點需要載入 domain-a,domain-b 兩個站點的資源。

image-20220413093809033

解決跨域問題有兩種方式:

  • 對於簡單請求,通過在伺服器上增加 Access-Control-Allow-Origin header 來允許訪問
  • 對於一些除簡單請求外的請求,需要先通過預檢請求,以獲知伺服器是否允許該請求。

對於簡單請求和其他請求可以檢視這篇文件

下面描述了非簡單流程跨域的過程:

image-20220413094708391

由於 S3 還有託管靜態網站的功能,資料都儲存在不同的 bucket,也就意味著想訪問資源時 domain 不同,存在跨域問題。

這時就通過編輯 bucket 的 CORS 開啟相應功能:

image-20220413095210767

S3 加密

在談到 S3 加密時,一般會從兩個緯度談論資料保護:

  • 資料傳輸:比如在上傳或者下載,或者在多個 S3 bucket 間複製資料時,這時我們就需使用 SSL/TLS 加密或者在客戶端上傳時加密
  • 靜態:儲存在 S3 服務的硬碟上,以加密的形式儲存。
    • 在 S3 服務端,可以通過如下三種方式
      • SSE-S3:使用具有 Aws S3 託管密匙的伺服器端加密
      • SSE-KMS:在 Key Management Service 中儲存客戶主密匙的伺服器端加密
      • SSE-C:使用使用者自己的提供的密匙進行加密
    • 在客戶端:
      • 客戶上傳加密後的內容

S3 日誌

有時出於一些審計的需要,需要記錄所有對 S3 的操作。

這時可以將 S3 的日誌功能開啟,然後將訪問的操作,記錄在另一個 Bucket 中。

需要注意的是,不用把日誌存在自己的 bucket 中,這樣會導致遞迴 Bucket 快速增大。

具體操作可以檢視這篇文件

S3 複製

有時為了保證資料的可用性,會開啟 S3 複製的功能,將一個桶中的資料,拷貝到另一個桶中。

在複製前,需要在兩個桶都開啟版本控制,並設定合適的 IAM 許可權,而且桶可以屬於不同的 aws 賬號。

複製共有兩種方式:

  • 跨區域複製,CRR:一般用於合規,低延遲訪問,跨賬號複製等
  • 同區域複製,SRR:日誌聚合,在生成和測試賬號間複製

S3 儲存類別

處於不同的使用目的以及價格,S3 儲存類別可分為:

  • S3 Intelligent-Tiering,可自動為具有未知或不斷變化的訪問模式的資料節省成本;
  • S3 Standard,適用於頻繁訪問的資料;
  • S3 Standard-Infrequent Access (S3 Standard-IA) :適用於訪問頻率較低的資料;
  • S3 Glacier Instant Retrieval,適用於需要即時訪問的歸檔資料;
  • S3 Glacier Flexible Retrieval(前稱為 S3 Glacier),適用於很少訪問且不需要即時訪問的長期資料;
  • Amazon S3 Glacier Deep Archive (S3 Glacier Deep Archive),適用於以最低的雲端儲存成本進行長期歸檔和數字儲存。

參考

紅帽檔案,塊,物件儲存比較

三者介紹視訊,b站

塊,物件,檔案儲存三者比較,知乎

DAS, NAS, SAN 對比

IAM 介紹

CORS跨域

aws-cors

S3 儲存級別