FaaS或者說serverless是一種云計算模型,其主要特點是用戶根本不需要租用任何虛擬機,從啟動虛擬機,執行代碼,返回結果和停止虛擬機這些由云提供商處理的整個過程。這比其他云計算實現更具成本效益。它還使開發人員能夠更加專注于開發業務邏輯,因為應用程序的某些部分由云提供程序處理。
要啟動執行代碼的整個過程,必須觸發它。觸發器可以是一個特定的事件,也可以是對API 管理系統的請求,然后將該代碼作為API 端點公開。
最流行的serverless服務之一是 AWS Lambda,它可以與AWS API 網關集成,創建一個serverless的RESTAPI。
REST API配置
API的配置將由AWS API 網關處理。這包括創建路由、處理輸入和輸出格式、身份驗證等等,而實際代碼將由Lambda 管理。
當開啟 API 網關儀表板時,為您的網站創建一個新的API。然后,單擊操作創建資源在API 中創建一個新的URL 路徑。每個資源都可以支持一個或多個方法(GET,POST,put/ patch,DELETE) ,這些方法通過Actions > Create Method來添加。
例如,我們可以創建一個名為“post”的資源,它的路徑是“/posts”,它有兩種方法:
GET —fetch all posts 把所有的帖子都拿來
POST —create a new post 創建一個新的帖子
在這一點上,屏幕應該是這樣的:
還需要處理顯示一個單一的帖子,更新一個帖子和刪除一個帖子。這些操作在REST API 中會有一個不同的路徑,這意味著需要創建一個新的資源。由于這個資源的路徑是“/posts / { post id }”,因此它將作為一個子資源創建。要做到這一點,首先單擊“posts”資源,然后去操作創建資源。這個資源將在路徑(post的 ID)中有一個參數,可以通過將參數名包裝為“/posts / { post ID }”的括號來實現。創建資源后,將GET、 PUT 和DELETE 方法添加到其中。
API 現在看起來是這樣的:
每個方法將執行相應的AWS Lambda 函數。先創建這些函數,然后將它們映射到適當的API 方法。
創建 Lambda 函數
點擊AWS Lambda,點擊“Create a Lambdafunction”。下一個屏幕允許選擇編程語言(Node.js或 Python)和預定義的模板之一。選擇microservice-http-endpoint,然后在下面的頁面中選擇API 名稱。也可以選擇空白函數,并且不用任何預先編寫的代碼來編寫它。
最后,在可以插入代碼的頁面。可以直接在頁面上寫這個函數,或者將它作為壓縮存檔上傳(如果它包含自定義庫,則需要)。當我們使用預定義模板時,函數是自動生成的,看起來是這樣的:
from __future__ importprint_function
import boto3
import json
print(‘Loading function’)
def respond(err,res=None):
return {
‘statusCode’: ‘400’ if err else ‘200’,
‘body’: err.message if err elsejson.dumps(res),
‘Content-Type’:‘application/json’,
},
}
def lambda_handler(event,context):
‘‘‘Demonstrates a simple HTTP endpointusing API Gateway. You have full
access to the request and response payload,including headers and
status code.
To scan a DynamoDB table, make a GETrequest with the TableName as a
query string parameter. To put, update, ordelete an item, make a POST,
PUT, or DELETE request respectively,passing in the payload to the
DynamoDB API as a JSON body.
’’’
#print(“Received event:”+json.dumps(event, indent=2))
operations = {
‘DELETE’: lambda dynamo, x:dynamo.delete_item(**x),
‘GET’: lambda dynamo, x:dynamo.scan(**x),
‘POST’: lambda dynamo, x:dynamo.put_item(**x),
‘PUT’: lambda dynamo, x:dynamo.update_item(**x),
}
operation = event[‘httpMethod’]
if operation in operations:
payload = event[‘queryStringParameters’]if operation == ‘GET’ else json.loads(event[‘body’])
dynamo =boto3.resource(‘dynamodb’).Table(payload[‘TableName’])
return respond(None,operations[operation](dynamo, payload))
else:
returnrespond(ValueError(‘Unsupported method “{}”’.format(operation)))
雖然大多數情況下不需要很多代碼(許多人會使用關系數據庫而不是NoSQL DynamoDB 數據庫) ,但它為如何訪問HTTP 請求參數和如何輸出響應設置了一個很好的例子。
在創建Lambda 函數時需要注意的另一件事是handler字段。它告訴Lambda 要執行哪個函數,以及函數所在的文件。例如,如果main.py 文件中有一個名為“myfunction”的函數,那么處理程序的值將是“main.myfunction”。在創建函數之后,它們可以映射到相應的API 端點。
要使API 調用 Lambda 函數,請單擊一個API 方法,然后進入集成請求。在該頁上,將集成類型設置為Lambda 函數,并輸入您的亞馬遜區域和所需函數的名稱。對于所有的API 方法都這樣做。
在部署之前,可以測試API。每個API 方法都有一個測試按鈕,它將執行它并顯示輸出。
一旦一切準備就緒,去action Deploy API 部署你的REST API。第一次,需要創造一個新的階段(例如,它可以被稱為prod 或生產),就像一個部署環境。可以有多個階段,不同的階段有不同的基礎url 和配置。可以在屏幕左側的Mywebsite API Stages 下找到各個階段。點擊該階段的名稱以獲取API 的公共 URL,以及其他配置選項,如緩存和節流。
這里展示了一個基本的例子,一個serverless的REST API,使用AWS API 網關和Lambda 構建。它展示了如何在不需要開發常見的API 管理特性的情況下輕松地創建REST API,比如認證、路由、緩存和速率限制等。
更進一步, 物聯網的快速采用受到正在通過技術創新改變其業務的公司的支持; 制造商正在提供低成本和高端的設備和物聯網平臺,使設備集成和管理成為可能。物聯網應該轉向靈活、可靠和高成本效益的平臺,而在基礎設施、軟件、知識和員工方面投入最少。
IoT的無服務架構
如何從零開始構建一個物聯網解決方案,它的基礎設施和維護成本為零,只需要很少的營運成本。為了實現這個概念,可以使用AWS的云功能。 例如,創建實時報告遙測數據的設備模擬器,并通過 API 實時訪問這些信息。
AWS IoT 平臺是一個強大的物聯網框架。 它支持 MQTT 協議,MQTT 協議是應用最廣泛的通信協議之一。 選擇支持持久化和處理數據的服務也是基于其定價和維護成本。
AWS中所使用的組件列表如下:
AWS IoT : 用于數據收集和設備管理,
DynamoDB: 文檔存儲以持久化數據讀數,
AWS Lambda : 無服務器數據處理,
S3:用作靜態網站托管的塊存儲,
Gateway API :REST 訪問數據
總體數據流是以下方式工作的:
設備向 AWS IoT 發送小量數據(每5秒) ,
物聯網將數據存儲到 DynamoDB 表中*
Lambda函數每分鐘和每小時被觸發去做數據分析并將結果存儲回 DynamoDB,
API Gateway 通過 REST API 將 DynamoDB 的數據公開
靜態 HTML 網站托管在 S3上,并使用 RESTAPI 來顯示實時數據圖表和分析
第二點乍看起來可能有點傻,因為可能會認為 DynamoDB 不是存儲原始時間序列數據的最佳選擇。 然而,這里是為了演示的目的。可以考慮使用 Firehose 作為從物聯網到 S3/reshift 和 EMR 集群的傳輸流來進行數據處理,但對于這個簡單實踐而言,這里只是一個臨時的做法。
架構設置了以下關鍵參數:
免費,如果沒有設備報告任何數據。 另外,通過亞馬遜的免費版,可以免費獲得少量的資源
由于每個選定組件的性質,高度可擴展且可以從AWS中獲取
啟動只需的最基本知識,只需要定義規則和用一種非常流行的語言編寫邏輯: JavaScript,Python 或者 Java
IoT無服務架構的成本分析
假設后端操作每分鐘只需要處理幾個請求,這意味著大部分時間您的 CPU 處于空閑狀態。 假設不想為空閑時間買單。 因此,這里提出了無服務器架構。
假設有10000個設備每15分鐘報告一小部分數據,這就導致每月平均730個小時,每月約有2920萬個請求。AWS物聯網每100萬個請求花費5美元,DynamoDB 每秒花費0.0065美元,每秒需要花費50次。
通過 AWS IoT,每月將付出146美元左右的,14美元用于在 DynamoDB 中運行的最小存儲容量,總共有160美元,相當于每臺設備每月0.02美元或者每次0.000005美元。 盡管這沒有考慮到 lambda、存儲器和 API 網關的使用,但它們實際上只是這些數字的一小部分,因此可以省略。
這是令人印象深刻的。物聯網解決方案與數以千計的設備連接,這將花費不到200美元每月。 然而,讓我們想象一下,如果一個企業的設備每秒鐘都在報告關鍵數據(而不是每隔15分鐘) ,而且有成千上萬的數據。 還愿意為FaaS付多少錢呢?
如果一萬臺設備每秒發送一條消息,月付款將超過1.36萬美元。如果是10萬臺設備, 每月每臺設備的費用增加到13.61美元,還是挺貴的。
無服務架構IoT方案的優缺點
所有這些數字意味著優化的請求率將會立即和幾乎線性地導致月度費用減少。這就帶來了必須考慮的第二個重要結論,即所有權的總成本。 有一個虛擬的門檻值,超過這個閾值,無關緊要的方法就會變得非常昂貴,而且可能不會有效。
例如,傳統的體系結構實現成本可能不是很大程度上取決于設備的數量或每秒請求的數量,而是取決于額外的運營費用,使用開源解決方案也可以降低成本。
毫無疑問,無服務架構有許多優點:
它將資本支出轉化為經營支出,并通常降低經營成本;
不必考慮內部系統管理流程;
它減少了開發和部署成本和時間框架(更快的上市時間) ;
它具有可擴展性和容錯性
要考慮的第一個因素是為項目的需求, 如果不關心云鎖定,而且是一家創業公司,需要快速驗證想法,或者有一個很短的時間去營銷,或者解決方案不需要頻繁地將數據從設備傳輸到云,因此可以將每臺設備的成本保持在相對較低的水平。
另一方面,如果正在構建一個與云無關的、高度可定制的解決方案,并且使用實時數據進行操作,可以考慮使用自定義或開源物聯網解決方案。
審核編輯:符乾江
-
云服務
+關注
關注
0文章
826瀏覽量
38933 -
AWS
+關注
關注
0文章
432瀏覽量
24402 -
serverless
+關注
關注
0文章
65瀏覽量
4514
發布評論請先 登錄
相關推薦
評論