一文讀懂AWS S3

來源:鵠思亂想
作者:陳鵠
時間:2020-07-28
3127
AWS S3全名是Simple Storage Service,簡便的存儲服務(wù)。

86cd1dfd6b11d91cab3f227adfe7-1447727.jpg

AWS S3全名是Simple Storage Service,簡便的存儲服務(wù)。為什么這么起名???它:

1.提供了統(tǒng)一的接口REST/SOAP來統(tǒng)一訪問任何數(shù)據(jù)

2.對S3來說,存在里面的數(shù)據(jù)就是對象名(鍵),和數(shù)據(jù)(值)

3.不限量,單個文件最高可達(dá)5TB

4.高速。每個bucket下每秒可達(dá)3500 PUT/COPY/POST/DELETE或5500 GET/HEAD請求

5.具備版本,權(quán)限控制能力

6.具備數(shù)據(jù)生命周期管理能力

作為一個對象存儲服務(wù),S3功能真的很完備。如果不用搭梯子,訪問快,我還真想過拿它來做自己的網(wǎng)盤。

v2-8485ec6daf4bbb22802357257ecef758_1440w.jpg

基本概念

Bucket

要存儲數(shù)據(jù)在S3里,首先我們要建立一個Bucket。Bucket默認(rèn)是不公開的。

Bucket有幾個特點(diǎn):

·命名需全球唯一。每個帳號默認(rèn)可建100個,可申請至最多1000個

·創(chuàng)建者的擁有權(quán)不可轉(zhuǎn)讓,也不可以從一個Region轉(zhuǎn)去別的Region

·沒有對象存儲數(shù)量限制

Bucket就像是電腦里面的某一個頂層分區(qū)。所有的對象都必須保存在某一個bucket下面。

Object

Bucket里面每一個存儲的數(shù)據(jù)就是對象,由對象名(鍵),和數(shù)據(jù)(值)組成。

對象的鍵(Key)可以很長,甚至按照一定前綴格式來指定,從而模擬文件夾的層級結(jié)構(gòu),比如Photo/Family/2020-01-25-new-year/altogether.jpg。

每一個對象其實(shí)還包含一些元信息(Meta-data),包括系統(tǒng)指定的文件類型,創(chuàng)建時間,加密算法等,和用戶上傳時指定的元信息。元信息在對象創(chuàng)建后都無法更改。

我們也可以為對象指定最多10個標(biāo)簽(Tag),標(biāo)簽的鍵和值的最大長度是128和256個字符。這個標(biāo)簽和元信息有什么不同呢?標(biāo)簽是可以修改和新增的。它最大的好處,是可以結(jié)合權(quán)限控制,生命周期管理,和數(shù)據(jù)分析等使用。

單個文件上傳最大是5GB。超過的話,需要使用multipart upload API。最大支持5TB。

一致性特性

對程序員來說,這么一個類似數(shù)據(jù)庫的東西,肯定需要關(guān)心它的讀寫特性和一致性模型。

·沒有鎖的功能。如果同時(幾乎)發(fā)起兩個更新對象的PUT請求,鍵相同,那么,以到達(dá)S3時間先后處理更新。

·不同對象的更新,沒法做到原子操作。

·對全新的對象來說,它是Read-after-Write Consistency的。也就是寫了之后馬上讀,肯定就是你剛才上傳的數(shù)據(jù)。

·如果你要更新數(shù)據(jù),那就變成Eventual Consistency了。也就是說,更新后馬上讀,可能是舊的數(shù)據(jù),也可能是新的。

這里有一個比較坑的地方是,如果你先調(diào)用GET請求訪問一個不存在的資源,S3告訴你它不存在。然后你馬上上傳數(shù)據(jù),再調(diào)用一個GET,這時候是有可能拿不回來的。

存儲級別

作為一個“云盤”,S3的好處是可以把你存儲的數(shù)據(jù),按不同的存儲級別來計(jì)費(fèi)。這個存儲級別是每個對象不同,上傳時指定的。

我們看看不同的場景,應(yīng)該選擇哪種級別的存儲:

·經(jīng)常訪問的數(shù)據(jù)對象

1.STANDARD-這是最普通,最常用的類型

