AWS API Gateway與AWS Lambda的整合及開發(fā)/測(cè)試/生產(chǎn)環(huán)境的設(shè)置

本文不是介紹 AWS API GatewayAWS 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è)置

  1. 為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
  1. 為每個(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
  1. Lambda stageTest()函數(shù)創(chuàng)建不同的alias[3][4],假設(shè)創(chuàng)建了3個(gè)分別是DEV,QA,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:DEVstageTest:QA,stageTest:PROD,其中stageTest永遠(yuǎn)指向$LATEST版本,其他指向之前設(shè)置的各個(gè)版本
  1. 整合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:QAstageTest: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)化部署了…

其他參考:


  1. http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html ?

  2. http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html ?

  3. http://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html ?

  4. http://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html ?

  5. http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started.html ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文是GitChat《Serverless 風(fēng)格微服務(wù)的持續(xù)交付(上):架構(gòu)案例》部分內(nèi)容已做修改。文章聊天實(shí)錄請(qǐng)...
    顧宇閱讀 3,352評(píng)論 1 13
  • https://aws.amazon.com/cn/s3/faqs/#sia_anchor Amazon Simp...
    守望者_(dá)1065閱讀 8,655評(píng)論 0 5
  • Lambda Function Questions: what type of code can I run as...
    abrocod閱讀 1,222評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 什么是Facade模式 隨著系統(tǒng)越來(lái)越復(fù)雜,我們需要把細(xì)節(jié)隱藏起來(lái),給客戶端提供一個(gè)統(tǒng)一的接口。在這種需求下fac...
    shawnxjf閱讀 2,710評(píng)論 0 0

友情鏈接更多精彩內(nèi)容