本文不是介紹 AWS API Gateway 和 AWS Lambda的基本用法的…=(:з」∠)_
簡(jiǎn)單的來(lái)說(shuō),有了AWS的API Gateway和Lambda這兩樣?xùn)|東,再加一個(gè)數(shù)據(jù)庫(kù)(最好當(dāng)然是用AWS DynamoDB啦,或者AWS EC2上裝mysql,不用AWS也可以,但是訪問(wèn)速度可能會(huì)有一定影響,畢竟如果都用AWS的話算是走內(nèi)網(wǎng)會(huì)快一些?!),不需要任何網(wǎng)絡(luò)應(yīng)用的框架你就能開發(fā)出非常RESTful的API了,簡(jiǎn)直是中小型公司提高開發(fā)效率的神器!
再簡(jiǎn)單的來(lái)說(shuō),API Gateway給你提供一個(gè)URL,當(dāng)這個(gè)url被訪問(wèn)的時(shí)候,就會(huì)調(diào)用你設(shè)置的某個(gè)Lambda函數(shù),這個(gè)函數(shù)執(zhí)行完了之后就會(huì)返回你設(shè)定的數(shù)據(jù)。也就是說(shuō),以前你在服務(wù)器端收到一個(gè)請(qǐng)求,然后“做一堆事”完了之后發(fā)出響應(yīng)Response的這個(gè)“做一堆事”和Response,寫在一個(gè)Lambda函數(shù)里就可以了。
通常如果瀏覽器端使用ajax訪問(wèn)這個(gè)URL都會(huì)存在跨域的問(wèn)題,API Gateway當(dāng)然很貼心的提供了enable CROS選項(xiàng)!
AWS Lambda目前支持python,JAVA,NodeJS。這個(gè)Lambda函數(shù)呢,只是叫Lambda而已,實(shí)際寫起來(lái)跟函數(shù)式編程也沒(méi)有太大的關(guān)系,以前怎么寫現(xiàn)在也還是一樣的寫…神奇的是,Lambda之間可以相互調(diào)用,另外除了API Gateway之外,很多別的跟API Gateway無(wú)關(guān)的事件event也可以作為trigger(比如當(dāng)DynamoDB的某個(gè)Table新增一條用戶記錄的時(shí)候,調(diào)用一個(gè)名稱為sendWelcomeEmailToUser()的Lambda函數(shù),給用戶發(fā)歡迎郵件)
那么,問(wèn)題來(lái)了…挖掘機(jī)技術(shù)哪家強(qiáng)
如何設(shè)置AWS API Gateway和AWS Lambda來(lái)實(shí)現(xiàn)開發(fā)/測(cè)試/生產(chǎn)環(huán)境的需求呢?難道要同一個(gè)功能的API建3個(gè)、同一個(gè)功能的lambda建3個(gè)?!
以下所有內(nèi)容都是在AWS的WEB UI中進(jìn)行設(shè)置的。(除了在UI中設(shè)置,還可以寫Shell腳本去批量執(zhí)行這些設(shè)置,當(dāng)然啦,這個(gè)我還沒(méi)學(xué)會(huì)…)
哦,忘了說(shuō)…首先你要有個(gè)…API,然后你還要有個(gè)Lambda。
假設(shè):
-
API endpoint是 /stageTest,方法是
GET。 (成就GET√ =(:з」∠)_) - Lambda名為stageTest。 (endpoint的名字和lambda名字可以不同…原諒我是取名無(wú)能星人…)
DEV / QA / PROD 環(huán)境的設(shè)置
- 為API Gateway創(chuàng)建不同的stage[1],假設(shè)創(chuàng)建了3個(gè)分別是dev,qa,prod。 (教程是官方英文的,點(diǎn)引用的鏈接就可以看到,憋讓我翻譯,我懶…我知道還有pre-prod,多加一個(gè)下面的解釋就得多寫好多字(?_?))
設(shè)置了stage之后你的api endpoin看起來(lái)大概長(zhǎng)這樣:
- <aws-apiID>.execute-api.<aws-region>.amazonaws.com/dev
- <aws-apiID>.execute-api.<aws-region>.amazonaws.com/qa
- <aws-apiID>.execute-api.<aws-region>.amazonaws.com/prod
- 為每個(gè)的Stage設(shè)置stageVariables[2],假設(shè)為每個(gè)Stage都設(shè)置了一個(gè)名為env的變量
- dev這個(gè)stage中env變量的值為DEV
- qa這個(gè)stage中env變量的值為QA
- prod這個(gè)stage中env變量的值為PROD
- 在每次deploy后,都是$LATEST版本,點(diǎn)action>publish new version發(fā)布不同的版本
- 建議DEV指向$LATEST版本,QA和PROD指向其他穩(wěn)定的版本
- 為L(zhǎng)ambda創(chuàng)建了alias之后,其實(shí)這個(gè)lambda訪問(wèn)的名稱就有了以下四種:
stageTest,stageTest:DEV,stageTest:QA,stageTest:PROD,其中stageTest永遠(yuǎn)指向$LATEST版本,其他指向之前設(shè)置的各個(gè)版本
- 整合API /stageTest 的GET方法與Lambda stageTest()[5]
- 首先在API Gateway的界面中設(shè)置每個(gè)API方法的Integration Request:Integration Type選擇Lambda Function;Lambda Function填
stageTest:${stageVariables.env},${stageVariables.env}就是第2步中,設(shè)置的變量。 - 設(shè)置Lambda Function名稱的時(shí)候一定要記得點(diǎn)旁邊的√保存,保存的時(shí)候,AWS會(huì)彈出一個(gè)對(duì)話框,需要給函數(shù)加上權(quán)限才能使用stageVariables變量。加的時(shí)候記得要執(zhí)行三次命令,也就是在AWS給出的命令的對(duì)應(yīng)的位置改成
stageTest:DEV,stageTest:QA,stageTest:PROD每個(gè)執(zhí)行一次。 - 執(zhí)行以上命令之前,你必須:
- 安裝AWS CLI
- 執(zhí)行命令
aws configure,填寫你的AWS ID和key,設(shè)施default region為你的lambda function所在的region
那么,問(wèn)題又來(lái)了…
- 如果你已經(jīng)部署了很多l(xiāng)ambda和api卻沒(méi)有使用stage的話…似乎是不太可能手動(dòng)去AWS界面上一個(gè)一個(gè)設(shè)置的
- 就算你已經(jīng)在使用stage了,似乎也不太可能每次都手動(dòng)去AWS界面上一個(gè)一個(gè)deploy最新的版本以及改變alias指向的版本的…
這個(gè)時(shí)候,你就必須研究AWS CLI,然后寫shell以及借助其他工具來(lái)進(jìn)行自動(dòng)化部署了…
其他參考:
- http://docs.aws.amazon.com/apigateway/latest/developerguide/stage-variables.html
- http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#stagevariables-template-reference
-
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html ?
-
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html ?
-
http://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html ?
-
http://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html ?
-
http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started.html ?