Lambda 函數作為目標 - Elastic Load Balancing

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

Lambda 函數作為目標

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

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

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

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

  • WebSockets 不受支援。使用 HTTP 400 代碼拒絕升級請求。

  • 不支援 Local Zone。

  • 不支援自動目標加權 (ATW)。

如需示範,請參閱 Lambda Target on Application Load Balancer

準備 Lambda 函數

如果將 Lambda 函數與 Application Load Balancer 搭配使用,請採用下列建議。

調用 Lambda 函數的許可

如果您使用 AWS Management Console來建立目標群組和註冊 Lambda 函數,主控台會代表您將所需許可新增至 Lambda 函數政策。否則,在建立目標群組並使用註冊函數之後 AWS CLI,您必須使用 add 權限命令授與 Elastic Load Balancing 權限來叫用 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 函數,請在向負載平衡器註冊 Lambda 函數ARN時,建立函數別名並在函數中包含別名。如需詳細資訊,請參閱《AWS Lambda 開發人員指南》中的 AWS Lambda 函數版本控制與別名功能使用別名轉移流量

函數逾時

負載平衡器會等待直到您的 Lambda 函數回應或逾時。建議您根據您預期的執行時間來設定 Lambda 函數逾時。如需有關預設逾時值和如何變更它的詳細資訊,請參閱基本 AWS Lambda 函數組態。如需有關可設定之最大逾時值的詳細資訊,請參閱 AWS Lambda 限制

為 Lambda 函數建立目標群組

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

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

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

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

  4. 選取目標類型中,選取 Lambda 函數

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

  6. (選用) 若要啟用運作狀態檢查,請選擇運作狀態檢查區段中的啟用

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

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

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

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

  8. 選擇 Next (下一步)

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

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

使用 AWS CLI建立目標群組和註冊 Lambda 函數

使用create-target-group註冊目標命令

從負載平衡器接收事件

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

如果 content-encoding 標頭存在,負載平衡器 Base64 會對內文使用 Base64 編碼並將 isBase64Encoded 設定為 true

如果 content-encoding 標頭不存在,則 Base64 編碼取決於內容類型。如果是以下類型,負載平衡器會依原樣傳送內文並將 isBase64Encoded 設定為 false:text/*、application/json、application/javascript 和 application/xml。否則,負載平衡器會對內文使用 Base64 編碼,並將 isBase64Encoded 設定為 true

以下為範例 事件。

{ "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 標頭,例如ConnectionTransfer-Encoding。您可以省略 Content-Length 標頭,因為負載平衡器會在將回應傳送至用戶端之前計算。

以下是來自基於 Lambda 函數的 nodejs 的範例回應。

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

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

  • ALB-羔羊目標-S3 UploadFileto

  • ALB-羔羊目標-BinaryResponse

  • ALB-羔羊目標 IP WhatisMy

多值標頭

如果來自用戶端的請求或來自 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 的目標群組啟用或停用多值標頭。

使用主控台啟用多值標頭
  1. 在打開 Amazon EC2 控制台https://console.aws.amazon.com/ec2/

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

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

  4. 群組詳細資訊索引標籤的屬性區段中,選擇編輯

  5. 選取或清除多值標頭

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

若要使用啟用多值標頭 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 }
使用主控台啟用目標群組的健全狀況檢查
  1. 在打開 Amazon EC2 控制台https://console.aws.amazon.com/ec2/

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

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

  4. 群組詳細資料索引標籤的運作狀態檢查設定區段中,選擇編輯

  5. 運作狀態檢查中,選取啟用

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

使用啟用目標群組的健全狀況檢查 AWS CLI

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

取消註冊 Lambda 函數

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

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

若要使用主控台取消註冊 Lambda 函數
  1. 在打開 Amazon EC2 控制台https://console.aws.amazon.com/ec2/

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

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

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

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

若要使用取消註冊 Lambda 函數 AWS CLI

使用 deregister-targets 命令。