讓 Lambda 函數存取 Amazon VPC 中的資源 - AWS Lambda

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

讓 Lambda 函數存取 Amazon VPC 中的資源

使用 Amazon Virtual Private Cloud (Amazon VPC),您可以在自己的中建立私有網路 AWS 帳戶 來託管資源,例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Amazon Relational Database Service 服務 (Amazon RDS) 執行個體和 Amazon ElastiCache 執行個體。您可以透過包含資源的私有子網將函數附加到 VPC,讓 Lambda 函數存取 Amazon VPC 中託管的資源。遵循以下各節中的指示,使用 Lambda 主控台、 AWS Command Line Interface (AWS CLI) 或 AWS SAM將 Lambda 函數附加至 Amazon VPC。

注意

每個 Lambda 函數都在由 Lambda 服務擁有和管理的 VPC 內執行。這些 VPC 由 Lambda 自動維護,客戶看不到。設定您的函數以存取 Amazon VPC 中的其他 AWS 資源並不會影響您函數在其中執行的 Lambda 管理 VPC。

所需的 IAM 許可

若要將 Lambda 函數連接到您的 Amazon VPC AWS 帳戶,Lambda 需要建立和管理網路界面的許可,以便讓您的函數存取 VPC 中的資源。

Lambda 建立的網路介面稱為「超平面彈性網路介面」或「超平面 ENI」。若要進一步瞭解這些網路介面,請參閱瞭解超平面彈性網路介面 (ENI)

您可以通過將 AWS 託管策略附加到函數的執行角色AWSLambdaVPCAccessExecutionRole來為您的函數提供所需的權限。當您在 Lambda 主控台中建立新函數並將其連接至 VPC 時,Lambda 會自動為您新增此許可政策。

如果您想要建立自己的 IAM 許可政策,請確保新增以下所有許可:

  • ec2:CreateNetwork接口

  • ec2:DescribeNetwork接口-此操作僅適用於所有資源("Resource": "*")。

  • ec2:DescribeSubnets

  • ec2:DeleteNetwork接口 — 如果您沒有在執行角色中為DeleteNetwork接口指定資源 ID,則您的函數可能無法訪問 VPC。您可指定不重複的資源 ID,或納入所有資源 ID,例如 "Resource": "arn:aws:ec2:us-west-2:123456789012:*/*"

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

請注意,您函數的角色只需要這些權限即可創建網絡接口,而不是調用您的函數。當函數連接到 Amazon VPC 時,您仍然可以成功叫用函數,即使您從函數的執行角色中移除這些許可也是如此。

若要將您的函數連接到 VPC,Lambda 還需要使用您的 IAM 使用者角色驗證網路資源。確保您的使用者角色具有下列 IAM 許可:

  • ec2:DescribeSecurity群組

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

注意

Lambda 服務會使用您授予函數執行角色的 Amazon EC2 許可,將您的函數連接到 VPC。但是,您也隱式地將這些權限授予函數的代碼。這表示您的函數程式碼能夠進行這些 Amazon EC2 API 呼叫。如需下列安全性最佳做法的建議,請參閱安全最佳實務

將 Lambda 函數連接到您的 Amazon VPC AWS 帳戶

使用 Lambda 主控台 AWS CLI 或 AWS SAM將您 AWS 帳戶 的函數附加到您的中的 Amazon VPC。如果您使用 AWS CLI 或 AWS SAM,或使用 Lambda 主控台將現有函數附加至 VPC,請確定函數的執行角色具有上一節所列的必要權限。

Lambda 函數無法透過專用執行個體租用直接連線到 VPC。若要連線到專用 VPC 中的資源,請透過預設租用將它對等連線到第二個 VPC

Lambda console
在創建 Amazon VPC 時將函數附加到該功能
  1. 開啟 Lambda 主控台的函數頁面,然後選擇 建立函數

  2. Basic information (基本資訊) 下,對於 Function name (函數名稱),為您的函數輸入名稱。

  3. 透過執行下列動作來設定功能的 VPC 設定:

    1. 展開 Advanced settings (進階設定)。

    2. 選取 [啟用 VPC],然後選取要附加功能的 VPC。

    3. (選擇性) 若要允許傳出 IPv6 流量,請選取允許雙堆疊子網路的 IPv6 流量

    4. 選擇要為其建立網路介面的子網路和安全性群組。如果您選取允許雙堆疊子網路的 IPv6 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

      注意

      若要存取私有資源,請將您的函數連線到私有子網路。如果您的功能需要網際網路存取,請參閱為虛擬私人電腦連線的 Lambda 函數啟用網際網路。將函數連接到公有子網路並不會提供網際網路存取或公有 IP 位址給該函數。

  4. 選擇建立函數

