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 站上一個非常好的對比架構圖,鏈接在參照中:
這張圖很好的描述了三者之間實現的不同。
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 保存的對象:
//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 的許可權:
對於基於資源的策略,會對資源直接進行控制,允許哪類委託人進行訪問。但不是所有的服務有能有基於資源的訪問策略。
這部分會在下面詳細說明。
在具體訪問時,如果 IAM 委託人滿足如下條件,才能去訪問對應的資源:
- 該委託人具有 IAM 上身份的許可權允許或者對應資源行有允許該委託人訪問的許可權。
- 同時其基於資源的策略或者基於資源的策略,沒有明確的顯示拒絕。
Principal – 委託人,指對 AWS 資源執行操作的人員或者應用程式。
S3 策略實踐 – 為 bucket 中的對象設置公共訪問
在 S3 中,基於資源的訪問方式一共有兩種:
- 基於 ACL 的方式進行管理,默認已經關閉,不推薦
- 基於存儲桶的方式進行管理。
接下來會依次對這兩種方式進行演示。在開始之前,默認已經創建了好了一個 bucket,並在裡面上傳了一個圖片。
新建一個 bucket 後,可以看到其狀態為:存儲桶和對象不是公有的。這時訪問 bucket 裡面的對象會提示 access denied.
在 AWS 中默認是禁用公共訪問的,所以在使用兩種方式打開前,需要將阻止所有公開訪問
功能關閉。
點擊創建的存儲桶,選擇許可權。
此時該 bucket 的狀態變為:對象可以是公有的。
通過 ACL 設置公共訪問
ACL 的方式, AWS 默認已經關閉,原因在於 AWS 不推薦 ACL 的方式管理 bucket,而更加推薦 bucket 策略的方式。
如果需要使用 ACL,需要手動開啟。
接著為想要公開的訪問的對象設置公開 acl.
此時對象已經可以正常訪問了。
通過存儲桶策略設置公有
點擊創建的存儲桶,找到存儲桶策略,點擊編輯。
這時就可以通過 json 的方式管理存儲桶了。
至於在編寫策略時可以通過參考策略示例和策略生成器兩種編寫策略,這裡以策略生成器為例,自動生成一個讀取對象的策略。
其中 Principal 等編寫方式,可以參考這篇文檔
然後將生成的策略,粘貼:
version 表示 api 版本
此時改存儲桶的狀態變為公開,自然改對象也可以正常訪問了。
S3 版本控制
S3 支援為桶中的文件開啟版本控制,但需要在桶級別開啟。開啟版本控制後:
- 可以保護意外刪除的對象
- 回滾到之前的版本
點擊所在桶的屬性,打開版本控制。再次上傳一個同名的文件,點擊顯示版本後,可以查看上傳的同名文件。
這裡有一點需要注意,就是當顯示版本處於 disable 狀態時,刪除對象,並不會真正的刪除,只是標記了刪除。
這種標記刪除的方式,由於依然佔用存儲空間,所以是繼續收費的。
這裡我們將文件刪除後,發現在顯示版本 disable 的情況下,是無法看到文件的,只有將顯示版本打開後,刪除才能真正刪除。
將刪除標記刪除後,就可恢復之前的文件版本。同理選擇三個文本,刪除後就是永久刪除。
S3 跨域
CORS(跨資源共享)是一種基於 HTTP 頭的機制,讓瀏覽器去訪問除了自己本身這台伺服器以外其他伺服器的資源。
處於安全性的考慮,瀏覽器僅允許同源資源的訪問,當請求資源的 origin(域名,協議或者埠)三者中只有出現一個不同,瀏覽器會出現跨域報錯問題。
但在一些場景下,必須要載入其他伺服器上的資源,比如需要一些字體,一些圖片等等需求。比如在如下場景中,一個站點需要載入 domain-a,domain-b 兩個站點的資源。
解決跨域問題有兩種方式:
- 對於簡單請求,通過在伺服器上增加
Access-Control-Allow-Origin
header 來允許訪問 - 對於一些除簡單請求外的請求,需要先通過預檢請求,以獲知伺服器是否允許該請求。
對於簡單請求和其他請求可以查看這篇文檔
下面描述了非簡單流程跨域的過程:
由於 S3 還有託管靜態網站的功能,數據都存儲在不同的 bucket,也就意味著想訪問資源時 domain 不同,存在跨域問題。
這時就通過編輯 bucket 的 CORS 打開相應功能:
S3 加密
在談到 S3 加密時,一般會從兩個緯度談論數據保護:
- 數據傳輸:比如在上傳或者下載,或者在多個 S3 bucket 間複製數據時,這時我們就需使用 SSL/TLS 加密或者在客戶端上傳時加密
- 靜態:存儲在 S3 服務的硬碟上,以加密的形式保存。
- 在 S3 服務端,可以通過如下三種方式
- SSE-S3:使用具有 Aws S3 託管密匙的伺服器端加密
- SSE-KMS:在 Key Management Service 中存儲客戶主密匙的伺服器端加密
- SSE-C:使用用戶自己的提供的密匙進行加密
- 在客戶端:
- 客戶上傳加密後的內容
- 在 S3 服務端,可以通過如下三種方式
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),適用於以最低的雲存儲成本進行長期歸檔和數字保存。