簡體   English   中英

為什么 VPC 中公共 su.net 內的 AWS lambda function 無法連接到 inte.net?

[英]Why can't an AWS lambda function inside a public subnet in a VPC connect to the internet?

我已經按照此處的教程創建了一個具有公共和私有 su.net 的 VPC。

然后我在公共su.net里面設置了一個AWS lambda function來測試它是否可以連接到外部的inte.net。

這是我用python3寫的lambda function

import requests

def lambda_handler(event, context):
    r = requests.get('http://www.google.com')
    print(r)

上面的 function 當我在 VPC 的公共 su.net 中設置它時,無法獲取http://www.google.com的內容。

這是錯誤消息:

"errorMessage": "HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 110] 連接超時',))", "errorType": "ConnectionError",

我不明白為什么。

公共su.net的路由表是這樣的:

在此處輸入圖像描述

http://www.google.comGET請求應該匹配igw-XXXXXXXXX目標。 為什么 inte.net-gateway(igw) 無法將請求發送到http://www.google.com並取回網站內容?

這篇文章說我必須在私有 su.net 中設置 lambda function 才能訪問 inte.net。

如果您的 Lambda function 需要訪問私有 VPC 資源(例如,Amazon RDS 數據庫實例或 Amazon EC2 實例),您必須將 function 與 VPC 關聯。 如果您的 function 還需要 inte.net 訪問(例如,訪問公共 AWS 服務端點),則您的 function 必須使用 NAT 網關或實例。

但它並沒有解釋為什么我不能在公共 su.net 中設置 lambda function。

連接到 VPC 公有子網的 Lambda 函數通常無法訪問 Internet。

要從公共子網訪問 Internet,您需要公共 IP,或者您需要通過本身具有公共 IP 的 NAT 進行路由。 您還需要一個Internet 網關(IGW)。 然而:

  1. Lambda 函數沒有也不能擁有公共 IP 地址,並且
  2. VPC公有子網中的默認路由目標是 IGW,而不是 NAT

因此,因為 Lambda 函數只有一個私有 IP,並且其流量被路由到 IGW 而不是 NAT,所以從 Lambda 函數到互聯網的所有數據包都將在 IGW 被丟棄。

我應該為 VPC 訪問配置我的 Lambda 函數嗎?

如果您的 Lambda 函數不需要訪問 VPC 內的私有資源(例如 RDS 數據庫或 Elasticsearch 集群),則不要將 Lambda 函數配置為連接到 VPC。

如果您的 Lambda 函數確實需要訪問您的 VPC 內的私有資源,則將 Lambda 函數配置為連接到私有子網(並且僅連接到私有子網)。

NAT 與否?

如果 Lambda 函數只需要訪問 VPC 中的資源(例如私有子網中的 RDS 數據庫),那么您不需要通過 NAT 進行路由。

如果 Lambda 函數只需要訪問 VPC 中的資源和訪問所有通過私有VPC Endpoint可用的 AWS 服務,那么您不需要通過 NAT 進行路由。 使用 VPC 終端節點。

如果您的 Lambda 函數需要訪問 Internet 上的終端節點,請確保從 Lambda 函數的私有子網到公有子網中的 NAT 實例或 NAT 網關的默認路由。 如果需要,配置一個 IGW,沒有它就無法訪問互聯網。

請注意, NAT 網關按每小時和每 GB 處理收費,因此有必要了解如何降低 NAT 網關的數據傳輸成本

最佳實踐

在為 VPC 訪問配置 Lambda 函數時,HA 最佳實踐是跨不同可用區 (AZ) 配置多個(私有)子網。

間歇性連接

確保您為 Lambda 函數配置的所有子網都是私有子網。 例如,配置 1 個私有子網和 1 個公共子網是一個常見錯誤。 這將導致您的 Lambda 函數有時可以正常工作,但有時會在沒有任何明顯原因的情況下失敗。

例如,Lambda 函數可能連續成功 5 次,然后超時失敗(無法訪問某些 Internet 資源或 AWS 服務)。 發生這種情況是因為第一次啟動是在私有子網中,啟動 2-5 在同一個私有子網中重用了相同的 Lambda 函數執行環境(所謂的“熱啟動”),然后啟動 6 是“冷啟動”,其中AWS Lambda 服務將 Lambda 函數部署在公有子網中,其中 Lambda 函數沒有通往 Internet 的路由。

您可以在您的 VPC 的公共 su.net 中創建 lambda function 以訪問公共 inte.net。

為此,您需要為鏈接到您的 lambda 的每個 su.net 的網絡接口分配彈性公共 IP。首先讓我們弄清楚哪些su.net安全組鏈接到您的 lambda:

拉姆達屏幕

接下來,go 到 EC2 服務,在Network & Security下找到Public IPs菜單。 為每個su.net分配一個IP(上例中有兩個su.net)。

Go 到網絡接口菜單,找到附加到您的 lambda 的.network 接口(相同的 su.net 和安全組)。

網絡接口

在每個操作菜單中關聯公共 IP:

操作菜單

關聯知識產權

就是這樣,現在您的 Lambda 可以訪問公共 inte.net。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM