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

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

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

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

注意

每個 VPC Lambda 函數都會在由 Lambda 服務擁有和管理的一個函數內執行。這VPCs些資料由 Lambda 自動維護,客戶看不到。配置您的函數以訪問 Amazon 中的其他 AWS 資源對 Lambda 管理VPC的函數在內部運行沒VPC有影響。

必要的IAM權限

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

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

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

如果您想要建立自己的IAM權限原則,請務必新增下列所有權限:

  • ec2:CreateNetworkInterface

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

  • ec2:DescribeSubnets

  • ec2: DeleteNetworkInterface — 如果您未在執行角色DeleteNetworkInterface中指定資源 ID,則您的函數可能無法存取VPC. 您可以指定唯一的資源 ID,或包含所有資源IDs,例如"Resource": "arn:aws:ec2:us-west-2:123456789012:*/*"

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

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

若要將函數附加至VPC,Lambda 還需要使用您的使用IAM者角色驗證網路資源。請確定您的使用者角色具有下列IAM權限:

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

注意

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

將 Lambda 函數附VPC加到 Amazon AWS 帳戶

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

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傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

      注意

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

  4. 選擇建立函數

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

  2. 選擇組索引標籤,然後選擇VPC

  3. 選擇編輯

  4. 在下 VPC,選擇VPC您想要附加功能的 Amazon。

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

  6. 選擇要為其建立網路介面的子網路和安全性群組。如果您選取 [允許雙堆疊子網路IPv6傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

    注意

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

  7. 選擇 Save (儲存)。

AWS CLI
要在創建 Amazon VPC 時將函數附加到亞馬遜
  • 若要建立 Lambda 函數並將其附加至VPC,請執行下列CLIcreate-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
  • 若要將現有函數附加至 aVPC,請執行下列CLIupdate-function-configuration命令。

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

    aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]
AWS SAM
將您的函數附加到 VPC
  • 若要將 Lambda 函數附加至 AmazonVPC,請將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 CloudFormation 使用者指南VPC中的AWS EC2:::

連接到網際網路時存取 VPC

根據預設,Lambda 函數可以存取公用網際網路。當您將函數附加到 a 時VPC,它只能訪問其中可用的資源VPC。若要讓您的功能存取網際網路,您還需要設定VPC以存取網際網路。如需進一步了解,請參閱 為VPC連線的 Lambda 函數啟用網際網路存取

IPv6支持

您的函數可以透過連線至雙堆疊VPC子網路中的資源。IPv6此選項預設為關閉。若要允許輸出IPv6流量,請使用主控台或搭配建立函數或命令的--vpc-config Ipv6AllowedForDualStack=true選項。update-function-configuration

注意

若要允許輸出IPv6流量VPC,連線至函數的所有子網路都必須是雙堆疊子網路。對於未連線到函數的輸出IPv6連線VPC,或使用VPC端點 (AWS PrivateLink) 的輸出IPv6連線VPC,Lambda 不支援IPv6僅限子網路的輸出IPv6連線。

您可以更新函數代碼以明確地連接到子網路資源IPv6。下面的 Python 示例打開一個套接字並連接到IPv6服務器。

範例 — Connect 到IPv6服務器
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()

在 Amazon 上使用 Lambda 的最佳實踐 VPCs

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

安全最佳實務

要將您的 Lambda 函數附加到一個VPC,您需要為函數的執行角色提供許多 Amazon EC2 許可。需要這些權限才能建立函數用來存取中資源的網路介面VPC。但是,這些權限也被隱含授予函數的代碼。這意味著您的函數代碼有權進行這些 Amazon EC2 API 調用。

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

{ "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 提供安全群組網路存取控制清單 (ACLs),以增加VPC. 安全性群組可控制資源的入站和出站流量,並ACLs控制子網路的入站和出站流量的網路。安全群組可為大多數子網路提供足夠的存取控制。您可以使用網絡,ACLs如果你想為您的VPC. 如需使用 Amazon 時安全最佳實務的一般指導方針VPCs,請參閱 Amazon Virtual Private Cloud 使用者指南VPC適用的安全最佳實務。

效能最佳實務

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

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

超平面ENI是一種受管資源,可做為 Lambda 函數與您希望函數連接的資源之間的網路介面。Lambda 服務ENIs會在您將函數附加至VPC.

您無法直接看到超平面ENIs,而且您不需要設定或管理它們。但是,知道它們如何工作可以幫助您了解函數的行為,當您將其附加到VPC.

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

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

注意

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

使用IAM條件鍵進行VPC設定

您可以使用 Lambda 特定的條件索引鍵進行VPC設定,為 Lambda 函數提供額外的權限控制。例如,您可以要求組織中的所有功能都連接到VPC. 您也可以指定函數的使用者可以和不可以使用的子網路和安全性群組。

Lambda 在IAM政策中支援下列條件索引鍵:

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

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

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

Lambda API 作業CreateFunctionUpdateFunctionConfiguration支援這些條件索引鍵。如需有關在IAM策略中使用條件索引鍵的詳細資訊,請參閱《使IAM用指南》中的《IAMJSON策略元素:條件

提示

如果您的函數已包含先前API請求的VPC配置,則可以在沒有VPC配置的情況下發送UpdateFunctionConfiguration請求。

使用條件索引鍵VPC設定的範例原則

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

確保使用者僅部署VPC連線功能

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

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

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

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

若要拒絕使用者存取特定的權限VPCs,請使用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設置創建和更新功能

若要允許使用者存取特定的VPCs,請使用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.