2.REDUCED_REDUNDANCY(RRS)-不建議使用。僅為不重要,可再建數(shù)據(jù)設(shè)計(jì),還有每年平均0.01%數(shù)據(jù)丟失的可能性。

·按訪問頻率自動優(yōu)化的數(shù)據(jù)

1.INTELLIGENT_TIERING-可以智能地把不熱門的數(shù)據(jù)自動轉(zhuǎn)級別。但是,每個文件最低收費(fèi)標(biāo)準(zhǔn)是128KB,存30天。

·不經(jīng)常訪問的數(shù)據(jù)

1.STANDARD_IA

2.ONEZONE_IA

AWS一個Region,有兩到三個Zone。這兩種級別的區(qū)別就是,One Zone的數(shù)據(jù)就單點(diǎn)保存,丟了就丟了。

·歸檔的數(shù)據(jù)

1.S3 Glacier-最低保存90天。取出時間1分鐘至12小時。

2.S3 Glacier Deep Archive-最低保存180天。默認(rèn)12小時內(nèi)取出。

S3計(jì)費(fèi)的大頭主要是存儲容量。但是,S3還會按照數(shù)據(jù)獲取的次數(shù),和傳輸容量來計(jì)費(fèi)。越不常訪問的級別,雖然存儲便宜,但是訪問貴。INTELLIGENT_TIERING還會收監(jiān)測和管理費(fèi)用。

生命周期的管理

除了手動指定,或者使用INTELLIGENT_TIERING外,S3其實(shí)還可以讓我們在bucket上定義生命周期管理的策略(Policy),來自動轉(zhuǎn)換對象的存儲級別。

生命周期的管理可以做到:1.轉(zhuǎn)換存儲級別;2.過期刪除

數(shù)據(jù)安全

數(shù)據(jù)安全,是數(shù)據(jù)存儲服務(wù)非常重要的一部分。S3提供了很多方面的功能來保障這一點(diǎn)。

多版本

不小心把數(shù)據(jù)刪除了的痛,程序員應(yīng)該都懂。但是,后悔藥是沒有的。所以,我們很多時候并不會做永久刪除,而是實(shí)現(xiàn)軟刪除的功能。S3就提供了多版本的功能。只要bucket打開了多版本的選項(xiàng),每次對象的更新都會新加一個版本,而不是覆蓋。刪除對象,也只是新增一個刪除標(biāo)識。

當(dāng)然,你要強(qiáng)行刪除特定版本的數(shù)據(jù)也是可以的,它只是讓這件事變得難一些而已。它甚至可以把bucket設(shè)置成只有通過MFA認(rèn)證的請求才能實(shí)現(xiàn)永久刪除。

要注意的是:1.打開版本控制的bucket,是沒法關(guān)閉的,頂多可以暫停。也就是說,暫停后的bucket,新加對象的時候,版本id會設(shè)為null。2.無論打開,或者暫停版本控制,對bucket內(nèi)已經(jīng)存在的對象是沒有影響的。

鎖定

除了使用多版本控制讓覆蓋或者刪除變得更難,S3還可以鎖定特定版本的對象。這種模型被稱為write-once-read-many(WORM)。

有兩種鎖定的方式:設(shè)定保留期限-在某固定期限內(nèi),對象WORM。法定留存-僅當(dāng)這個留存標(biāo)識被刪除后,對象才能被覆蓋或刪除。

一個特定版本的對象,可以同時設(shè)置這兩種保護(hù),或任意一種。

因?yàn)殒i定是針對特定版本的對象,如果你的更改或刪除操作請求只根據(jù)對象的鍵,那它還是允許你新增一個版本,或加上刪除標(biāo)識。只是這個鎖定,還能防止對象因?yàn)樯芷诘脑O(shè)置而被刪除掉。

服務(wù)端加密

數(shù)據(jù)傳輸過程(in-transit)中的保護(hù),現(xiàn)在基本都由SSL/TLS來實(shí)現(xiàn)的。AWS也提供VPN或者網(wǎng)絡(luò)直連服務(wù)。

S3提供了服務(wù)端數(shù)據(jù)加密的功能,可實(shí)現(xiàn)數(shù)據(jù)的存儲(at rest)方面的安全。不過它只支持對稱加密,不支持非對稱加密。雖然你可以本地把數(shù)據(jù)加密了再上傳到S3,但是,這需要自己保護(hù)好密鑰,其實(shí)更不容易。

