FaaS的簡單實踐

abel_cao發表於2018-12-17

版權宣告:本文為半吊子子全棧工匠(wireless_com,同公眾號)原創文章,未經允許不得轉載。 https://blog.csdn.net/wireless_com/article/details/85058992

 

FaaS 或者說serverless是一種雲端計算模型,其主要特點是使用者根本不需要租用任何虛擬機器ーー從啟動虛擬機器,執行程式碼,返回結果和停止虛擬機器這些由雲提供商處理的整個過程。這比其他雲端計算實現更具成本效益。它還使開發人員能夠更加專注於開發業務邏輯,因為應用程式的某些部分由雲提供程式處理。

 

要啟動執行程式碼的整個過程,必須觸發它。觸發器可以是一個特定的事件,也可以是對API 管理系統的請求,然後將該程式碼作為API 端點公開。

 

最流行的serverless服務之一是 AWS Lambda,它可以與AWS API 閘道器整合,建立一個serverlessRESTAPI

 

REST API配置


 

API的配置將由AWS API 閘道器處理。這包括建立路由、處理輸入和輸出格式、身份驗證等等,而實際程式碼將由Lambda 管理。

 

當開啟 API 閘道器儀表板時,為您的網站建立一個新的API。然後,單擊操作建立資源在API 中建立一個新的URL 路徑。每個資源都可以支援一個或多個方法(GETPOSTput/ patchDELETE) ,這些方法通過Actions > Create Method來新增。

例如,我們可以建立一個名為“post”的資源,它的路徑是“/posts”,它有兩種方法:

  • GET —      fetch all posts 把所有的帖子都拿來

  • POST —      create a new post 建立一個新的帖子

在這一點上,螢幕應該是這樣的:

640?wx_fmt=jpeg

 

 

還需要處理顯示一個單一的帖子,更新一個帖子和刪除一個帖子。這些操作在REST API 中會有一個不同的路徑,這意味著需要建立一個新的資源。由於這個資源的路徑是“/posts / { post id }”,因此它將作為一個子資源建立。要做到這一點,首先單擊“posts”資源,然後去操作建立資源。這個資源將在路徑(post ID)中有一個引數,可以通過將引數名包裝為“/posts / { post ID }”的括號來實現。建立資源後,將GET PUT DELETE 方法新增到其中。

 

API 現在看起來是這樣的:

 

 

640?wx_fmt=jpeg

 

每個方法將執行相應的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),

        `headers`: {

            `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 方法都有一個測試按鈕,它將執行它並顯示輸出。

 

 

640?wx_fmt=jpeg

一旦一切準備就緒,去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 訪問資料

640?wx_fmt=jpeg

總體資料流是以下方式工作的:

  1. 裝置向 AWS IoT 傳送小量資料(每5秒) ,

  2. 物聯網將資料儲存到 DynamoDB 表中* 

  3. Lambda函式每分鐘和每小時被觸發去做資料分析並將結果儲存回 DynamoDB,

  4. API Gateway 通過 REST API 將 DynamoDB 的資料公開

  5. 靜態 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方案的優缺點

所有這些數字意味著優化的請求率將會立即和幾乎線性地導致月度費用減少。這就帶來了必須考慮的第二個重要結論,即所有權的總成本。 有一個虛擬的門檻值,超過這個閾值,無關緊要的方法就會變得非常昂貴,而且可能不會有效。

例如,傳統的體系結構實現成本可能不是很大程度上取決於裝置的數量或每秒請求的數量,而是取決於額外的運營費用,使用開源解決方案也可以降低成本。

毫無疑問,無服務架構有許多優點:

  • 它將資本支出轉化為經營支出,並通常降低經營成本;

  • 不必考慮內部系統管理流程;

  • 它減少了開發和部署成本和時間框架(更快的上市時間) ;

  • 它具有可擴充套件性和容錯性

要考慮的第一個因素是為專案的需求, 如果不關心雲鎖定,而且是一家創業公司,需要快速驗證想法,或者有一個很短的時間去營銷,或者解決方案不需要頻繁地將資料從裝置傳輸到雲,因此可以將每臺裝置的成本保持在相對較低的水平。

另一方面,如果正在構建一個與雲無關的、高度可定製的解決方案,並且使用實時資料進行操作,可以考慮使用自定義或開源物聯網解決方案。

 

 

「本文編譯自:

http://www.devx.com/enterprise/creating-a-serverless-api-using-api-gateway-and-lambda.html

https://www.dataart.com/downloads/dataart_white_paper_art_of_low_cost_iot_solution.pdf」


相關文章