具有 VPC 的私有網路 - AWS Lambda

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

具有 VPC 的私有網路

Amazon Virtual Private Cloud(Amazon VPC)是 AWS 雲中的一個虛擬網絡,專用於您的 AWS 帳戶。您可以使用 Amazon VPC 來為資料庫、快取執行個體或內部服務等資源建立私有網路。如需 Amazon VPC; 的詳細資訊,請參閱《什麼是 Amazon VPC?

Lambda 函數一律會在 Lambda 服務擁有的 VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC,Lambda 即會自動維護和監控 VPC。如果您的 Lambda 函數需要存取帳戶 VPC 中的資源,請設定函數來存取 VPC。Lambda 提供名為 Hyperplane ENI 的受管資源,您的 Lambda 函數可使用此資源來從 Lambda VPC 連接到您帳戶 VPC 中的 ENI (彈性網路介面)。

使用 VPC 或 Hyperplane ENI 均無需負擔額外費用。部分 VPC 元件需付費,例如 NAT 閘道。如需詳細資訊,請參閱 Amazon VPC 定價

VPC 網路元素

Amazon VPC 網路包含以下網路元素:

  • 彈性網路介面 - 彈性網路介面是代表虛擬網路卡之 VPC 中的邏輯網路元件。

  • 子網路 - 您 VPC 中的 IP 地址範圍。您可以將 AWS 資源新增至指定的子網路。針對必須連線至網際網路的資源使用公有子網路,並針對不會連線至網際網路的資源使用私有子網路。

  • 安全群組 — 使用安全群組來控制對每個子網路中 AWS 資源的存取。

  • 存取控制清單 (ACL - 使用網路 ACL 在子網路中提供額外的安全性。預設的子網路 ACL 會允許所有傳出和傳入流量。

  • 路由表 — 包含一組 AWS 用於引導 VPC 網路流量的路由。您可以明確地將子網與特定路由表建立關聯。根據預設,子網路會與主路由表關聯。

  • 路由 - 路由表中每個路由都會指定 IP 地址範圍,以及 Lambda 傳送該範圍之流量的目的地。路由也會指定目標,即傳送流量所經的閘道、網路介面或連線。

  • NAT 閘道 — 一種 AWS 網路位址轉譯 (NAT) 服務,可控制從私有 VPC 私有子網路到網際網路的存取。

  • VPC 端點 — 您可以使用 Amazon VPC 端點建立與託管於其中的服務的私有連線 AWS,而不需要透過網際網路或透過 NAT 裝置、VPN 連線或 AWS Direct Connect 連線存取。如需詳細資訊,請參閱AWS PrivateLink 和 VPC 端點

提示

若要將 Lambda 函數設定為存取 VPC 和子網路,可以使用 Lambda 主控台或 API。

請參閱中的〈〉一VpcConfigCreateFunction以配置您的功能。如需詳細步驟,請參閱 設定 VPC 存取 (主控台)設定 VPC 存取 (API)

如需 Amazon VPC 聯網定義的詳細資訊,請參閱《Amazon VPC 開發人員指南》中的Amazon VPC 運作方式Amazon VPC 常見問答集

將 Lambda 函數連接到您的 VPC

Lambda 函數一律會在 Lambda 服務擁有的 VPC 內執行。根據預設,Lambda 函數不會連接到您帳戶中的 VPC。當您將函數連線至您帳戶的 VPC 時,除非您的 VPC 提供存取權,否則該函數無法存取網際網路。

Lambda 會使用 Hyperplane ENI 存取 VPC 中的資源。Hyperplane ENI 會使用 VPC 對 VPC NAT (V2N) 來提供從 Lambda VPC 到您的帳戶 VPC 之 NAT 功能。V2N 會提供從 Lambda VPC 到您的帳戶 VPC 的連線,但不提供反向連線。

當您建立 Lambda 函數 (或更新其 VPC 設定) 時,Lambda 會為函數 VPC 組態中的每個子網路配置 Hyperplane ENI。如果函數共用相同的子網路和安全群組,則多個 Lambda 函數可以共用網路介面。

若要連線到其他 AWS 服務,您可以使用 VPC 端點在 VPC 和支援 AWS 的服務之間進行私人通訊。另一種方法是使用 NAT 閘道將輸出流量路由到另一個 AWS 服務。

若要讓函數存取網際網路,請將傳出流量路由到公有子網路的 NAT 閘道。NAT 閘道具有公有 IP 地址,可透過 VPC 的網際網路閘道連線至網際網路。

如需有關如何設定 Lambda VPC 網路的資訊,請參閱 將傳出網路連線至 VPC 中的資源連線 Lambda 的傳入介面 VPC 端點

共用子網路

VPC 共用可讓多個 AWS 帳戶在共用、集中管理的虛擬私有雲 (VPC) 中建立其應用程式資源,例如 Amazon EC2 執行個體和 Lambda 函數。在此模型中,擁有 VPC (擁有者) 的帳戶與屬於同一個組織的其他帳戶 (參與者) 共用一或多個子網路。 AWS

若要存取私有資源,請將您的函數連線到 VPC 中的私有共用子網路。子網路擁有者必須與您共用子網路,才能將函數連線到該子網路。子網路擁有者也可以稍後取消共用子網路,從而移除連線。如需有關如何在共用子網路中共用、取消共用和管理 VPC 資源的詳細資訊,請參閱《Amazon VPC 指南》中的如何與其他帳戶共用 VPC

Lambda Hyperplane ENI

Hyperplane ENI 是 Lambda 服務建立和管理的受管網路資源。Lambda VPC 中的多個執行環境可以使用 Hyperplane ENI 安全地存取您帳戶中 VPC 內的資源。Hyperplane ENI 會提供從 Lambda VPC 到您的帳戶 VPC 之 NAT 功能。

對於每個子網路,Lambda 會為每個唯一的安全群組集建立網路介面。帳戶中共用相同子網路和安全群組組合的函數會使用相同的網路介面。即使安全群組組態未以其他方式要求追蹤,也會自動追蹤透過 Hyperplane layer 所建立的連線。來自 VPC 的輸入封包 (與已建立的連線不對應) 會丟棄在 Hyperplane layer。如需詳細資訊,請參閱《適用於Linux 執行個體的 Amazon EC2 使用者指南》中的安全群組連線追蹤

由於帳戶中的函數會共用 ENI 資源,因此 ENI 生命週期比其他 Lambda 資源更複雜。以下部分說明 ENI 生命週期。

建立 ENI

Lambda 可能會為新建立的已啟用 VPC 的函數建立 Hyperplane ENI 資源,或為現有函數的 VPC 組態變更建立 Hyperplane ENI 資源。當 Lambda 建立所需資源時,函數仍處於擱置狀態。當 Hyperplane ENI 準備就緒時,函數會轉換為作用中狀態,且 ENI 會變成可供使用。Lambda 可能需要數分鐘來建立 Hyperplane ENI。

對於新建立的已啟用 VPC 的函數,在函數狀態轉換為作用中之前,在函數上操作的任何調用或其他 API 動作都會失敗。

對於現有函數的 VPC 組態變更,任何函數調用都會繼續使用與舊子網路和安全群組組態關聯的 Hyperplane ENI,直到函數狀態轉換為作用中為止。

如果 Lambda 函數閒置 30 天,Lambda 會回收未使用的超平面 ENI,並將函數狀態設定為閒置。下一次調用會導致 Lambda 重新啟用閒置函數。調用失敗,而且函數會進入擱置狀態,直到 Lambda 完成 Hyperplane ENI 的建立或配置為止。

如需函數狀態的詳細資訊,請參閱Lambda 函數狀態

管理 ENI

Lambda 會使用您函數的執行角色中的許可來建立並管理網路介面。在帳戶中為已啟用 VPC 的函數定義唯一子網路加上安全群組組合時,Lambda 會建立 Hyperplane ENI。Lambda 會為使用相同子網路和安全群組組合的帳戶中其他已啟用 VPC 的函數重複使用 Hyperplane ENI。

目前沒有任何關於可使用相同 Hyperplane ENI 的 Lambda 函數的數量配額。不過,每個 Hyperplane ENI 均支援多達 65,000 個連線/連接埠。如果連線數量超過 65,000,Lambda 會建立新的Hyperplane ENI 來提供額外的連線。

當您更新函數組態以存取不同的 VPC 時,Lambda 會終止與先前 VPC 中 Hyperplane ENI 的連線。更新連至新 VPC 之連線的程序,可能需要幾分鐘的時間。在此期間,函數的調用會繼續使用先前的 VPC。更新完成後,新的調用會開始使用新 VPC 中的 Hyperplane ENI。此時,Lambda 函數不再連接到先前的 VPC。

刪除 ENI

當您更新函數以移除其 VPC 組態時,Lambda 需要長達 20 分鐘才能刪除連接的 Hyperplane ENI。Lambda 只會在沒有其他函數 (或已發佈的函數版本) 使用該 Hyperplane ENI 時刪除 ENI。

Lambda 需要函數執行角色中的許可才能刪除 Hyperplane ENI。如果您在 Lambda 刪除 Hyperplane ENI 之前刪除執行角色,Lambda 將無法刪除 Hyperplane ENI。您可以手動執行刪除作業。

Lambda 不會刪除帳戶中的函數或函數版本正在使用的網路介面。您可以使用 Lambda ENI 搜尋工具來識別正在使用 Hyperplane ENI 的函數或函數版本。對於您不再需要的任何函數或函數版本,您可以移除 VPC 組態來讓 Lambda 刪除 Hyperplane ENI。

連線

Lambda 支援兩種連線類型:TCP (傳輸控制通訊協定) 和 UDP (使用者資料包通訊協定)。

當您建立 VPC 時,Lambda 會自動建立 DHCP 選項集,並將其與 VPC 建立關聯。您可以為 VPC 設定自己的 DHCP 選項。如需更多詳細資訊,請參閱《Amazon VPC DHCP 選項》。

Amazon 為您的 VPC 提供 DNS 伺服器 (Amazon Route 53 Resolver)。如需詳細資訊,請參閱《VPC 的 DNS 支援》。

IPv6 支援

Lambda 支援 Lambda 公有雙堆疊端點的傳入連線,以及透過 IPv6 連至雙堆疊 VPC 子網路的傳出連線。

傳入

若要透過 IPv6 調用您的函數,請使用 Lambda 的公有雙堆疊端點。雙堆疊端點可同時支援 IPv4 和 IPv6。Lambda 雙堆疊端點使用下列語法:

protocol://lambda.us-east-1.api.aws

您也可以使用 Lambda 函數 URL 透過 IPv6 來調用函數。函數 URL 端點的格式如下:

https://url-id.lambda-url.us-east-1.on.aws
傳出

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

注意

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

您可以更新函數程式碼來透過 IPv6 明確連線至子網路資源。下列 Python 範例開啟了通訊端,並連接到 IPv6 伺服器。

範例 — 連線至 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()

安全

AWS 提供安全群組網路 ACL,以提高 VPC 的安全性。安全群組控制資源的傳入與傳出流量,網路 ACL 則是控制子網的傳入與傳出流量。安全群組可為大多數子網路提供足夠的存取控制。如果您想讓 VPC 多一層安全,可以使用網路 ACL。如需詳細資訊,請參閱《Amazon VPC 中的網路間流量隱私權》。每個您建立的子網路都會自動與 VPC 的預設網路 ACL 建立關聯。您可以變更關聯,也可以變更預設網路 ACL 的內容。

如需一般安全性最佳實務,請參閱《VPC 安全最佳實務》。如需如何使用 IAM 來管理 Lambda API 和資源存取的詳細資訊,請參閱 AWS Lambda 許可

您可以針對 VPC 設定使用 Lambda 特定條件金鑰,為您的 Lambda 函數提供額外的許可控制。如需 VPC 條件索引鍵的詳細資訊,請參閱使用 IAM 條件索引鍵進行 VPC 設定

注意

可以從共有網際網路或 AWS PrivateLink 端點調用 Lambda 函數。只能透過公有網際網路存取函數 URL。雖然 Lambda 函數確實支援 AWS PrivateLink,但函式網址則不支援。

可觀測性

您可以使用 VPC 流量日誌來擷取 VPC 中傳入和傳出網路介面之 IP 流量資訊。您可以將流程日誌資料發佈到 Amazon CloudWatch 日誌或 Amazon S3。建立流量日誌之後,您可以在選擇的目的地中擷取及檢視其資料。

附註:將函數附加到 VPC 時, CloudWatch 記錄訊息不會使用 VPC 路由。Lambda 會使用日誌的一般路由來傳送。