將現有功能附加到 Amazon VPC
  1. 開啟 Lambda 主控台的函數頁面,然後選取您的函數。

  2. 選擇置選項卡,然後選擇 VPC

  3. 選擇編輯

  4. VPC 下,選取您要附加功能的 Amazon VPC。

  5. (選擇性) 若要允許傳出 IPv6 流量,請選取允許雙堆疊子網路的 IPv6 流量

  6. 選擇要為其建立網路介面的子網路和安全性群組。如果您選取允許雙堆疊子網路的 IPv6 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

    注意

    若要存取私有資源,請將您的函數連線到私有子網路。如果您的功能需要網際網路存取,請參閱為虛擬私人電腦連線的 Lambda 函數啟用網際網路。將函數連接到公有子網路並不會提供網際網路存取或公有 IP 位址給該函數。

  7. 選擇儲存

AWS CLI
在創建 Amazon VPC 時將函數附加到該功能
  • 若要建立 Lambda 函數並將其附加至 VPC,請執行下列 CLI create-function 命令。

    aws lambda create-function --function-name my-function \ --runtime nodejs20.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config Ipv6AllowedForDualStack=true,SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

    指定您自己的子網路和安全群組,並false根據您的使用案例設Ipv6AllowedForDualStack定為true或。

將現有功能附加到 Amazon VPC
  • 若要將現有函數附加至 VPC,請執行下列 CLI update-function-configuration 命令。

    aws lambda update-function-configuration --function-name my-function \ --vpc-config Ipv6AllowedForDualStack=true, SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb
從 VPC 取消附加功能
  • 若要從 VPC 取消附加功能,請使用 VPC 子網路和安全群組的空白清單執行下列 update-function-configuration CLI 命令。

    aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]
AWS SAM
將您的功能附加到 VPC
  • 若要將 Lambda 函數附加至 Amazon VPC,請將VpcConfig屬性新增至函數定義,如下列範例範本所示。如需有關此屬性的詳細資訊,請參閱AWSAWS CloudFormation 使用指南 VpcConfig中的:: Lambda:: Function ( AWS SAM VpcConfig屬性會直接傳遞至 AWS CloudFormation AWS::Lambda::Function資源的VpcConfig屬性)。

    AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./lambda_function/ Handler: lambda_function.handler Runtime: python3.12 VpcConfig: SecurityGroupIds: - !Ref MySecurityGroup SubnetIds: - !Ref MySubnet1 - !Ref MySubnet2 Policies: - AWSLambdaVPCAccessExecutionRole MySecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for Lambda function VpcId: !Ref MyVPC MySubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC CidrBlock: 10.0.1.0/24 MySubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC CidrBlock: 10.0.2.0/24 MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16

    如需有關在中設定 VPC 的詳細資訊 AWS SAM,請參閱AWS《使用者指南》中的:: EC2:: VPC。AWS CloudFormation

連接至 VPC 時的網際網路存取

根據預設,Lambda 函數可以存取公用網際網路。將函數連接到 VPC 時,它只能存取該 VPC 中可用的資源。若要讓您的功能存取網際網路,您還需要將 VPC 設定為可存取網際網路。如需進一步了解,請參閱為虛擬私人電腦連線的 Lambda 函數啟用網際網路

將 Lambda 與 Amazon VPC 搭配使用的最佳實務

若要確保您的 Lambda VPC 組態符合最佳實務準則,請遵循以下各節中的建議。

安全最佳實務

若要將 Lambda 函數連接到 VPC,您需要為函數的執行角色提供許多 Amazon EC2 許可。需要這些權限才能建立函數用來存取 VPC 中資源的網路介面。但是,這些權限也被隱含授予函數的代碼。這表示您的函數程式碼具有進行這些 Amazon EC2 API 呼叫的權限。

若要遵循最低權限存取的原則,請將拒絕原則 (如下列範例) 新增至函數的執行角色。此政策可防止您的函數呼叫 Lambda 服務用來將函數連接到 VPC 的 Amazon EC2 API。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses", ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" ] } } } ] }

AWS 提供安全群組網路存取控制清單 (ACL),以提高 VPC 的安全性。安全群組控制資源的傳入與傳出流量,網路 ACL 則是控制子網的傳入與傳出流量。安全群組可為大多數子網路提供足夠的存取控制。如果您想讓 VPC 多一層安全,可以使用網路 ACL。如需使用 Amazon VPC 時安全最佳實務的一般指導方針,請參閱 Amazon V irtual Private Cloud 使用者指南中的 VPC 安全最佳實務

效能最佳實務

將函數連接到 VPC 時,Lambda 會檢查是否有可用的網路資源 (超平面 ENI) 可用於連線。超平面 ENI 與安全群組和 VPC 子網路的特定組合相關聯。如果您已經將一個函數附加到 VPC,則在連接另一個函數時指定相同的子網路和安全群組,這表示 Lambda 可以共用網路資源,而不需要建立新的 Hyperplane ENI。如需有關超平面 ENI 及其生命週期的詳細資訊,請參閱。瞭解超平面彈性網路介面 (ENI)

