一文讀懂AWS S3

來(lái)源:鵠思亂想
作者:陳鵠
時(shí)間:2020-07-28
2739
AWS S3全名是Simple Storage Service,簡(jiǎn)便的存儲(chǔ)服務(wù)。

86cd1dfd6b11d91cab3f227adfe7-1447727.jpg

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

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

2.對(duì)S3來(lái)說(shuō),存在里面的數(shù)據(jù)就是對(duì)象名(鍵),和數(shù)據(jù)(值)

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

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

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

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

作為一個(gè)對(duì)象存儲(chǔ)服務(wù),S3功能真的很完備。如果不用搭梯子,訪問(wèn)快,我還真想過(guò)拿它來(lái)做自己的網(wǎng)盤(pán)。

v2-8485ec6daf4bbb22802357257ecef758_1440w.jpg

基本概念

Bucket

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

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

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

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

·沒(méi)有對(duì)象存儲(chǔ)數(shù)量限制

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

Object

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

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

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

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

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

一致性特性

對(duì)程序員來(lái)說(shuō),這么一個(gè)類似數(shù)據(jù)庫(kù)的東西,肯定需要關(guān)心它的讀寫(xiě)特性和一致性模型。

·沒(méi)有鎖的功能。如果同時(shí)(幾乎)發(fā)起兩個(gè)更新對(duì)象的PUT請(qǐng)求,鍵相同,那么,以到達(dá)S3時(shí)間先后處理更新。

·不同對(duì)象的更新,沒(méi)法做到原子操作。

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

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

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

存儲(chǔ)級(jí)別

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

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

·經(jīng)常訪問(wèn)的數(shù)據(jù)對(duì)象

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

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

·按訪問(wèn)頻率自動(dòng)優(yōu)化的數(shù)據(jù)

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

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

1.STANDARD_IA

2.ONEZONE_IA

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

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

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

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

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

生命周期的管理

除了手動(dòng)指定,或者使用INTELLIGENT_TIERING外,S3其實(shí)還可以讓我們?cè)赽ucket上定義生命周期管理的策略(Policy),來(lái)自動(dòng)轉(zhuǎn)換對(duì)象的存儲(chǔ)級(jí)別。

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

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

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

多版本

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

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

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

鎖定

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

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

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

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

服務(wù)端加密

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

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

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

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

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

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

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

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

·啟用前,如果沒(méi)有指定客戶管理的CMK(customer master key),S3會(huì)自動(dòng)創(chuàng)建一個(gè)由AWS管理的CMK

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

·有請(qǐng)求頻率限制

·只支持對(duì)稱密鑰

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

IAM集成

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

Bucket子資源:lifecycle website versioning policy cors logging

Object子資源:acl restore

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

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

當(dāng)S3收到請(qǐng)求時(shí),會(huì)經(jīng)過(guò)下面幾個(gè)步驟驗(yàn)證請(qǐng)求:

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

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

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

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

4.Bucket范疇S3會(huì)檢查擁有bucket的aws帳號(hào)的策略。

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

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

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

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

不同策略的場(chǎng)景

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

·Object ACL

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

2.定義在單個(gè)對(duì)象級(jí)別

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

·Bucket ACL

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

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

·Bucket Policy

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

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

3.Policy自身大小不超過(guò)20KB

·User Policy

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

副本備份

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

為什么要使用?

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

·備份至不同存儲(chǔ)級(jí)別

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

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

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

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

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

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

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

·合并日志

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

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

什么會(huì)同步?

·備份配置生效后新建的對(duì)象

·沒(méi)加密的對(duì)象

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

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

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

·對(duì)象ACL除非備份同屬一個(gè)aws帳號(hào)

·對(duì)象標(biāo)簽

·對(duì)象的鎖信息

什么不同步?

·備份配置生效前新建的對(duì)象

·使用SSE-C加密的對(duì)象

·保存在Glacier或Glacier Deep Archive的對(duì)象

·bucket級(jí)別子資源的更新

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

·源bucket中本來(lái)就是副本的對(duì)象

·刪除標(biāo)識(shí)

·源bucket中被刪除的特定版本的對(duì)象

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

路由請(qǐng)求

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

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

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

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

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

·Web Distribution

·RTMP

Storage Gateway

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

·File Gateway-像訪問(wèn)文件或者共享文件那樣訪問(wèn)S3資源

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

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

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

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

Athena和Macie

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

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

立即登錄,閱讀全文
原文鏈接:點(diǎn)擊前往 >
版權(quán)說(shuō)明:本文內(nèi)容來(lái)自于鵠思亂想,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開(kāi)掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家