本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda 函數作為目標
您可以將 Lambda 函數註冊為目標,並設定接聽程式規則,將請求轉送到 Lambda 函數的目標群組。當負載平衡器將請求轉送到使用 Lambda 函數做為目標的目標群組時,它會呼叫您的 Lambda 函數,並將請求的內容以 JSON 格式傳遞至 Lambda 函數。
限制
-
Lambda 函數和目標群組必須在相同的帳戶中,且在相同的區域內。
-
您可以傳送到 Lambda 函數之請求內文的大小上限是 1 MB。如需相關大小限制,請參閱 HTTP 標頭限制。
-
Lambda 函數可以傳送的回應 JSON 的大小上限是 1 MB。
-
WebSockets 不支援。升級請求會被拒絕,出現 HTTP 400 代碼。
-
不支援 Local Zones。
如需示範,請參閱 Ap plication Load Balancer 上的 Lambda 目標
準備 Lambda 函數
如果您將 Lambda 函數與應用 Application Load Balancer 搭配使用,則適用下列建議。
叫用 Lambda 函數的權限
如果您使用 AWS Management Console 來建立目標群組和註冊 Lambda 函數,主控台會代表您將所需許可新增至 Lambda 函數政策。否則,在建立目標群組並使用註冊函數之後AWS CLI,您必須使用 add 權限命令授與 Elastic Load Balancing 權限,以呼叫 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 函數,請建立一個函數別名,並將該別名包含在向負載平衡器註冊 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
:text/*、應用程式 /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
標頭,因為負載平衡器會在將回應傳送至用戶端之前計算。
以下是來自 Lambda 函數的回應範例。
{ "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
-
ALB-蘭姆達靶HelloWorld
-
ALB-蘭姆達靶-UploadFileto S3
-
ALB-蘭姆達靶BinaryResponse
-
ALB-蘭姆達目標WhatisMy IP
多值標頭
如果來自用戶端的請求或來自 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
的目標群組啟用或停用多值標頭。
使用 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 命令。