拉姆達函數作為目標 - Elastic Load Balancing

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

拉姆達函數作為目標

您可以將 Lambda 函數註冊為目標,並設定接聽程式規則,將請求轉送到 Lambda 函數的目標群組。當負載平衡器將請求轉送到使用 Lambda 函數做為目標的目標群組時,它會呼叫您的 Lambda 函數,並將請求的內容以 JSON 格式傳遞至 Lambda 函數。

限制
  • Lambda 函數和目標群組必須在相同的帳戶中,且在相同的區域內。

  • 您可以傳送到 Lambda 函數之請求內文的大小上限是 1 MB。如需相關大小限制,請參閱標頭限制

  • Lambda 函數可以傳送的回應 JSON 的大小上限是 1 MB。

  • WebSockets 不受支援。升級請求會被拒絕,出現 HTTP 400 代碼。

  • 不支援本機區域。

如需示範,請參閱應用程式負載平衡器上的目標

準備拉姆達函數

如果您將 Lambda 函數與應用程式負載平衡器搭配使用,則適用下列建議。

叫用 Lambda 函數的權限

如果您使用 AWS Management Console 來建立目標群組和註冊 Lambda 函數,主控台會代表您將所需許可新增至 Lambda 函數政策。否則,在您建立目標群組並註冊函數之後,使用AWS CLI,您必須使用添加權限命令授予彈性負載平衡調用 Lambda 函數的權限。我們建議您使用aws:SourceAccountaws:SourceArn用來限制指定目標群組的函數叫用的條件索引鍵。如需詳細資訊,請參閱混淆的副問題IAM 使用者指南,

aws lambda add-permission \ --function-name lambda-function-arn-with-alias-name \ --statement-id elb1 \ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn \ --source-account target-group-account-id
函數版本控制

您可以為每個目標群組註冊一個 Lambda 函數。為了確保您可以變更 Lambda 函數,且負載平衡器一律會呼叫目前版本的 Lambda 函數,請建立一個函數別名,並將該別名包含在向負載平衡器註冊 Lambda 函數時的函數 ARN 中。如需詳細資訊,請參閱AWS Lambda函數版本控制和別名使用別名流量轉移AWS Lambda開發者指南

函數逾時

負載平衡器會等待直到您的 Lambda 函數回應或逾時。建議您根據您預期的執行時間來設定 Lambda 函數逾時。如需有關預設逾時值以及如何變更它的資訊,請參閱基本AWS Lambda功能配置。如需有關可設定的逾時值上限的資訊,請參閱AWS Lambda範圍

建立 Lambda 函數的目標群組

建立目標群組以用於請求路由。如果請求內容符合某接聽程式規則,內含會將它轉送到此目標群組的動作,則負載平衡器會呼叫註冊的 Lambda 函數。

New console
使用新主控台建立目標群組並註冊 Lambda 函數
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選擇 Create target group (建立目標群組)

  4. 對於選擇目標類型中,選取拉姆達函數

  5. 針對 Target group name (目標群組名稱),輸入目標群組的名稱。

  6. (選擇性) 若要啟用健全狀況檢查,請選擇啟用健康檢查部分。

  7. (選用) 新增一個或多個標籤,如下所示:

    1. 展開 Tags (標籤) 區段。

    2. 選擇 Add tag (新增標籤)

    3. 輸入標籤金鑰和標籤值。

  8. 選擇 下一步

  9. 指定單一 Lambda 函數,或省略此步驟,稍後再指定 Lambda 函數。

  10. 選擇 Create target group (建立目標群組)

Old console
使用舊主控台建立目標群組並註冊 Lambda 函數
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選擇 Create target group (建立目標群組)

  4. 針對 Target group name (目標群組名稱),輸入目標群組的名稱。

  5. 針對 Target type (目標類型),選取 Lambda function (Lambda 函數)

  6. 對於 Lambda function (Lambda 函數),請執行以下其中一項:

    • 選擇 Lambda 函數

    • 建立新的 Lambda 函數並選取它

    • 建立目標群組之後註冊 Lambda 函數

  7. (選用) 若要啟用運作狀態檢查,請選擇 Health check (運作狀態檢查)Enable (啟用)

  8. 選擇 建立

若要使用建立目標群組並註冊 Lambda 函數AWS CLI

使用create-target-group寄存器目標命令。

從負載平衡器接收事件