服務(wù)端加密開啟后,bucket內(nèi)已經(jīng)存在的對象不會被自動加密。而且,只有數(shù)據(jù)被加密,元信息(meta data),標(biāo)簽(Tag)不會被加密。

S3的服務(wù)端加密有三種方式:

1.SSE-S3-S3自管理的密鑰,使用AES-256加密算法。每個對象的密鑰不同,并且它還被定期更換的主密鑰同時加密。

2.SSE-KMS-密鑰存放在KMS(軟硬件結(jié)合的密鑰管理系統(tǒng))。

3.SSE-C-在請求時自己提供密鑰,S3只管加解密邏輯和存儲。S3不保存密鑰,只保存隨機(jī)加鹽的HMAC值來驗(yàn)證今后請求的合法性。

這里主要說一下S3使用SSE-KMS特點(diǎn):

·啟用前,如果沒有指定客戶管理的CMK(customer master key),S3會自動創(chuàng)建一個由AWS管理的CMK

·加密數(shù)據(jù)的密鑰,同時也被加密,并和數(shù)據(jù)保存在一起

·有請求頻率限制

·只支持對稱密鑰

·CMK必須和bucket在同一個區(qū)(Region)

IAM集成

S3當(dāng)然能根據(jù)IAM的設(shè)置來控制權(quán)限。S3的資源,除了bucket和object外,還包含了一些子資源。

Bucket子資源:lifecycle website versioning policy cors logging

Object子資源:acl restore

在了解S3如何控制權(quán)限以前,我們要理解資源的擁有者這個概念。在S3里面,資源是誰創(chuàng)建的,它所屬的AWS帳號,就是這個資源的擁有者。有一種情況是,Bucket是帳號A創(chuàng)建的。但是A允許B在里面創(chuàng)建對象X。這個X的擁有者是B而不是A。如果資源擁有者授權(quán)A,A可以把自己的權(quán)限委托給自己帳號內(nèi)的其它人,但不可以再一次跨帳號授權(quán)。

S3如何驗(yàn)證請求

當(dāng)S3收到請求時,會經(jīng)過下面幾個步驟驗(yàn)證請求:

1.把所有相關(guān)的策略(user policy,bucket policy,ACL)集合起來。

2.根據(jù)下面3小步,拿出全集中的合適子集來分別驗(yàn)證:

3.用戶范疇如果請求發(fā)起者是IAM User或Role,它所屬的aws帳號就會先檢查它是否有權(quán)限做這種類型的操作(user policy)。假如剛好要操作的資源(bucket或object)屬于當(dāng)前帳號,那么就同時檢查相應(yīng)的bucket policy,bucket ACL和object ACL。

如果請求發(fā)起者不屬于IAM,則跳至下一步。

4.Bucket范疇S3會檢查擁有bucket的aws帳號的策略。

5.如果操作的是bucket,那請求的用戶需要有bucket owner賦予的權(quán)限。如果操作的是對象,需要檢查bucket owner是否有顯式deny對象的設(shè)置。

Object范疇當(dāng)請求是關(guān)于對象的時,最后檢查對象owner的策略子集。

天啊,這看上去好復(fù)雜。其實(shí),和一個小孩想玩玩具一樣:

首先,小孩必須獲得父母的請求,可以玩玩具。然后,看這個玩具擁有者是誰,如果是自己父母,就看這個玩具是否能給孩子玩(比如可能年齡還不合適,超時等)。如果這個玩具是其它人的,那就要還獲得其它人的允許。

不同策略的場景

對于S3驗(yàn)證請求的時候,需要驗(yàn)證的那幾種不同的策略,究竟各自的使用場景是什么呢?

·Object ACL

1.唯一一種管理保存在他人bucket里的對象權(quán)限的方式

2.定義在單個對象級別

3.最多包含100個授權(quán)信息

·Bucket ACL

1.唯一推薦使用的場景是為S3 Log Delivery賦予寫訪問日志的權(quán)限

2.雖然可以配置跨帳號權(quán)限,但僅僅支持有限的設(shè)置

·Bucket Policy

1.能給自己帳號內(nèi)的用戶賦權(quán)

2.支持所有S3操作的跨帳號權(quán)限設(shè)置

