本篇內(nèi)容介紹了“如何通過(guò)AWS的Lambda和API Gateway走向Serverless”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、新沂網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、新沂網(wǎng)絡(luò)營(yíng)銷、新沂企業(yè)策劃、新沂品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供新沂建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
簡(jiǎn)短回憶下計(jì)算領(lǐng)域的發(fā)展
早期,出現(xiàn)了……好吧,這有點(diǎn)復(fù)雜。很早的時(shí)候,出現(xiàn)了機(jī)械計(jì)算機(jī),后來(lái)又有了埃尼阿克 ENIAC(Electronic Numerical Integrator And Computer,很早的電子計(jì)算機(jī)),但是都沒(méi)有規(guī)模生產(chǎn)。直到大型機(jī)出現(xiàn)后,計(jì)算領(lǐng)域才快速發(fā)展。
上世紀(jì) 50 年代 - 大型機(jī)
上世紀(jì) 60 年代 - 微型機(jī)
1994 - 機(jī)架服務(wù)器
2001 - 刀片服務(wù)器
本世紀(jì)初 - 虛擬服務(wù)器
2006 - 服務(wù)器云化
2013 - 容器化
2014 - serverless(計(jì)算資源服務(wù)化)
這些日期是大概的發(fā)布或者流行日期,無(wú)需和我爭(zhēng)論時(shí)間的準(zhǔn)確性。計(jì)算領(lǐng)域的演進(jìn)趨勢(shì)是執(zhí)行的功能單元越來(lái)越小。每一次演進(jìn)通常都意味著運(yùn)維負(fù)擔(dān)的減小和運(yùn)維靈活性的增加。
發(fā)展前景
喔,Serverless!但是,serverless 能給我們帶來(lái)什么好處? 我們將面臨什么挑戰(zhàn)呢?
未執(zhí)行代碼時(shí)無(wú)需付費(fèi)。我認(rèn)為,這是個(gè)巨大的賣(mài)點(diǎn)。當(dāng)無(wú)人訪問(wèn)你的站點(diǎn)或用你的 API 時(shí),你無(wú)需付錢(qián)。沒(méi)有持續(xù)支出的基礎(chǔ)設(shè)施成本,僅僅支付你需要的部分。換句話說(shuō),這履行了云計(jì)算的承諾:“僅僅支付你真正用的資源”。
無(wú)需維護(hù)服務(wù)器,也無(wú)需考慮服務(wù)器安全。服務(wù)器的維護(hù)和安全將由你的服務(wù)提供商來(lái)處理(當(dāng)然,你也可以架設(shè)自己的 serverless 主機(jī),只是這似乎是在向錯(cuò)誤的方向前進(jìn))。由于你的執(zhí)行時(shí)間也是受限的,安全補(bǔ)丁也被簡(jiǎn)化了,因?yàn)橥耆恍枰貑ⅰ_@些都應(yīng)該由你的服務(wù)提供商無(wú)縫地處理。
***的可擴(kuò)展性。這是又一個(gè)大的好處。假設(shè)你又開(kāi)發(fā)了一個(gè) Pokemon Go, 與其頻繁地把站點(diǎn)下線維護(hù)升級(jí),不如用 serverless 來(lái)不斷地?cái)U(kuò)展。當(dāng)然,這也是個(gè)雙刃劍,大量的賬單也會(huì)隨之而來(lái)。如果你的業(yè)務(wù)的利潤(rùn)強(qiáng)依賴于站點(diǎn)上線率的話,serverless 確實(shí)能幫上忙。
強(qiáng)制的微服務(wù)架構(gòu)。這也有兩面性,一方面,微服務(wù)似乎是一種好的構(gòu)建靈活可擴(kuò)展的、容錯(cuò)的架構(gòu)的方式。另一方面,如果你的業(yè)務(wù)沒(méi)有按照這種方式設(shè)計(jì),你將很難在已有的架構(gòu)中引入 serverless。
但是現(xiàn)在你被限制在他們的平臺(tái)上
受限的環(huán)境。你只能用服務(wù)提供商提供的環(huán)境,你想在 Rust 中用 serverless?你可能不會(huì)太幸運(yùn)。
受限的預(yù)裝包。你只有提供商預(yù)裝的包。但是你或許能夠提供你自己的包。
受限的執(zhí)行時(shí)間。你的 Function 只可以運(yùn)行這么長(zhǎng)時(shí)間。如果你必須處理 1TB 的文件,你可能需要有一個(gè)解決辦法或者用其他方案。
強(qiáng)制的微服務(wù)架構(gòu)。參考上面的描述。
受限的監(jiān)視和診斷能力。例如,你的代碼在干什么? 在 serverless 中,基本不可能在調(diào)試器中設(shè)置斷點(diǎn)和跟蹤流程。你仍然可以像往常一樣記錄日志并發(fā)出統(tǒng)計(jì)度量,但是這帶來(lái)的幫助很有限,無(wú)法定位在 serverless 環(huán)境中發(fā)生的難點(diǎn)問(wèn)題。
競(jìng)爭(zhēng)領(lǐng)域
自從 2014 年出現(xiàn) AWS Lambda 以后,serverless 的提供商已經(jīng)增加了一些。下面是一些主流的服務(wù)提供商:
AWS Lambda - 起步最早的
OpenWhisk - 在 IBM 的 Bluemix 云上可用
Google Cloud Functions
Azure Functions
這些平臺(tái)都有它們的相對(duì)優(yōu)勢(shì)和劣勢(shì)(例如,Azure 支持 C#,或者緊密集成在其他提供商的平臺(tái)上)。這里面***的玩家是 AWS。
通過(guò) AWS 的 Lambda 和 API Gateway 構(gòu)建你的***個(gè) API
我們來(lái)試一試 serverless。我們將用 AWS Lambda 和 API Gateway 來(lái)構(gòu)建一個(gè)能返回 Jimmy 所說(shuō)的“Guru Meditations”的 API。
所有代碼在 GitHub 上可以找到。
API文檔:
POST / { "status": "success", "meditation": "did u mention banana cognac shower" }
怎樣組織工程文件
文件結(jié)構(gòu)樹(shù):
. ├── LICENSE ├── README.md ├── server │ ├── __init__.py │ ├── meditate.py │ └── swagger.json ├── setup.py ├── tests │ └── test_server │ └── test_meditate.py └── tools ├── deploy.py ├── serve.py ├── serve.sh ├── setup.sh └── zip.sh
AWS 中的信息
API。實(shí)際構(gòu)建的對(duì)象。它在 AWS 中表示為一個(gè)單獨(dú)的對(duì)象。
執(zhí)行角色。在 AWS 中,每個(gè) Function 作為一個(gè)單獨(dú)的角色執(zhí)行。在這里就是 meditations。
角色策略。每個(gè) Function 作為一個(gè)角色執(zhí)行,每個(gè)角色需要權(quán)限來(lái)干活。我們的 Lambda Function 不干太多活,故我們只添加一些日志記錄權(quán)限。
Lambda Function。運(yùn)行我們的代碼的地方。
Swagger。 Swagger 是 API 的規(guī)范。API Gateway 支持解析 swagger 的定義來(lái)為 API 配置大部分資源。
部署。API Gateway 提供部署的概念。我們只需要為我們的 API 用一個(gè)就行(例如,所有的都用生產(chǎn)或者 yolo等),但是得知道它們是存在的,并且對(duì)于真正的產(chǎn)品級(jí)服務(wù),你可能想用開(kāi)發(fā)和暫存環(huán)境。
監(jiān)控。在我們的業(yè)務(wù)崩潰的情況下(或者因?yàn)槭褂卯a(chǎn)生大量賬單時(shí)),我們想以云告警查看方式為這些錯(cuò)誤和費(fèi)用添加一些監(jiān)控。注意你應(yīng)該修改 tools/deploy.py 來(lái)正確地設(shè)置你的 email。
代碼
Lambda Function 將從一個(gè)硬編碼列表中隨機(jī)選擇一個(gè)并返回 guru meditations,非常簡(jiǎn)單:
import logging import random logger = logging.getLogger() logger.setLevel(logging.INFO) def handler(event, context): logger.info(u"received request with id '{}'".format(context.aws_request_id)) meditations = [ "off to a regex/", "the count of machines abides", "you wouldn't fax a bat", "HAZARDOUS CHEMICALS + RKELLY", "your solution requires a blood eagle", "testing is broken because I'm lazy", "did u mention banana cognac shower", ] meditation = random.choice(meditations) return { "status": "success", "meditation": meditation, }
deploy.py 腳本
這個(gè)腳本相當(dāng)長(zhǎng),我沒(méi)法貼在這里。它基本只是遍歷上述“AWS 中的信息”下的項(xiàng)目,確保每項(xiàng)都存在。
我們來(lái)部署這個(gè)腳本
只需運(yùn)行 ./tools/deploy.py。
基本完成了。不過(guò)似乎在權(quán)限申請(qǐng)上有些問(wèn)題,由于 API Gateway 沒(méi)有權(quán)限去執(zhí)行你的 Function,所以你的 Lambda Function 將不能執(zhí)行,報(bào)錯(cuò)應(yīng)該是“Execution failed due to configuration error: Invalid permissions on Lambda function”。我不知道怎么用 botocore 添加權(quán)限。你可以通過(guò) AWS console 來(lái)解決這個(gè)問(wèn)題,找到你的 API, 進(jìn)到 /POST 端點(diǎn),進(jìn)到“integration request”,點(diǎn)擊“Lambda Function”旁邊的編輯圖標(biāo),修改它,然后保存。此時(shí)將彈出一個(gè)窗口提示“You are about to give API Gateway permission to invoke your Lambda function”, 點(diǎn)擊“OK”。
當(dāng)你完成后,記錄下 ./tools/deploy.py 打印出的 URL,像下面這樣調(diào)用它,然后查看你的新 API 的行為:
$ curl -X POST https://a1b2c3d4.execute-api.us-east-1.amazonaws.com/prod/ {"status": "success", "meditation": "the count of machines abides"}
本地運(yùn)行
不幸的是,AWS Lambda 沒(méi)有好的方法能在本地運(yùn)行你的代碼。在這個(gè)例子里,我們將用一個(gè)簡(jiǎn)單的 flask 服務(wù)器來(lái)在本地托管合適的端點(diǎn),并調(diào)用 handler 函數(shù)。
from __future__ import absolute_import from flask import Flask, jsonify from server.meditate import handler app = Flask(__name__) @app.route("/", methods=["POST"]) def index(): class FakeContext(object): aws_request_id = "XXX" return jsonify(**handler(None, FakeContext())) app.run(host="0.0.0.0")
你可以在倉(cāng)庫(kù)中用 ./tools/serve.sh 運(yùn)行它,像這樣調(diào)用:
$ curl -X POST http://localhost:5000/ { "meditation": "your solution requires a blood eagle", "status": "success" }
測(cè)試
你總是應(yīng)該測(cè)試你的代碼。我們的測(cè)試方法是導(dǎo)入并運(yùn)行我們的 handler 函數(shù)。這是最基本的 python 測(cè)試方法:
from __future__ import absolute_import import unittest from server.meditate import handler class SubmitTestCase(unittest.TestCase): def test_submit(self): class FakeContext(object): aws_request_id = "XXX" response = handler(None, FakeContext()) self.assertEquals(response["status"], "success") self.assertTrue("meditation" in response)
你可以在倉(cāng)庫(kù)里通過(guò) nose2 運(yùn)行這個(gè)測(cè)試代碼。
“如何通過(guò)AWS的Lambda和API Gateway走向Serverless”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!