Lambda 作為 VPC Lattice 中的目標 - Amazon VPC Lattice

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

Lambda 作為 VPC Lattice 中的目標

您可以使用 VPC Lattice 目標群組將 Lambda 函數註冊為目標,並設定接聽程式規則,將請求轉送至 Lambda 函數的目標群組。當服務將請求轉送至具有 Lambda 函數作為目標的目標群組時,它會調用您的 Lambda 函數,並以 JSON 格式將請求的內容傳遞給 Lambda 函數。如需詳細資訊,請參閱 AWS Lambda 開發人員指南 中的AWS Lambda 搭配使用 Amazon VPC Lattice

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

  • 您可以傳送至 Lambda 函數的請求內文大小上限為 6 MB。

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

  • 通訊協定必須為 HTTP或 HTTPS。

準備 Lambda 函數

如果您將 Lambda 函數與 VPC Lattice 服務搭配使用,則適用下列建議。

調用 Lambda 函數的許可

當您使用 AWS Management Console 或 建立目標群組並註冊 Lambda 函數時 AWS CLI,VPCLattice 會代表您將所需的許可新增至 Lambda 函數政策。

您也可以使用下列API呼叫自行新增許可:

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

您可以為每個目標群組註冊一個 Lambda 函數。為確保您可以變更 Lambda 函數,且 VPC Lattice 服務一律叫用 Lambda 函數的目前版本,請在向 VPC Lattice 服務註冊 Lambda 函數ARN時,建立函數別名,並將別名包含在函數中。如需詳細資訊,請參閱 AWS Lambda 開發人員指南 中的 Lambda 函數版本為 Lambda 函數建立別名

為 Lambda 函數建立目標群組

建立目標群組以用於請求路由。如果請求內容符合接聽程式規則和將規則轉送到此目標群組的動作,VPCLattice 服務會叫用已註冊的 Lambda 函數。

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

  2. 在導覽窗格的 VPC Lattice 下,選擇目標群組

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

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

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

  6. 針對 Lambda 事件結構版本 ,選擇版本。如需詳細資訊,請參閱從 VPC Lattice 服務接收事件

  7. (選用) 若要新增標籤,請展開標籤 ,選擇新增標籤 ,然後輸入標籤索引鍵和標籤值。

  8. 選擇 Next (下一步)

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

    • 選取現有的 Lambda 函數。

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

    • 稍後註冊 Lambda 函數。

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

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

使用 create-target-groupregister-targets 命令。

從 VPC Lattice 服務接收事件

VPC Lattice 服務支援 Lambda 調用 HTTP和 的請求HTTPS。服務會以 JSON 格式傳送事件,並將 X-Forwarded-For 標頭新增至每個請求。

Base64 編碼

如果content-encoding標頭存在且內容類型不是下列其中一項,則服務 Base64 會編碼內文:

  • text/*

  • application/json

  • application/xml

  • application/javascript

如果 content-encoding 標頭不存在,則 Base64 編碼取決於內容類型。對於上述內容類型,服務會像原樣傳送內文,而不使用 Base64 編碼。

事件結構格式

當您建立或更新類型 的目標群組時LAMBDA,您可以指定 Lambda 函數接收的事件結構版本。可能的版本為 V1V2

範例事件: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或 g 時出現RPC。

headers

請求的HTTP標頭。僅當通訊協定為 HTTP、 HTTPS或 g 時出現RPC。

identity

身分資訊。以下是可能的欄位。

  • principal – 已驗證的主體。只有在 AWS 身分驗證成功時才會顯示。

  • principalOrgID – 已驗證主體的組織 ID。只有在 AWS 身分驗證成功時才會顯示。

  • sessionName – 已驗證工作階段的名稱。只有在 AWS 身分驗證成功時才會顯示。

  • sourceVpcArn – 請求發起VPC的 ARN的 。只有在VPC可以識別來源時才會顯示。

  • type – 值是AWS_IAM如果使用身分驗證政策且 AWS 身分驗證成功。

如果使用 Roles Anywhere 憑證且身分驗證成功,則下列是可能的欄位。

  • x509IssuerOu – 發行者 (OU)。

  • x509SanDns – 主體替代名稱 (DNS)。

  • x509SanNameCn – 發行者別名 (名稱/CN)。

  • x509SanUri – 主體替代名稱 (URI)。

  • x509SubjectCn – 主題名稱 (CN)。

isBase64Encoded

指示內文是否已編碼 base64。只有在通訊協定為 HTTP、 HTTPS或 gRPC 且請求內文尚未是字串時,才會顯示。

method

請求HTTP的方法。僅當通訊協定為 HTTP、 HTTPS或 g 時出現RPC。

path

請求的路徑。僅當通訊協定為 HTTP、 HTTPS或 g 時出現RPC。

queryStringParameters

HTTP 查詢字串參數。僅當通訊協定為 HTTP、 HTTPS或 g 時出現RPC。

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 Lattice 服務

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

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

VPC Lattice 服務不會承兌 hop-by-hop標頭,例如 ConnectionTransfer-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 Lattice 支援來自用戶端的請求或來自 Lambda 函數的回應,其中包含具有多個值的標頭,或多次包含相同的標頭。VPC Lattice 會將所有值傳遞給目標。

在下列範例中,有兩個標題命名為 header1 具有不同的值。

header1 = value1 header1 = value2

使用 V2 事件結構,VPCLattice 會傳送清單中的值。例如:

"header1": ["value1", "value2"]

使用 V1 事件結構時,VPCLattice 會將值合併為單一字串。例如:

"header1": "value1, value2"

多值查詢字串參數

VPC Lattice 支援具有相同金鑰多個值的查詢參數。

在下列範例中,有兩個名為 的參數 QS1 具有不同的值。

http://www.example.com?&QS1=value1&QS1=value2

使用 V2 事件結構,VPCLattice 會傳送清單中的值。例如:

"QS1": ["value1", "value2"]

對於 V1 事件結構,VPCLattice 會使用傳遞的最後一個值。例如:

"QS1": "value2"

取消註冊 Lambda 函數

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

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

使用主控台取消註冊 Lambda 函數
  1. 在 開啟 Amazon VPC主控台https://console.aws.amazon.com/vpc/

  2. 在導覽窗格的 VPC Lattice 下,選擇目標群組

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

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

  5. 出現確認提示時,輸入 confirm,然後選擇取消註冊

使用 取消註冊 Lambda 函數 AWS CLI

使用 deregister-targets 命令。