AWS-Basic-S3

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 存儲級別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章