本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
拉姆達函數作為目標
您可以將 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:SourceAccount
和aws:SourceArn
用來限制指定目標群組的函數叫用的條件索引鍵。如需詳細資訊,請參閱混淆的副問題在IAM 使用者指南,
aws lambda add-permission \ --function-name
lambda-function-arn-with-alias-name
\ --statement-idelb1
\ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arntarget-group-arn
\ --source-accounttarget-group-account-id
函數版本控制
您可以為每個目標群組註冊一個 Lambda 函數。為了確保您可以變更 Lambda 函數,且負載平衡器一律會呼叫目前版本的 Lambda 函數,請建立一個函數別名,並將該別名包含在向負載平衡器註冊 Lambda 函數時的函數 ARN 中。如需詳細資訊,請參閱AWS Lambda函數版本控制和別名和使用別名流量轉移在AWS Lambda開發者指南。
函數逾時
負載平衡器會等待直到您的 Lambda 函數回應或逾時。建議您根據您預期的執行時間來設定 Lambda 函數逾時。如需有關預設逾時值以及如何變更它的資訊,請參閱基本AWS Lambda功能配置。如需有關可設定的逾時值上限的資訊,請參閱AWS Lambda範圍。
建立 Lambda 函數的目標群組
建立目標群組以用於請求路由。如果請求內容符合某接聽程式規則,內含會將它轉送到此目標群組的動作,則負載平衡器會呼叫註冊的 Lambda 函數。
若要使用建立目標群組並註冊 Lambda 函數AWS CLI
使用create-target-group和寄存器目標命令。
從負載平衡器接收事件
負載平衡器同時支援透過 HTTP 和 HTTPS 的請求進行 Lambda 呼叫。負載平衡器會以 JSON 格式傳送事件。負載平衡器會將以下標頭新增至每個請求:X-Amzn-Trace-Id
、X-Forwarded-For
、X-Forwarded-Port
和 X-Forwarded-Proto
。
如果content-encoding
標頭存在,負載平衡器 Base64 編碼主體並設置isBase64Encoded
至true
。
如果 content-encoding
標頭不存在,則 Base64 編碼取決於內容類型。對於下列類型,負載平衡器會依原樣傳送主體並設定isBase64Encoded
至false
:文本 /*,應用程序/JSON,應用程序/JavaScript 和應用程序/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 標頭,例如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-應用
-
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
的目標群組啟用或停用多值標頭。
使用 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
}
使用 AWS CLI 啟用目標群組的運作狀態檢查
使用 modify-target-group 命令搭配 --health-check-enabled
選項。
取消註冊 Lambda 函數
如果您不再需要將流量傳送到您的 Lambda 函數,則可以將它取消註冊。取消註冊 Lambda 函數之後,傳輸中的請求會失敗,出現 HTTP 5XX 錯誤。
若要取代 Lambda 函數,建議您建立新的目標群組、向新目標群組註冊新函數,並更新接聽程式規則以使用新的目標群組,而非現有的目標群組。
使用 AWS CLI 取消註冊 Lambda 函數
使用 deregister-targets 命令。