瞭解超平面彈性網路介面 (ENI)

超平面 ENI 是一種受管資源,可作為 Lambda 函數與您希望函數連接的資源之間的網路介面。當您將函數連接到 VPC 時,Lambda 服務會自動建立和管理這些 ENI。

您無法直接看到超平面 ENI,而且您不需要設定或管理它們。但是,了解它們的工作方式可以幫助您在將其附加到 VPC 時了解函數的行為。

當您第一次使用特定子網路和安全群組組合將函數附加至 VPC 時,Lambda 會建立超平面 ENI。您帳戶中使用相同子網路和安全群組組合的其他功能也可以使用此 ENI。Lambda 會盡可能重複使用現有的 ENI 來最佳化資源利用率,並將新 ENI 的建立降到最低。每個超平面 ENI 最多支援 65,000 個連線/連接埠。如果連線數目超過此限制,Lambda 會根據網路流量和並行需求自動調整 ENI 的數量。

對於新函數,當 Lambda 正在建立超平面 ENI 時,您的函數仍處於擱置中狀態,而且您無法呼叫它。只有在超平面 ENI 準備就緒時,您的函數才會轉換到作用中狀態,這可能需要幾分鐘的時間。對於現有函數,您無法執行以該函數為目標的其他操作,例如創建版本或更新函數的代碼,但是您可以繼續調用該函數的先前版本。

注意

如果 Lambda 函數閒置 30 天,Lambda 會回收任何未使用的超平面 ENI,並將函數狀態設定為閒置。下一次叫用嘗試會失敗,且函數會重新進入擱置中狀態,直到 Lambda 完成超平面 ENI 的建立或配置為止。如需 Lambda 函數狀態的詳細資訊,請參閱Lambda 函數狀態

如需超平面 ENI 生命週期的詳細資訊,請參閱。Lambda Hyperplane ENI

使用 IAM 條件金鑰進行 VPC 設定

您可以針對 VPC 設定使用 Lambda 特定條件金鑰,為您的 Lambda 函數提供額外的許可控制。例如,您可以請求組織中的所有功能都連線到 VPC。您也可以指定函數的使用者可以和不可以使用的子網路和安全性群組。

Lambda 支援 IAM 政策中的以下條件金鑰:

  • lambda:VpcIds— 允許或拒絕一個或多個 VPC。

  • lambda: SubnetIds — 允許或拒絕一個或多個子網路。

  • lambda:SecurityGroupID — 允許或拒絕一個或多個安全群組。

Lambda API 作業CreateFunctionUpdateFunction組態支援這些條件金鑰。如需有關在 IAM 政策中使用條件金鑰的詳細資訊,請參閱 IAM 使用者指南中的 IAM JSON 政策元素:條件

提示

如果您的函數已經包含來自先前 API 請求的 VPC 組態,則可以在沒有 VPC 組態的情況下傳送 UpdateFunctionConfiguration 請求。

具有 VPC 設定條件金鑰的範例政策

下列範例示範如何使用條件金鑰進行 VPC 設定。建立具有所需限制的政策陳述式之後,請附加目標 使用者或角色的政策陳述式。

確保使用者僅部署與 VPC 連線的函數

若要確保所有使用者僅部署與 VPC 連線的函數,您可以拒絕不含有效 VPC ID 的函數建立和更新操作。

請注意,VPC ID 不是 CreateFunctionUpdateFunctionConfiguration 請求的輸入參數。Lambda 會根據子網路和安全群組參數擷取 VPC ID 值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }

拒絕使用者存取特定 VPC、子網路或安全群組

若要拒絕使用者存取特定 VPC,請使用 StringEquals 來檢查 lambda:VpcIds 條件的值。下列範例會拒絕使用者存取 vpc-1vpc-2

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

若要拒絕使用者存取特定子網路,請使用 StringEquals 來檢查 lambda:SubnetIds 條件的值。下列範例會拒絕使用者存取 subnet-1subnet-2

{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

若要拒絕使用者存取特定安全性群組,請使用 StringEquals 來檢查 lambda:SecurityGroupIds 條件的值。下列範例會拒絕使用者存取 sg-1sg-2

{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

允許使用者使用特定 VPC 設定建立和更新功能

若要允許使用者存取特定 VPC,請使用 StringEquals 來檢查 lambda:VpcIds 條件的值。下列範例可讓使用者存取 vpc-1vpc-2

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

若要允許使用者存取特定子網路,請使用 StringEquals 來檢查 lambda:SubnetIds 條件的值。下列範例可讓使用者存取 subnet-1subnet-2

{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

若要允許使用者存取特定安全性群組,請使用 StringEquals 來檢查 lambda:SecurityGroupIds 條件的值。下列範例可讓使用者存取 sg-1sg-2

{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

VPC 教學課程

在以下教學中,您會將 Lambda 函數連線至 VPC 中的資源。