負載平衡器同時支援透過 HTTP 和 HTTPS 的請求進行 Lambda 呼叫。負載平衡器會以 JSON 格式傳送事件。負載平衡器會將以下標頭新增至每個請求:X-Amzn-Trace-IdX-Forwarded-ForX-Forwarded-PortX-Forwarded-Proto

如果content-encoding標頭存在,負載平衡器 Base64 編碼主體並設置isBase64Encodedtrue

如果 content-encoding 標頭不存在,則 Base64 編碼取決於內容類型。對於下列類型,負載平衡器會依原樣傳送主體並設定isBase64Encodedfalse:文本 /*,應用程序/JSON,應用程序/JavaScript 和應用程序/XML。否則,負載平衡器 Base64 會對主體進行編碼並進行設定isBase64Encodedtrue

以下為範例 事件。

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {parameters}, "headers": { "accept": "text/html,application/xhtml+xml", "accept-language": "en-US,en;q=0.8", "content-type": "text/plain", "cookie": "cookies", "host": "lambda-846800462-us-east-2.elb.amazonaws.com", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)", "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520", "x-forwarded-for": "72.21.198.66", "x-forwarded-port": "443", "x-forwarded-proto": "https" }, "isBase64Encoded": false, "body": "request_body" }

回應負載平衡器

來自 Lambda 函數的回應必須包含 Base64 編碼狀態、狀態碼、狀態描述和標頭。您可以省略內文。

若要在回應的內文中包含二進位內容,您必須將內容以 Base64 編碼,並將 isBase64Encoded 設定為 true。負載平衡器會解碼內容,以擷取二進位內容,並將其傳送至 HTTP 回應內文中的用戶端。

負載平衡器不接受 hop-by-hop 標頭,例如Connection或者Transfer-Encoding。您可以省略 Content-Length 標頭,因為負載平衡器會在將回應傳送至用戶端之前計算。

以下是來自 a 的示例響應節點基於拉姆達函數。

{ "isBase64Encoded": False, "statusCode": 200, "statusDescription": "200 OK", "headers": { "Set-cookie": "cookies", "Content-Type": "application/json" }, "body": "Hello from Lambda (optional)" }

如需搭配應用程式負載平衡器使用的 Lambda 函數範本,請參閱application-load-balancer-serverless-應用在 Github 上。或者,打開主控台,選擇應用,建立應用程式,然後從中選取下列其中一項AWS Serverless Application Repository:

  • ALB-蘭姆達靶UploadFiletoS3

  • ALB-蘭姆達靶BinaryResponse

  • ALB-蘭姆達靶WhatisMyIP

多值表頭

如果來自用戶端的請求或來自 Lambda 函數的回應,包含具有多個值的標頭或包含相同標頭多次,或查詢參數具有多個值的相同索引鍵,您可以啟用對多值標頭語法的支援。啟用多值標頭之後,負載平衡器和 Lambda 函數之間交換的標頭和查詢參數會使用陣列而不是字串。如果您未啟用多值標頭語法,且標頭或查詢參數具有多個值,負載平衡器會使用它接收的最後一個值。

具有多值標頭的請求

根據您是否為目標群組啟用多值標頭而定,用於標頭和查詢字串參數的欄位名稱有所不同。

以下範例請求具有使用相同金鑰的兩個查詢參數:

http://www.example.com?&myKey=val1&myKey=val2

採用預設格式時,負載平衡器會使用用戶端傳送的最後一個值,並使用 queryStringParameters 向您傳送包含查詢字串參數的事件。例如:

"queryStringParameters": { "myKey": "val2"},

如果您啟用多值標頭,負載平衡器會使用用戶端傳送的兩個金鑰值,並使用 multiValueQueryStringParameters 向您傳送包含查詢字串參數的事件。例如:

"multiValueQueryStringParameters": { "myKey": ["val1", "val2"] },

同樣地,假設用戶端會傳送的請求標頭中具有兩個 Cookie:

"cookie": "name1=value1", "cookie": "name2=value2",

採用預設格式時,負載平衡器會使用用戶端傳送的最後一個 Cookie,並使用 headers 向您傳送包含標頭的事件。例如:

"headers": { "cookie": "name2=value2", ... },

如果您啟用多值標頭,負載平衡器會使用用戶端傳送的兩個 Cookie,並使用 multiValueHeaders 向您傳送包含標頭的事件。例如:

"multiValueHeaders": { "cookie": ["name1=value1", "name2=value2"], ... },

如果查詢參數是 URL 編碼,負載平衡器不會進行解碼。您必須在 Lambda 函數中解碼。

具有多值標題的回應

根據您是否為目標群組啟用多值標頭而定,用於標頭的欄位名稱有所不同。如果您已啟用多重值標頭和 headers,您必須使用 multiValueHeaders

使用預設格式,您可以指定單一 Cookie:

{ "headers": { "Set-cookie": "cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly", "Content-Type": "application/json" }, }

如果您啟用多值標頭,您必須如下所示指定多個 Cookie:

{ "multiValueHeaders": { "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"], "Content-Type": ["application/json"] }, }

負載平衡器可能會以與 Lambda 回應承載中指定的順序不同的順序將標頭傳送至用戶端。因此,不要指望以特定順序返回的標題。

啟用多值標頭

您可以為具有目標類型 lambda 的目標群組啟用或停用多值標頭。

New console
使用新主控台啟用多值標頭
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選擇目標群組的名稱,以開啟其詳細資訊頁面。

  4. 在「」集團詳細信」頁籤中的屬性區段中,選擇編輯

  5. 選擇或清除多值標頭

  6. 選擇 Save Changes (儲存變更)。

Old console
若要使用舊主控台啟用多值標頭
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選取您的目標群組。

  4. Description (描述) 標籤上,選擇 Edit attributes (編輯屬性)

  5. 對於 Multi value headers (多值標頭),選擇 Enable (啟用)

  6. 選擇 儲存

使用 AWS CLI 啟用多值標頭

使用modify-target-group-attributes使用指令lambda.multi_value_headers.enabled屬性。

啟用健康狀態檢

在預設情況下,會為類型 lambda 的目標群組停用運作狀態檢查。您可以啟用運作狀態檢查,以便透過 Amazon Route 53 實作 DNS 容錯移轉。Lambda 函數可以檢查下游服務的運作狀態,之後再回應運作狀態檢查的請求。如果來自 Lambda 函數的回應指出健康狀態檢查失敗,則健康狀態檢查失敗會傳遞至 Route 53。您可以將 Route 53 設定為容錯移轉至備份應用程式堆疊。

將向您就任何 Lambda 函數呼叫而進行的運作狀態檢查收費。

以下是傳送到 Lambda 函數的運作狀態檢查事件格式。若要檢查事件是否為運作狀態檢查事件,請檢查 user-agent 欄位的值。運作狀態檢查的使用者代理程式為 ELB-HealthChecker/2.0

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {}, "headers": { "user-agent": "ELB-HealthChecker/2.0" }, "body": "", "isBase64Encoded": false }
New console
使用新主控台啟用目標群組的健全狀況檢查
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選擇目標群組的名稱,以開啟其詳細資訊頁面。

  4. 在「」集團詳細信」頁籤中的健康檢查設定區段中,選擇編輯

  5. 對於健康檢查中,選取啟用

  6. 選擇 Save Changes (儲存變更)。

Old console
使用舊主控台啟用目標群組的健全狀況檢查
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選取您的目標群組。

  4. Health checks (運作狀態檢查) 索引標籤上,選擇 Edit health check (編輯運作狀態檢查)

  5. 對於 Health check (運作狀態檢查) 選取 Enable (啟用)

  6. 選擇 儲存

使用 AWS CLI 啟用目標群組的運作狀態檢查

使用 modify-target-group 命令搭配 --health-check-enabled 選項。

取消註冊 Lambda 函數

如果您不再需要將流量傳送到您的 Lambda 函數,則可以將它取消註冊。取消註冊 Lambda 函數之後,傳輸中的請求會失敗,出現 HTTP 5XX 錯誤。

若要取代 Lambda 函數,建議您建立新的目標群組、向新目標群組註冊新函數,並更新接聽程式規則以使用新的目標群組,而非現有的目標群組。

New console
若要使用新主控台取消註冊 Lambda 函數
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選擇目標群組的名稱,以開啟其詳細資訊頁面。

  4. Targets (目標) 索引標籤上,選擇 Deregister (取消註冊)

  5. 出現確認的提示時,請選擇 Deregister (取消註冊)

Old console
若要使用舊主控台取消註冊 Lambda 函數
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格的 LOAD BALANCING (負載平衡) 中,選擇 Target Groups (目標群組)

  3. 選取您的目標群組。

  4. Targets (目標) 索引標籤上,選擇 Deregister (取消註冊)

  5. 出現確認的提示時,請選擇 Deregister (取消註冊)

使用 AWS CLI 取消註冊 Lambda 函數

使用 deregister-targets 命令。