我希望通過(guò)本文介紹一下每個(gè)科技創(chuàng)業(yè)者或技術(shù)狂人都應(yīng)該知道的五大無(wú)服務(wù)器AWS服務(wù)。我不打算深入探討這些服務(wù),但會(huì)簡(jiǎn)單介紹一下這些服務(wù),并說(shuō)明它們?yōu)槭裁粗档脤W(xué)習(xí)和使用。你可以利用這些服務(wù)構(gòu)建所有你能想到的Web和移動(dòng)應(yīng)用程序,而且它們幾乎可以和所有的高級(jí)編程語(yǔ)言一起使用,例如 Python、TypeScript、JavaScript 和 Java等。下面,我們開(kāi)始。
首先,介紹一款最常用的服務(wù):Amplify。請(qǐng)注意,AWS有兩款(或者說(shuō)三款)名叫Amplify的服務(wù),我們必須區(qū)分二者:
Amplify CLI:?jiǎn)?dòng)后端;
Amplify庫(kù)(比如JS庫(kù)):用于訪問(wèn) AWS 資源的前端庫(kù);
Amplify Console:前端和后端的 CI/CD 流水線。
在此我們只介紹Amplify CLI。你可以通過(guò)Amplify CLI,在命令行界面內(nèi)運(yùn)行幾個(gè)命令來(lái)啟動(dòng)后端。有好幾種不同類(lèi)別的Amplify可供你添加,例如:
API:AppSync GraphQL 或 REST API 網(wǎng)關(guān)
身份驗(yàn)證:Cognito
存儲(chǔ):DynamoDB、S3
函數(shù):Lambda
托管:S3 和 CloudFron
只需要幾個(gè)命令,就可以通過(guò)向?qū)矫钚薪缑鏄?gòu)建全棧應(yīng)用程序。
在我看來(lái),graphql-transform 庫(kù)是最大的亮點(diǎn)。你可以利用該庫(kù)創(chuàng)建帶有自定義注釋?zhuān)ū热鏼odel或connection )的數(shù)據(jù)架構(gòu),而該庫(kù)可以將架構(gòu)轉(zhuǎn)換為有效的 GraphQL 架構(gòu),同時(shí)創(chuàng)建 CloudFormation 模板,通過(guò)該模板可以創(chuàng)建DynamoDB 表、Cognito 連接等后端資源。
請(qǐng)看下面的例子:
type Holding @model {id: ID!ISIN: String!currentPrice: Float! @funtion(name: priceResolver)}
這個(gè)架構(gòu)創(chuàng)建了類(lèi)型Holding。注釋model將在DynamoDB中創(chuàng)建一個(gè)表,主鍵為id。而currentPrice將由lambda函數(shù)priceResolver解析。
在我看來(lái),這種方式的主要缺點(diǎn)在于,靈活性不如通過(guò)CDK或Terraform等常見(jiàn)的IaC解決方案構(gòu)建的基礎(chǔ)設(shè)施。由于Amplify自身的情況,你可能會(huì)遇到一些問(wèn)題,尤其是當(dāng)你需要使用多個(gè)團(tuán)隊(duì)的環(huán)境和多個(gè)lambda層時(shí)。
盡管如此,Amplify仍不失為一個(gè)很棒的工具,它擁有一個(gè)很棒的社區(qū),而且它的團(tuán)隊(duì)仍在努力開(kāi)發(fā)其他服務(wù)。如果你想學(xué)習(xí)一款服務(wù),則可以嘗試一下這一款。
AppSync是完全由AWS托管的GraphQL API。開(kāi)發(fā)人員可以通過(guò)GraphQL API,準(zhǔn)確地獲取所需的數(shù)據(jù),同時(shí)又不必?fù)?dān)心獲取的數(shù)據(jù)太多或太少。AppSync提供了三個(gè)主要功能:查詢(xún)、修改和訂閱。
你可以通過(guò)AppSync查詢(xún)來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)。這意味著上述類(lèi)型Holding可以從不同來(lái)源獲取數(shù)據(jù)。我們繼續(xù)以上述數(shù)據(jù)架構(gòu)為例進(jìn)行說(shuō)明:
type Holding @model {id: ID!ISIN: String!currentPrice: Float! @funtion(name: priceResolver)}
屬性ISIN是來(lái)自DynamoDB的字符串,currentPrice由名為priceResolver的Lambda函數(shù)解析。此處的Lambda解析器可以提供很大的靈活性。在lambda函數(shù)中,你可以根據(jù)需要自定義代碼(請(qǐng)求兩個(gè)不同的API、清理和預(yù)處理數(shù)據(jù)等等),并返回應(yīng)用程序所需的數(shù)據(jù)。不論數(shù)據(jù)保存在何處,AppSync都可以讓你在同一個(gè)應(yīng)用程序內(nèi)解析數(shù)據(jù)。這種靈活性非常難能可貴。
接下來(lái),我們查詢(xún)數(shù)據(jù):
query MyQuery {getHolding(ISIN: "DE0005190003") {ISINcurrentPrice}}
返回?cái)?shù)據(jù)如下:
{"data": {"getHolding": {"ISIN": "DE0005190003","currentPrice": 90.94999694824219,}}}
接下來(lái),你可以通過(guò)修改查詢(xún)來(lái)更改數(shù)據(jù),而且你還可以通過(guò)訂閱查詢(xún)實(shí)時(shí)更新數(shù)據(jù)。
創(chuàng)業(yè)者為什么要學(xué)習(xí)AppSync?首先。你可以享受GraphQL帶來(lái)的好處,不僅可以保證類(lèi)型安全,而且還可以為前端開(kāi)發(fā)人員提供準(zhǔn)確請(qǐng)求所需數(shù)據(jù)的能力。其次,你可以連接到任意數(shù)據(jù)源,靈活性非常大。第三,很多工作都可以交給AWS。你只有一個(gè)終端節(jié)點(diǎn),無(wú)需解析請(qǐng)求,也不需要將不同的AWS服務(wù)連接在一起。這可以極大地減少開(kāi)發(fā)時(shí)間。
下面,我們來(lái)介紹最基本的Lambda服務(wù)。Lambda是最著名的無(wú)服務(wù)器服務(wù)。當(dāng)人們談?wù)摕o(wú)服務(wù)器時(shí),大多數(shù)指的都是lambda。lambda服務(wù)背后的思想是,無(wú)需考慮運(yùn)行代碼所需的基礎(chǔ)設(shè)施時(shí)。AWS只是保證你的代碼會(huì)被執(zhí)行。Lambda支持多種運(yùn)行時(shí),例如 Python、JavaScript、Java、C#、Rust、Go 等等。其最新的功能之一是可以將自定義的docker容器作為運(yùn)行時(shí)使用,而且計(jì)費(fèi)單位是毫秒(而不是100毫秒)。lambda的最長(zhǎng)運(yùn)行時(shí)間為15分鐘,在構(gòu)建應(yīng)用程序時(shí)要考慮到這一點(diǎn)。唯一的基礎(chǔ)設(shè)施設(shè)置是內(nèi)存設(shè)置。
價(jià)格:Lambda很便宜。每月的前一百萬(wàn)個(gè)請(qǐng)求是免費(fèi)的。超過(guò)一百萬(wàn)個(gè)以后,按照l(shuí)ambda運(yùn)行的時(shí)間進(jìn)行計(jì)算。
建議:
至少保證4GB左右的內(nèi)存,因?yàn)槌绦蜻\(yùn)行速度越快越便宜。
在處理函數(shù)的外部聲明所有的靜態(tài)變量,例如boto3中的DynamoDb。這樣可以減少冷啟動(dòng)次數(shù)。
在設(shè)計(jì)應(yīng)用程序時(shí)要考慮冷啟動(dòng)。如果你需要保證的響應(yīng)時(shí)間,請(qǐng)事先預(yù)熱lambda,或采用預(yù)先分配的并發(fā)性。
創(chuàng)業(yè)者為什么要學(xué)習(xí)lambda?lambda可以讓你免去考慮執(zhí)行代碼所需的基礎(chǔ)設(shè)施。而且價(jià)格很便宜。你的整個(gè)應(yīng)用程序都可以建立在Lambda之上。雖然需要考慮個(gè)人的具體情況和整體的架構(gòu),但據(jù)我所知大多數(shù)應(yīng)用程序都可以很容易改成在幾個(gè)lambda函數(shù)上運(yùn)行。你只需要按需付費(fèi),開(kāi)發(fā)周期短,而且部署也更容易。
下面,我們來(lái)看一看身份認(rèn)證。Cognito是AWS的身份驗(yàn)證和授權(quán)服務(wù)。你可以使用Cognito實(shí)現(xiàn)用戶(hù)注冊(cè)和登錄、用戶(hù)組控制,甚至是聯(lián)合登錄,例如 Facebook、Google 和蘋(píng)果賬號(hào)登錄。如果你是一名Saas業(yè)務(wù)創(chuàng)業(yè)者,而且希望為用戶(hù)提供無(wú)縫的身份驗(yàn)證體驗(yàn)并提供社交登錄,那么可以通過(guò)Cognito輕松實(shí)現(xiàn)。Cognito分為用戶(hù)池和身份池。
用戶(hù)池:為用戶(hù)提供注冊(cè)、登錄和聯(lián)合登錄功能。
身份池:為用戶(hù)創(chuàng)建唯一的身份,并授予他們?cè)L問(wèn)其他AWS服務(wù)的權(quán)限。例如,為匿名用戶(hù)生成臨時(shí)憑證。
對(duì)于常見(jiàn)的身份驗(yàn)證功能,你可以使用用戶(hù)池。
價(jià)格:按照每月的活躍用戶(hù)付費(fèi),前5萬(wàn)個(gè)免費(fèi)。
創(chuàng)業(yè)者為什么要學(xué)習(xí)Cognito?任何規(guī)模的企業(yè)都可以使用Cognito。你可以自定義注冊(cè)和登錄頁(yè)面,甚至可以使用AWS預(yù)先構(gòu)建的頁(yè)面。通過(guò)聯(lián)合登錄功能可以實(shí)現(xiàn)一鍵登錄。
我想介紹的最后一項(xiàng)服務(wù)是DynamoDB。DynamoDB是一個(gè)完全托管的NoSQL數(shù)據(jù)庫(kù),具有高度的可擴(kuò)展性和高可用性。我所有的項(xiàng)目都使用了DynamoDB,我是它的忠實(shí)粉絲。
DynamoDB的結(jié)構(gòu)與其他數(shù)據(jù)庫(kù)非常相似:
表:有一個(gè)或多個(gè)數(shù)據(jù)項(xiàng);
數(shù)據(jù)項(xiàng):不同屬性的集合;
鍵:分為主鍵和排序鍵;
流:你可以通過(guò)流,在表每次更新的時(shí)候觸發(fā)某些功能(例如lambda函數(shù))。
其實(shí),DynamoDB是一個(gè)鍵值數(shù)據(jù)庫(kù),你可以在其中存儲(chǔ)不同數(shù)據(jù)類(lèi)型的值。值也可以是嵌套列表或嵌套對(duì)象列表(如JSON)。下面是一個(gè)DynamoDB數(shù)據(jù)項(xiàng)的例子:
{"ISIN":{"S":"DE0005190003"},"name":{"S":"BAY.MOTOREN WERKE AG ST"}}
鍵是列名(ISIN),值是數(shù)據(jù)類(lèi)型(S代表String)以及實(shí)際值。該數(shù)據(jù)項(xiàng)也可以表示成常見(jiàn)的JSON格式:
{"ISIN": "DE0005190003","name": "BAY.MOTOREN WERKE AG ST"}
大多數(shù)SDK都可以將其解析成正確的DynamoDB表示。
DynamoDB有一些很棒的功能可以進(jìn)一步提高性能,例如全局表、DynamoDB加速器、按時(shí)間點(diǎn)恢復(fù)等等。在設(shè)計(jì)DynamoDB表時(shí),需要考慮訪問(wèn)模式。
價(jià)格:具體的使用價(jià)格取決于讀取、寫(xiě)入和存儲(chǔ)的數(shù)據(jù)量。對(duì)于Saas產(chǎn)品創(chuàng)業(yè)者來(lái)說(shuō),價(jià)格非常低廉。如果你可以預(yù)測(cè)讀寫(xiě)請(qǐng)求量,則甚至可以使用更便宜的預(yù)配置容量。
在構(gòu)建應(yīng)用程序時(shí),你可以考慮一下本文介紹的這些服務(wù)。這些服務(wù)都擁有云原生方式開(kāi)發(fā)的巨大的優(yōu)勢(shì),包括:
沒(méi)有風(fēng)險(xiǎn)。如果沒(méi)有人使用你的應(yīng)用,則無(wú)需花一分錢(qián)。這可以極大地降低你的風(fēng)險(xiǎn)。
可擴(kuò)展。如果你獲得了大量用戶(hù),則AWS可以隨著用戶(hù)數(shù)量一起擴(kuò)展。
安全。由AWS工程師為你保駕護(hù)航,而你則可以專(zhuān)注于業(yè)務(wù)邏輯。