
無伺服器 - API 閘道器觸發的 Lambda 函式
API 閘道器是另一種流行的觸發 Lambda 函式的方法,就像 cron/rate 事件一樣。基本上,您可以為您的 Lambda 函式獲取一個 URL 終結點。此 URL 屬於連線到您的 Lambda 函式的 API 閘道器。每當您呼叫 URL 時,無論是在瀏覽器中還是透過應用程式,您的 Lambda 函式都會被呼叫。在本章中,我們將瞭解如何使用無伺服器框架將 API 閘道器連線到您的 Lambda 函式,以及如何對其進行測試。
HTTP 事件
要將 API 閘道器連結到 Lambda 函式,我們需要在 serverless.yml 中的函式定義中建立 HTTP 事件。以下示例顯示瞭如何將您的 Lambda 函式連結到 REST API 並使用 GET 請求觸發它。
functions: user_details_api: handler: handler.send_user_details events: - http: path: details/{user_id} method: get integration: lambda-proxy cors: true location_api: handler: handler.send_location events: - http: path: location/{user_id} method: get integration: lambda-proxy cors: true
讓我們逐一分解這些鍵。我們只討論上面列表中的第一個函式 (user_details_api)。下面介紹的概念也適用於其他函式。
path 的值指定呼叫 URL 後面的地址。上面示例中定義的兩個函式將共享相同的終結點,但一個將使用終結點/details/{user_id} 呼叫,而另一個將使用終結點/location/{user_id} 呼叫。花括號內的元素是路徑引數。我可以在 user_id 的位置傳送任何值,並且可以對 Lambda 函式進行程式設計以返回該特定使用者的詳細資訊(請參閱下面的示例函式)。
method 的值指示請求方法。常用的方法是 get 和 post。還有其他幾種方法。深入探討這些方法的細節超出了本章的範圍。在 tutorialspoint 上還有一篇帖子,您可以參考以瞭解詳細資訊。
integration 欄位指定 Lambda 函式如何與 API 閘道器整合。預設值為 lambda-proxy,而其他可能的選項為 lambda、http、http-proxy、mock。這兩個選項中最廣泛使用的是 lambda 和 lambda-proxy。用通俗的話來說,lambda-proxy 將完全控制權交給您的 Lambda 函式,而 lambda 將部分控制權交給 API 閘道器,部分控制權交給 Lambda 函式。
如果您選擇 lambda-proxy 作為整合型別,則整個 HTTP 請求將以原始形式傳遞到您的 Lambda 函式,並且 Lambda 函式傳送的響應將無需更改地傳遞給發出請求的客戶端。因此,您必須在 Lambda 函式的響應中定義 statusCode 和 header。
如果您選擇 lambda 作為整合型別,則您的 API 閘道器可以在將其傳遞到 Lambda 函式之前更改接收到的請求。類似地,它還可以修改 Lambda 函式傳送的響應,然後再將其轉發到客戶端。API 閘道器會將狀態程式碼和標頭新增到響應中,因此 Lambda 函式只需要擔心傳送正文即可。這兩種選項各有優缺點。
如果您喜歡簡單,可以使用 lambda-proxy。如果您不介意一些複雜性(因為您需要擔心 Lambda 函式的程式碼以及 API 閘道器的配置),但需要更多控制權,則可以選擇 lambda。
您可以在 此處閱讀有關這兩種型別之間差異的更多資訊。在其他整合型別中,http 和 http-proxy 用於將 API 閘道器與 HTTP 後端而不是 Lambda 函式整合,因此與我們無關。mock 用於您只想測試 API 而無需呼叫後端時。
cors − true 配置啟用 CORS(跨源資源共享)。用通俗的話來說,這意味著您允許來自另一個域的伺服器的請求。如果沒有 cors − true,則只允許來自同一域的請求。當然,除了允許所有域之外,您還可以只允許某些特定域。要了解如何執行此操作,請參閱 文件。
在無伺服器中,對於 API 閘道器觸發的 Lambda 函式,還可以進行更多配置。強烈建議您閱讀 文件,或者至少將其連結新增為書籤,以便在需要時查詢。
示例 Lambda 函式
此時,您可能想知道您建立了 API 閘道器觸發的函式,但是如何在 Lambda 函式中訪問路徑引數?以下 python 中的示例 Lambda 函式將回答這個問題。當整合型別為 lambda-proxy 時,我們基本上使用 'pathParameters' 屬性。
import json def lambda_handler(event, context): # TODO implement # print(event) #helps you see the entire input request. The printed output can be found in CloudWatch logs user = event['pathParameters']['user_id'] return { 'statusCode': 200, 'body': json.dumps('Hello ' + str(user)) }
訪問終結點
現在,您可能還有另一個問題,即如何訪問終結點。有多種方法可以做到這一點。第一種方法是透過無伺服器部署。每當您部署函式或透過服務部署多個函式時,終結點都會顯示在無伺服器部署的末尾。
第二種方法是透過 Lambda 控制檯。如果您導航到 Lambda 控制檯上的函式,則可以看到附加到它的 API 閘道器。單擊它應該會顯示終結點。

請注意,如上所述,服務中的所有函式共享相同的終結點。path 屬性區分一個函式與另一個函式的實際觸發 URL。