3.Policy自身大小不超過20KB

·User Policy

1.能給自己帳號內(nèi)的用戶賦權(quán)

副本備份

S3不僅通過多點(diǎn)存儲提高健壯性,還提供了自動的異步數(shù)據(jù)備份的功能。不僅支持同Region,不同bucket的備份,還支持跨Region,不同帳號的備份。要開啟副本備份,首先必須在源和目標(biāo)bucket同時打開多版本的設(shè)置。

為什么要使用?

·備份同時保留元數(shù)據(jù)

·備份至不同存儲級別

·更改備份數(shù)據(jù)的擁有權(quán)

·15分鐘內(nèi)自動備份

什么時候跨區(qū)備份(CRR)

·滿足監(jiān)管需求

·減少數(shù)據(jù)傳輸延時(地域原因)

·提高數(shù)據(jù)操作的效率

什么時候同區(qū)備份(SRR)

·合并日志

·生產(chǎn)和測試用戶間數(shù)據(jù)同步

·滿足數(shù)據(jù)主權(quán)法規(guī)

什么會同步?

·備份配置生效后新建的對象

·沒加密的對象

·通過SSE-S3或者SSE-KMS CMK(必須顯式啟用)加密的對象

·對象元數(shù)據(jù)

·bucket擁有者有權(quán)讀取的對象

·對象ACL除非備份同屬一個aws帳號

·對象標(biāo)簽

·對象的鎖信息

什么不同步?

·備份配置生效前新建的對象

·使用SSE-C加密的對象

·保存在Glacier或Glacier Deep Archive的對象

·bucket級別子資源的更新

·由于生命周期配置導(dǎo)致的操作

·源bucket中本來就是副本的對象

·刪除標(biāo)識

·源bucket中被刪除的特定版本的對象

知識小點(diǎn)與周邊

路由請求

·S3使用的是DNS來接收轉(zhuǎn)發(fā)請求。如果請求對象的S3地址不對,會返回一個臨時的重定向。但是對那些2019年3月20日后啟用的Region,地址錯誤返回的則是HTTP 400狀態(tài)。

·S3 DNS會按需更新IP地址。所以,對那些長期運(yùn)行的客戶端,可能需要采取特殊手段來更新IP信息。

靜態(tài)資源網(wǎng)站

S3的bucket可以直接配置為靜態(tài)資源網(wǎng)站。但是需要結(jié)合CloudFront才能支持HTTPS訪問。請求者付費(fèi)的bucket,不允許設(shè)置為靜態(tài)網(wǎng)站。

CloudFront數(shù)據(jù)的分發(fā)支持兩種類型:

·Web Distribution

·RTMP

Storage Gateway

當(dāng)你本地服務(wù)器想要訪問AWS S3的時候,除了API,AWS還提供了幾種網(wǎng)關(guān)可供使用:

·File Gateway-像訪問文件或者共享文件那樣訪問S3資源

·Volume Gateway-通過iSCSI設(shè)備的方式連接。細(xì)分為兩種:

·Stored Volumes-所有數(shù)據(jù)都保存在本地,但是能異步備份到S3

·Cached Volumes-所有的數(shù)據(jù)都保存到S3,本地只存放經(jīng)常訪問的數(shù)據(jù)

·Tape Gateway-模擬磁帶訪問的網(wǎng)關(guān),數(shù)據(jù)異步備份到S3 Glacier或Glacier Deep Archive

Athena和Macie

Athena是交互式的查詢服務(wù),無須部署??墒褂肧QL來查詢S3數(shù)據(jù)。支持的數(shù)據(jù)格式包括:CSV,JSON,Apache Parquet。

Macie是一種可通過NLP和ML來協(xié)助你發(fā)現(xiàn),分類和保護(hù)敏感數(shù)據(jù)的服務(wù)。它可以掃描S3中的數(shù)據(jù),看是否包含PII(Personally Identifiable Information)或者涉及版權(quán)的數(shù)據(jù)。

原文鏈接:點(diǎn)擊前往 >
版權(quán)說明:本文內(nèi)容來自于鵠思亂想,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點(diǎn),不代表快出海對觀點(diǎn)贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
個人VIP
小程序
快出海小程序
公眾號
快出海公眾號
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家