本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
作為 VPC 晶格中的目標的 Lambda 函數
您可以將 Lambda 函數註冊為 VPC Ladess 目標群組的目標,並設定接聽程式規則,將要求轉送至 Lambda 函數的目標群組。當服務將請求轉送至以 Lambda 函數作為目標的目標群組時,它會叫用您的 Lambda 函數,並以 JSON 格式將請求的內容傳遞至 Lambda 函數。如需詳細資訊,請參閱AWS Lambda 開發人員指南中的 AWS Lambda 與 Amazon VPC 萊迪思搭配使用。
限制
-
Lambda 函數和目標群組必須在相同的帳戶中,且在相同的區域內。
-
您可以傳送至 Lambda 函數的要求主體大小上限為 6 MB。
-
Lambda 函數可以傳送的回應 JSON 大小上限為 6 MB。
-
通訊協定必須是 HTTP 或 HTTPS。
準備 Lambda 函數
如果您將 Lambda 函數與 VPC 萊迪斯服務搭配使用,則適用下列建議。
調用 Lambda 函數的許可
當您使用 AWS Management Console 或建立目標群組並註冊 Lambda 函數時 AWS CLI,VPC Ladess 會代表您將必要的權限新增至您的 Lambda 函數政策。
您也可以使用下列 API 呼叫自行新增權限:
aws lambda add-permission \ --function-name
lambda-function-arn-with-alias-name
\ --statement-idvpc-lattice
\ --principal vpc-lattice.amazonaws.com \ --action lambda:InvokeFunction \ --source-arntarget-group-arn
Lambda 函數版本控制
您可以為每個目標群組註冊一個 Lambda 函數。若要確保您可以變更 Lambda 函數,並且 VPC 萊迪思服務一律叫用目前版本的 Lambda 函數,請在向 VPC 萊迪斯服務註冊 Lambda 函數時,建立函數別名並在函數 ARN 中包含別名。如需詳細資訊,請參閱AWS Lambda 開發人員指南中的 L ambda 函數版本和為 Lambda 函數建立別名。
為 Lambda 函數建立目標群組
建立目標群組以用於請求路由。如果請求內容符合接聽程式規則與將其轉寄至此目標群組的動作,則 VPC Ladess 服務會叫用已註冊的 Lambda 函數。
使用主控台建立目標群組並註冊 Lambda 函數
前往 https://console.aws.amazon.com/vpc/
開啟 Amazon VPC 主控台。 -
在功能窗格的「VPC 格子」下,選擇「目標群組」。
-
選擇 Create target group (建立目標群組)。
-
在選取目標類型中,選取 Lambda 函數。
-
針對 Target group name (目標群組名稱),輸入目標群組的名稱。
-
對於 Lambda 事件結構版本,請選擇一個版本。如需詳細資訊,請參閱 從 VPC 萊迪思服務接收事件。
-
(選擇性) 若要新增標籤,請展開「標籤」,選擇「新增標籤」,然後輸入標籤關鍵字和標籤值。
-
選擇下一步。
-
對於 Lambda function (Lambda 函數),請執行以下其中一項:
-
選取現有的 Lambda 函數。
-
建立新的 Lambda 函數並加以選取。
-
稍後註冊 Lambda 函數。
-
-
選擇 Create target group (建立目標群組)。
使用 AWS CLI建立目標群組和註冊 Lambda 函數
從 VPC 萊迪思服務接收事件
VPC 格服務支援透過 HTTP 和 HTTPS 進行請求的 Lambda 叫用。服務會以 JSON 格式傳送事件,並將X-Forwarded-For
標頭新增至每個要求。
Base64 編碼
如果content-encoding
標頭存在且內容類型不是下列其中一項,則服務 Base64 會編碼主體:
-
text/*
-
application/json
-
application/xml
-
application/javascript
如果 content-encoding
標頭不存在,則 Base64 編碼取決於內容類型。對於上述內容類型,服務會依原樣傳送主體,而不使用 Base64 編碼。
事件結構格式
建立或更新類型的目標群組時LAMBDA
,您可以指定 Lambda 函數接收的事件結構版本。可能的版本是V1
和V2
。
範例事件:V2
{
"version": "2.0",
"path": "/",
"method": "GET|POST|HEAD|...",
"headers": {
"header-key
": ["header-value
", ...],
...
},
"queryStringParameters": {
"key
": ["value
", ...]
},
"body": "request-body
",
"isBase64Encoded": true|false,
"requestContext": {
"serviceNetworkArn": "arn:aws:vpc-lattice:region
:123456789012
:servicenetwork/sn-0bf3f2882e9cc805a
",
"serviceArn": "arn:aws:vpc-lattice:region
:123456789012
:service/svc-0a40eebed65f8d69c
",
"targetGroupArn": "arn:aws:vpc-lattice:region
:123456789012
:targetgroup/tg-6d0ecf831eec9f09
",
"identity": {
"sourceVpcArn": "arn:aws:ec2:region
:123456789012
:vpc/vpc-0b8276c84697e7339
",
"type": "AWS_IAM",
"principal": "arn:aws:iam::123456789012
:assumed-role/my-role
/my-session
",
"principalOrgID": "o-50dc6c495c0c9188
",
"sessionName": "i-0c7de02a688bde9f7
",
"x509IssuerOu": "string
",
"x509SanDns": "string
",
"x509SanNameCn": "string
",
"x509SanUri": "string
",
"x509SubjectCn": "string
"
},
"region": "region
",
"timeEpoch": "1690497599177430
"
}
}
body
請求的本文。僅當通訊協定為 HTTP、HTTPS 或 gRPC 時才會顯示。
headers
要求的 HTTP 標頭。僅當通訊協定為 HTTP、HTTPS 或 gRPC 時才會顯示。
identity
-
身份信息。以下是可能的欄位。
principal
— 已驗證的主體。只有在 AWS 驗證成功時才會出現。principalOrgID
— 已驗證主參與者的組織 ID。只有在 AWS 驗證成功時才會出現。sessionName
— 已驗證工作階段的名稱。只有在 AWS 驗證成功時才會出現。sourceVpcArn
— 產生請求所在的 VPC 的 ARN。只有在可識別來源 VPC 時才會出現。type
-該值是AWS_IAM
如果使用了身份驗證策略並且 AWS 身份驗證成功。
如果使用「任何角色」認證且驗證成功,則下列為可能的欄位。
x509IssuerOu
— 發行者 (OU)。x509SanDns
— 主旨替代名稱 (DNS)。x509SanNameCn
— 發行人替代名稱 (名稱 /CN)。x509SanUri
— 主旨替代名稱 (URI)。x509SubjectCn
— 主旨名稱 (CN)。
isBase64Encoded
指出主體是否為 base64 編碼。只有在通訊協定為 HTTP、HTTPS 或 gRPC,且要求主體還不是字串時,才會顯示此選項。
method
請求的 HTTP 方法。僅當通訊協定為 HTTP、HTTPS 或 gRPC 時才會顯示。
path
請求的路徑。僅當通訊協定為 HTTP、HTTPS 或 gRPC 時才會顯示。
queryStringParameters
HTTP 查詢字串參數。僅當通訊協定為 HTTP、HTTPS 或 gRPC 時才會顯示。
serviceArn
接收要求之服務的 ARN。
serviceNetworkArn
傳遞要求的服務網路的 ARN。
targetGroupArn
接收要求之目標群組的 ARN。
timeEpoch
時間,以微秒為單位。
範例 事件範例:V1
{
"raw_path": "/path/to/resource
",
"method": "GET|POST|HEAD|...",
"headers": {"header-key
": "header-value
", ... },
"query_string_parameters": {"key
": "value
", ...},
"body": "request-body
",
"is_base64_encoded": true|false
}
回應 VPC 格子服務
來自 Lambda 函數的回應必須包含 Base64 編碼狀態、狀態碼、狀態描述和標頭。您可以省略內文。
若要在回應的內文中包含二進位內容,您必須將內容以 Base64 編碼,並將 isBase64Encoded
設定為 true
。該服務解碼內容以檢索二進制內容,並將其發送到 HTTP 響應主體中的客戶端。
VPC 格子服務不接受 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)" }
多值標頭
根據預設,VPC Ladess 支援來自用戶端的請求或來自 Lambda 函數的回應,其中包含具有多個值或多次包含相同標頭的標頭。VPC 萊迪思還支持具有相同密鑰的多個值的查詢參數。
對於請求標頭,如果多個參數共享相同的名稱,VPC Lady 會將這兩個值傳遞給目標。下面是一個例子,其中header
1
是兩個單獨的標題的名稱:
header1 = foo header1 = bar
然後 VPC 格子將這兩個值發送到目標:
"header1": ["foo", "bar"]
對於查詢字串,如果多個參數共用相同的名稱,則最後一個值將獲勝。這表示如果參數共用相同的金鑰名稱,就會_not_ coalesced
變成單一值。
下面是一個例子,其中foo
和bar
是具有相同名稱的參數值QS1
:
http://www.example.com?&QS1=foo&QS1=bar
然後 VPC 格子將最後一個值發送到目標:
"QS1": "bar"
取消註冊 Lambda 函數
如果您不再需要將流量傳送到您的 Lambda 函數,則可以將它取消註冊。取消註冊 Lambda 函數之後,傳輸中的請求會失敗,出現 HTTP 5XX 錯誤。
若要取代 Lambda 函數,建議您建立新的目標群組、向新目標群組註冊新函數,並更新接聽程式規則以使用新的目標群組,而非現有的目標群組。
若要使用主控台取消註冊 Lambda 函數
前往 https://console.aws.amazon.com/vpc/
開啟 Amazon VPC 主控台。 -
在功能窗格的「VPC 格子」下,選擇「目標群組」。
-
選擇目標群組的名稱,以開啟其詳細資訊頁面。
-
在 Targets (目標) 索引標籤上,選擇 Deregister (取消註冊)。
-
當系統提示您確認時,請輸入,
confirm
然後選擇「取消註冊」。
若要使用取消註冊 Lambda 函數 AWS CLI
使用 deregister-targets 命令。