自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

幫你通過AWS的Lambda和API Gateway走向Serverless

系統(tǒng) Linux 系統(tǒng)運(yùn)維
serverless 是一個(gè)概念,它允許你提供代碼或可執(zhí)行程序給某個(gè)服務(wù),由服務(wù)來為你執(zhí)行它們,而你無需自己管理服務(wù)器。這就是所謂的執(zhí)行即服務(wù)execution-as-a-service,它帶來了很多機(jī)會,同時(shí)也遇到了它獨(dú)有的挑戰(zhàn)。

近來,在計(jì)算領(lǐng)域出現(xiàn)了很多關(guān)于 serverless 的討論。serverless 是一個(gè)概念,它允許你提供代碼或可執(zhí)行程序給某個(gè)服務(wù),由服務(wù)來為你執(zhí)行它們,而你無需自己管理服務(wù)器。這就是所謂的執(zhí)行即服務(wù)execution-as-a-service,它帶來了很多機(jī)會,同時(shí)也遇到了它獨(dú)有的挑戰(zhàn)。

簡短回憶下計(jì)算領(lǐng)域的發(fā)展

早期,出現(xiàn)了……好吧,這有點(diǎn)復(fù)雜。很早的時(shí)候,出現(xiàn)了機(jī)械計(jì)算機(jī),后來又有了埃尼阿克 ENIAC(Electronic Numerical Integrator And Computer,很早的電子計(jì)算機(jī)),但是都沒有規(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ā)布或者流行日期,無需和我爭論時(shí)間的準(zhǔn)確性。計(jì)算領(lǐng)域的演進(jìn)趨勢是執(zhí)行的功能單元越來越小。每一次演進(jìn)通常都意味著運(yùn)維負(fù)擔(dān)的減小和運(yùn)維靈活性的增加。

發(fā)展前景

喔,Serverless!但是,serverless 能給我們帶來什么好處? 我們將面臨什么挑戰(zhàn)呢?

未執(zhí)行代碼時(shí)無需付費(fèi)。我認(rèn)為,這是個(gè)巨大的賣點(diǎn)。當(dāng)無人訪問你的站點(diǎn)或用你的 API 時(shí),你無需付錢。沒有持續(xù)支出的基礎(chǔ)設(shè)施成本,僅僅支付你需要的部分。換句話說,這履行了云計(jì)算的承諾:“僅僅支付你真正用的資源”。

無需維護(hù)服務(wù)器,也無需考慮服務(wù)器安全。服務(wù)器的維護(hù)和安全將由你的服務(wù)提供商來處理(當(dāng)然,你也可以架設(shè)自己的 serverless 主機(jī),只是這似乎是在向錯(cuò)誤的方向前進(jìn))。由于你的執(zhí)行時(shí)間也是受限的,安全補(bǔ)丁也被簡化了,因?yàn)橥耆恍枰貑ⅰ_@些都應(yīng)該由你的服務(wù)提供商無縫地處理。

***的可擴(kuò)展性。這是又一個(gè)大的好處。假設(shè)你又開發(fā)了一個(gè) Pokemon Go, 與其頻繁地把站點(diǎn)下線維護(hù)升級,不如用 serverless 來不斷地?cái)U(kuò)展。當(dāng)然,這也是個(gè)雙刃劍,大量的賬單也會隨之而來。如果你的業(yè)務(wù)的利潤強(qiáng)依賴于站點(diǎn)上線率的話,serverless 確實(shí)能幫上忙。

強(qiáng)制的微服務(wù)架構(gòu)。這也有兩面性,一方面,微服務(wù)似乎是一種好的構(gòu)建靈活可擴(kuò)展的、容錯(cuò)的架構(gòu)的方式。另一方面,如果你的業(yè)務(wù)沒有按照這種方式設(shè)計(jì),你將很難在已有的架構(gòu)中引入 serverless。

但是現(xiàn)在你被限制在他們的平臺上

受限的環(huán)境。你只能用服務(wù)提供商提供的環(huán)境,你想在 Rust 中用 serverless?你可能不會太幸運(yùn)。

受限的預(yù)裝包。你只有提供商預(yù)裝的包。但是你或許能夠提供你自己的包。

受限的執(zhí)行時(shí)間。你的 Function 只可以運(yùn)行這么長時(shí)間。如果你必須處理 1TB 的文件,你可能需要有一個(gè)解決辦法或者用其他方案。

強(qiáng)制的微服務(wù)架構(gòu)。參考上面的描述。

受限的監(jiān)視和診斷能力。例如,你的代碼在干什么? 在 serverless 中,基本不可能在調(diào)試器中設(shè)置斷點(diǎn)和跟蹤流程。你仍然可以像往常一樣記錄日志并發(fā)出統(tǒng)計(jì)度量,但是這帶來的幫助很有限,無法定位在 serverless 環(huán)境中發(fā)生的難點(diǎn)問題。

