作為 VPC 晶格中的目標的 Lambda 函數 - Amazon VPC Lattice

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

作為 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-id vpc-lattice \ --principal vpc-lattice.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn
Lambda 函數版本控制

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

為 Lambda 函數建立目標群組

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

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

  2. 在功能窗格的「VPC 格子」下,選擇「目標群組」。

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

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

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

  6. 對於 Lambda 事件結構版本,請選擇一個版本。如需詳細資訊,請參閱 從 VPC 萊迪思服務接收事件

  7. (選擇性) 若要新增標籤,請展開「標」,選擇「新增標籤」,然後輸入標籤關鍵字和標籤值。

  8. 選擇下一步

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

    • 選取現有的 Lambda 函數。

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

    • 稍後註冊 Lambda 函數。

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

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

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

從 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 函數接收的事件結構版本。可能的版本是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 或 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 標頭,例如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 Ladess 支援來自用戶端的請求或來自 Lambda 函數的回應,其中包含具有多個值或多次包含相同標頭的標頭。VPC 萊迪思還支持具有相同密鑰的多個值的查詢參數。

對於請求標頭,如果多個參數共享相同的名稱,VPC Lady 會將這兩個值傳遞給目標。下面是一個例子,其中header 1是兩個單獨的標題的名稱:

header1 = foo header1 = bar

然後 VPC 格子將這兩個值發送到目標:

"header1": ["foo", "bar"]

對於查詢字串,如果多個參數共用相同的名稱,則最後一個值將獲勝。這表示如果參數共用相同的金鑰名稱,就會_not_ coalesced變成單一值。

下面是一個例子,其中foobar是具有相同名稱的參數值QS1

http://www.example.com?&QS1=foo&QS1=bar

然後 VPC 格子將最後一個值發送到目標:

"QS1": "bar"

取消註冊 Lambda 函數

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

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

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

  2. 在功能窗格的「VPC 格子」下,選擇「目標群組」。

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

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

  5. 當系統提示您確認時,請輸入,confirm然後選擇「取消註冊」。

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

使用 deregister-targets 命令。