競爭領(lǐng)域

自從 2014 年出現(xiàn) AWS Lambda 以后,serverless 的提供商已經(jīng)增加了一些。下面是一些主流的服務(wù)提供商:

  • AWS Lambda - 起步最早的
  • OpenWhisk - 在 IBM 的 Bluemix 云上可用
  • Google Cloud Functions
  • Azure Functions

這些平臺都有它們的相對優(yōu)勢和劣勢(例如,Azure 支持 C#,或者緊密集成在其他提供商的平臺上)。這里面***的玩家是 AWS。

通過 AWS 的 Lambda 和 API Gateway 構(gòu)建你的***個(gè) API

我們來試一試 serverless。我們將用 AWS Lambda 和 API Gateway 來構(gòu)建一個(gè)能返回 Jimmy 所說的“Guru Meditations”的 API。

所有代碼在 GitHub 上可以找到。

API文檔:

  1. POST / 
  2.     "status""success"
  3.     "meditation""did u mention banana cognac shower" 

怎樣組織工程文件

文件結(jié)構(gòu)樹:

  1. ├── LICENSE 
  2. ├── README.md 
  3. ├── server 
  4. │   ├── __init__.py 
  5. │   ├── meditate.py 
  6. │   └── swagger.json 
  7. ├── setup.py 
  8. ├── tests 
  9. │   └── test_server 
  10. │       └── test_meditate.py 
  11. └── tools 
  12.     ├── deploy.py 
  13.     ├── serve.py 
  14.     ├── serve.sh 
  15.     ├── setup.sh 
  16.     └── zip.sh 

AWS 中的信息(想了解這里究竟在做什么的詳細(xì)信息,可查看源碼 tools/deploy.py)。

  • API。實(shí)際構(gòu)建的對象。它在 AWS 中表示為一個(gè)單獨(dú)的對象。
  • 執(zhí)行角色。在 AWS 中,每個(gè) Function 作為一個(gè)單獨(dú)的角色執(zhí)行。在這里就是 meditations。
  • 角色策略。每個(gè) Function 作為一個(gè)角色執(zhí)行,每個(gè)角色需要權(quán)限來干活。我們的 Lambda Function 不干太多活,故我們只添加一些日志記錄權(quán)限。
  • Lambda Function。運(yùn)行我們的代碼的地方。
  • Swagger。 Swagger 是 API 的規(guī)范。API Gateway 支持解析 swagger 的定義來為 API 配置大部分資源。
  • 部署。API Gateway 提供部署的概念。我們只需要為我們的 API 用一個(gè)就行(例如,所有的都用生產(chǎn)或者 yolo等),但是得知道它們是存在的,并且對于真正的產(chǎn)品級服務(wù),你可能想用開發(fā)和暫存環(huán)境。
  • 監(jiān)控。在我們的業(yè)務(wù)崩潰的情況下(或者因?yàn)槭褂卯a(chǎn)生大量賬單時(shí)),我們想以云告警查看方式為這些錯(cuò)誤和費(fèi)用添加一些監(jiān)控。注意你應(yīng)該修改 tools/deploy.py 來正確地設(shè)置你的 email。

代碼

Lambda Function 將從一個(gè)硬編碼列表中隨機(jī)選擇一個(gè)并返回 guru meditations,非常簡單:

  1. import logging 
  2. import random 
  3.  
  4. logger = logging.getLogger() 
  5. logger.setLevel(logging.INFO) 
  6.  
  7. def handler(event, context): 
  8.  
  9.     logger.info(u"received request with id '{}'".format(context.aws_request_id)) 
  10.  
  11.     meditations = [ 
  12.     "off to a regex/"
  13.     "the count of machines abides"
  14.     "you wouldn't fax a bat"
  15.     "HAZARDOUS CHEMICALS + RKELLY"
  16.     "your solution requires a blood eagle"
  17.     "testing is broken because I'm lazy"
  18.     "did u mention banana cognac shower"
  19.     ]
  20.  
  21.     meditation = random.choice(meditations) 
  22.  
  23.     return { 
  24.         "status""success"
  25.         "meditation": meditation, 
  26.     } 

deploy.py 腳本

這個(gè)腳本相當(dāng)長,我沒法貼在這里。它基本只是遍歷上述“AWS 中的信息”下的項(xiàng)目,確保每項(xiàng)都存在。

我們來部署這個(gè)腳本

只需運(yùn)行 ./tools/deploy.py。

基本完成了。不過似乎在權(quán)限申請上有些問題,由于 API Gateway 沒有權(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)限。你可以通過 AWS console 來解決這個(gè)問題,找到你的 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 的行為:

  1. $ curl -X POST https://a1b2c3d4.execute-api.us-east-1.amazonaws.com/prod/ 
  2. {"status""success""meditation""the count of machines abides"

本地運(yùn)行

不幸的是,AWS Lambda 沒有好的方法能在本地運(yùn)行你的代碼。在這個(gè)例子里,我們將用一個(gè)簡單的 flask 服務(wù)器來在本地托管合適的端點(diǎn),并調(diào)用 handler 函數(shù)。

  1. from __future__ import absolute_import 
  2.  
  3. from flask import Flask, jsonify 
  4.  
  5. from server.meditate import handler 
  6.  
  7. app = Flask(__name__) 
  8.  
  9. @app.route("/", methods=["POST"]) 
  10. def index():
  11.  
  12.     class FakeContext(object): 
  13.         aws_request_id = "XXX" 
  14.  
  15.     return jsonify(**handler(None, FakeContext())) 
  16.  
  17. app.run(host="0.0.0.0"

你可以在倉庫中用 ./tools/serve.sh 運(yùn)行它,像這樣調(diào)用:

  1. $ curl -X POST http://localhost:5000/ 
  2.     "meditation""your solution requires a blood eagle"
  3.     "status""success" 

測試

你總是應(yīng)該測試你的代碼。我們的測試方法是導(dǎo)入并運(yùn)行我們的 handler 函數(shù)。這是最基本的 python 測試方法:

  1. from __future__ import absolute_import 
  2.  
  3. import unittest 
  4.  
  5. from server.meditate import handler 
  6.  
  7. class SubmitTestCase(unittest.TestCase): 
  8.  
  9. def test_submit(self): 
  10.  
  11. class FakeContext(object): 
  12.  
  13. aws_request_id = "XXX" 
  14.  
  15. response = handler(None, FakeContext()) 
  16.  
  17. self.assertEquals(response["status"], "success" 
  18. self.assertTrue("meditation" in response) 

你可以在倉庫里通過 nose2 運(yùn)行這個(gè)測試代碼。

更多前景

  • 和 AWS 服務(wù)的無縫集成。通過 boto,你可以***地輕易連接到任何其他的 AWS 服務(wù)。你可以輕易地讓你的執(zhí)行角色用 IAM 訪問這些服務(wù)。你可以從 S3 取文件或放文件到 S3,連接到 Dynamo DB,調(diào)用其他 Lambda Function,等等。
  • 訪問數(shù)據(jù)庫。你也可以輕易地訪問遠(yuǎn)程數(shù)據(jù)庫。在你的 Lambda handler 模塊的最上面連接數(shù)據(jù)庫,并在handler 函數(shù)中執(zhí)行查詢。你很可能必須從它的安裝位置上傳相關(guān)的包內(nèi)容才能使它正常工作??赡苣阋残枰o態(tài)編譯某些庫。
  • 調(diào)用其他 webservices。API Gateway 也是一種把 webservices 的輸出從一個(gè)格式轉(zhuǎn)換成另一個(gè)格式的方法。你可以充分利用這個(gè)特點(diǎn)通過不同的 webservices 來代理調(diào)用,或者當(dāng)業(yè)務(wù)變更時(shí)提供后向兼容能力。
責(zé)任編輯:武曉燕 來源: Linux中國
相關(guān)推薦

2016-07-01 16:13:13

AWSLambda

2020-10-13 08:03:47

ServerlessFramework

2023-04-18 15:18:10

2018-05-17 22:55:48

AWS Lambda服務(wù)器代碼

2014-11-14 10:08:07

AWSAWS Lambda

2014-11-14 10:16:18

亞馬遜

2019-05-07 09:00:40

無服務(wù)器Lambda管理

2015-11-16 17:48:00

2015-07-14 16:17:56

亞馬遜AWSAWS API Gat

2023-05-04 17:20:54

AWS ECSAWS Lambda云計(jì)算

2023-07-30 15:00:21

2025-02-14 15:36:05

2023-11-29 12:09:07

AWS網(wǎng)絡(luò)服務(wù)

2017-06-05 10:08:33

無服務(wù)器計(jì)算AWS Lambda

2021-01-15 16:23:39

ArubaAWSIoT

2022-02-08 10:41:20

Service MeAPI GatewaLinux

2025-02-20 08:11:52

2018-05-07 10:04:55

ServerlessGoogle ClouAzure

2021-09-06 16:51:02

阿里云Serverless計(jì)算機(jī)

2014-11-18 09:43:29

AWS Lambda事件驅(qū)動計(jì)算服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號