為VPC連線的 Lambda 函數啟用網際網路存取 - AWS Lambda

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

為VPC連線的 Lambda 函數啟用網際網路存取

根據預設,Lambda 函數會在VPC可存取網際網路的 Lambda 管理中執行。若要存取帳戶VPC中的資源,您可以將VPC配置新增至函數。這將函數限制在其中的資源VPC,除非VPC具有 Internet 訪問權限。本頁說明如何提供連VPC線 Lambda 函數的網際網路存取權。

創建 VPC

建立」VPC 工作流程會建立 Lambda 函數從私有子網路存取公用網際網路所需的所有VPC資源,包括子網路、NAT閘道、網際網路閘道和路由表項目。

若要建立 VPC
  1. 在打開 Amazon VPC 控制台https://console.aws.amazon.com/vpc/

  2. 在儀表板上,選擇 [建立] VPC。

  3. 對於資源創建,選擇VPC和更多

  4. 配置 VPC

    1. 在「名稱」標籤自動產生中,輸入的VPC名稱。

    2. 對於IPv4CIDR塊,您可以保留默認建議,或者您可以輸入應用程序或網絡所需的CIDR塊。

    3. 如果您的應用程序使用IPv6地址進行通信,請選擇IPv6CIDR阻止亞馬遜IPv6CIDR提供的塊。

  5. 設定子網路

    1. 針對可用區域數量,選擇 2。我們建議至少兩個以AZs獲得高可用性。

    2. 針對公用子網路數量,選擇 2

    3. Number of private subnet (私有子網路數量) 中,選擇 2

    4. 您可以保留公用子網路的預設區CIDR塊,或者展開 [自訂子網路CIDR區塊] 並輸入區CIDR塊。如需詳細資訊,請參閱子網路CIDR區塊

  6. 針對每個 AZ 選擇 1 個NAT閘道以改善復原能力。

  7. 對於僅限輸出的網際網路閘道,如果您選擇包含封IPv6CIDR鎖,請選擇 [是]

  8. 對於VPC端點,請保留預設值 (S3 閘道)。此選項無需支付任何費用。如需詳細資訊,請參閱 Amazon S3 的VPC端點類型

  9. 對於DNS選項,請保留預設設定。

  10. 選擇 [建立] VPC。

設定 Lambda 函數

若要在建立函數VPC時設定
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇 建立函數

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

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

  5. 選取 [啟用]VPC,然後選擇一個VPC。

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

  7. 對於子網路,選取所有私人子網路。私有子網路可以透過NAT閘道存取網際網路。將函數連接到公共子網不會給它訪問互聯網。

    注意

    如果您選取 [允許雙堆疊子網路IPv6傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

  8. 對於安全性群組,請選取允許輸出流量的安全性群組。

  9. 選擇建立函數

Lambda 會透過AWSLambdaVPCAccessExecutionRole AWS 受管政策自動建立執行角色。只有為VPC配置建立彈性網路介面時,才需要此原則中的權限,而不是呼叫您的函數。若要套用最低權限權限,您可以在建立函數和VPC組態之後從執行角色移除AWSLambdaVPCAccessExecutionRole原則。如需詳細資訊,請參閱必要的IAM權限

VPC為現有函數配置

若要將VPC組態新增至現有函數,函數的執行角色必須具有建立和管理彈性網路介面的權限。受AWSLambdaVPCAccessExecutionRole AWS 管理的策略包括必要的權限。若要套用最低權限權限,您可以在建立組態之後從執行角色移除AWSLambdaVPCAccessExecutionRole原則。VPC

  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 選擇 [組態] 索引標籤,然後選擇VPC

  4. 在下 VPC,選擇「編輯」

  5. 選取VPC。

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

  7. 對於子網路,選取所有私人子網路。私有子網路可以透過NAT閘道存取網際網路。將函數連接到公共子網不會給它訪問互聯網。

    注意

    如果您選取 [允許雙堆疊子網路IPv6傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

  8. 對於安全性群組,請選取允許輸出流量的安全性群組。

  9. 選擇 Save (儲存)。

測試函數

使用以下示例代碼來確認您的 VPC-connected 功能可以連接到公共互聯網。如果成功,則代碼返回一個200狀態碼。如果不成功,則函數逾時。

Node.js

此範例使用fetch,在以後的執行階段中nodejs18.x均可使用。

  1. 在 Lambda 主控台的「程式碼原始碼」窗格中,將下列程式碼貼到 index.m js 檔案中。該函數向公共端點發出HTTPGET請求,並返回HTTP響應代碼以測試該函數是否可以訪問公共 Internet。

    主 Lambda 台程式碼編輯器。
    範例 — HTTP 請求異步/等待
    const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available with Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
  2. 選擇部署

  3. 選擇測試標籤。

    主 Lambda 台測試索引標籤。
  4. 選擇 測試

  5. 該函數返回一個200狀態碼。這意味著該功能具有出站互聯網訪問。

    主 Lambda 台測試索引標籤。

    如果該功能無法訪問公共互聯網,則會收到如下錯誤消息:

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
Python
  1. 在 Lambda 主控台的「程式碼原始程式碼」窗格中,將下列程式碼貼到 lambda_function.py 檔案中。該函數向公共端點發出HTTPGET請求,並返回HTTP響應代碼以測試該函數是否可以訪問公共 Internet。

    主 Lambda 台程式碼編輯器。
    import urllib.request def lambda_handler(event, context): try: response = urllib.request.urlopen('https://aws.amazon.com') status_code = response.getcode() print('Response Code:', status_code) return status_code except Exception as e: print('Error:', e) raise e
  2. 選擇部署

  3. 選擇測試標籤。

    主 Lambda 台測試索引標籤。
  4. 選擇 測試

  5. 該函數返回一個200狀態碼。這意味著該功能具有出站互聯網訪問。

    主 Lambda 台測試索引標籤。

    如果該功能無法訪問公共互聯網,則會收到如下錯誤消息:

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }

如果您已經擁有,VPC但需要為 Lambda 函數設定公用網際網路存取權限,請依照下列步驟執行。此程序假設您至少VPC有兩個子網路。如果您沒有兩個子網路,請參閱 Amazon VPC 使用者指南中的建立子網路

驗證路由表配置

  1. 在打開 Amazon VPC 控制台https://console.aws.amazon.com/vpc/

  2. 選擇VPC識別碼

    VPC的控制台列表VPCs。
  3. 向下捲動至「資源對應」區段。請注意路由表對映。開啟對應至子網路的每個路由表。

    VPC主控台資源對應區段
  4. 向下捲動至「佈線」頁籤。檢閱路由以確定下列其中一項是否成立。這些需求中的每一個都必須由單獨的路由表來滿足。

    • 網際網路繫結流量 (0.0.0.0/0用於IPv4、::/0用於IPv6) 會路由至網際網路閘道 (igw-xxxxxxxxxx)。這表示與路由表關聯的子網路是公用子網路。

      注意

      如果您的子網路沒有IPv6CIDR區塊,您只會看到 IPv4 route (0.0.0.0/0)。

      範例 公共子網路路由表
      具有通往網際網路閘道的路由表
    • IPv4(0.0.0.0/0) 的網際網路繫結流量會路由至與公用子網路相關聯的NAT閘道 (nat-xxxxxxxxxx)。這表示子網路是可以透過NAT閘道存取網際網路的私有子網路。

      注意

      如果您的子網路有IPv6CIDR區塊,路由表也必須將網際網路繫結IPv6流量 (::/0) 路由至僅限輸出的網際網路閘道 ()。eigw-xxxxxxxxxx如果您的子網路沒有IPv6CIDR區塊,您只會看到 IPv4 route (0.0.0.0/0)。

      範例 私有子網路路由表
      具有NAT通往閘道路由的私有子網路路由表
  5. 重複上一個步驟,直到您檢閱了與子網路相關聯的每個路由表,VPC並確認您有一個包含網際網路閘道的路由表,以及具有NAT閘道的路由表。

    如果您沒有兩個路由表,一個是通往網際網路閘道的路由,另一個路由到NAT閘道,請依照下列步驟建立遺失的資源和路由表項目。

請依照下列步驟建立路由表,並將其與子網路產生關聯。

使用 Amazon VPC 主控台建立自訂路由表
  1. 在打開 Amazon VPC 控制台https://console.aws.amazon.com/vpc/

  2. 在導覽窗格中,選擇 Route tables (路由表)。

  3. 選擇 Create route table (建立路由表)。

  4. (選用) 針對 Name (名稱),輸入路由表的名稱。

  5. 對於 VPC,選擇您的VPC.

  6. (選用) 若要新增標籤,請選擇 Add new tag (新增標籤),然後輸入標籤鍵和標籤值。

  7. 選擇 Create route table (建立路由表)。

  8. Subnet associations (子網關聯) 標籤上,選擇 Edit subnet associations (編輯子網關聯)。

    將互聯網閘道連接到 VPC
  9. 選取子網路的核取方塊以和路由表建立關聯。

  10. 選擇 Save associations (儲存關聯)

請依照下列步驟建立網際網路閘道、將其附加至您的網路VPC,並將其新增至公用子網路的路由表。

建立網際網路閘道
  1. 在打開 Amazon VPC 控制台https://console.aws.amazon.com/vpc/

  2. 在導覽窗格中,選擇 Internet gateways (網際網路閘道)。

  3. 選擇建立網際網路閘道

  4. (可選) 輸入網際網路閘道的名稱。

  5. (選用) 若要新增標籤,請選擇 Add new tag (新增標籤),然後輸入標籤金鑰和值。

  6. 選擇建立網際網路閘道

  7. VPC從畫面頂端的橫幅中選擇 [附加至],選取可用的VPC,然後選擇 [連接網際網路閘道]。

    將互聯網閘道連接到 VPC
  8. 選擇VPC識別碼

    網際網路閘道詳情頁
  9. 再次選擇 VPCID 以開啟VPC詳細資訊頁面。

    在 Amazon VPC 控制台過濾VPC列表
  10. 向下捲動至 [資源對應] 區段,然後選擇子網路。子網路詳細資訊會顯示在新索引標籤中。

    VPC控制台具有子網絡列表的資源映射。
  11. 選擇路由表下的鏈接。

    連結至子網路詳細資訊頁面上的路由表
  12. 選擇「路由表格 ID」以開啟路由表格詳細資訊頁面。

    已篩選路由表格清單
  13. 路線下,選擇編輯路線

    路由列表與編輯路線按鈕
  14. 選擇 [新增路線],然後0.0.0.0/0在 [目的地] 方塊中輸入。

    新增路線的目的地
  15. 針對 Target,選取網際網路閘道,然後選擇您先前建立的網際網路閘道。如果您的子網路有IPv6CIDR區塊,您也必須為::/0相同的網際網路閘道新增路由。

    新增路線的目標
  16. 選擇 Save changes (儲存變更)。

請依照下列步驟建立NAT閘道、將其與公用子網路產生關聯,然後將其新增至您的私有子網路的路由表。

建立NAT閘道並將其與公用子網路產生關聯
  1. 在瀏覽窗格中,選擇NAT閘道

  2. 選擇 [建立NAT閘道]。

  3. (選擇性) 輸入NAT閘道的名稱。

  4. 對於子網路,請在您的VPC. (公用子網路是在其路由表中具有網際網路閘道的直接路由路由的子網路。)

    注意

    NAT閘道與公用子網路相關聯,但路由表項目位於私有子網路中。

  5. 對於彈性 IP 配置 ID,請選取彈性 IP 位址或選擇配置彈性 IP

  6. 選擇 [建立NAT閘道]。

在私人子網路的路由表中新增路由至NAT閘道
  1. 在導覽窗格中,選擇 Subnets (子網)。

  2. 在您的VPC. 私有子網路是一個子網路,在其路由表中沒有通往網際網路閘道的路由。)

  3. 選擇路由表下的鏈接。

    連結至子網路詳細資訊頁面上的路由表
  4. 選擇「路由表格 ID」以開啟路由表格詳細資訊頁面。

    已篩選路由表格清單
  5. 向下捲動並選擇「路線」標籤頁,然後選擇「編輯路線

    路由表詳細資訊頁面上的「路由」
  6. 選擇 [新增路線],然後0.0.0.0/0在 [目的地] 方塊中輸入。

    新增路線的目的地
  7. 針對 Target,選取NAT閘道,然後選擇您先前建立的NAT閘道。

    新增路線的目標
  8. 選擇 Save changes (儲存變更)。

請依照下列步驟建立僅限輸出的網際網路閘道,並將其新增至您的私有子網路的路由表。

建立輸出限定網際網路閘道
  1. 在導覽窗格中,選擇輸出限定網際網路閘道

  2. 選擇建立輸出限定網際網路閘道

  3. (選擇性) 輸入名稱。

  4. 選取要VPC在其中建立僅輸出的網際網路閘道。

  5. 選擇建立輸出限定網際網路閘道

  6. 在「附加 VPC ID」下選擇連結。

    僅限輸出網際網路閘道詳細資訊頁
  7. 選擇 [VPCID] 下方的連結以開啟VPC詳細資料頁面。

  8. 向下捲動至 [資源對應] 區段,然後選擇私有子網路。私有子網路是一個子網路,在其路由表中沒有通往網際網路閘道的路由。) 子網路詳細資訊會顯示在新索引標籤中。

    VPC控制台具有子網絡列表的資源映射。
  9. 選擇路由表下的鏈接。

    連結至子網路詳細資訊頁面上的路由表
  10. 選擇「路由表格 ID」以開啟路由表格詳細資訊頁面。

    已篩選路由表格清單
  11. 路線下,選擇編輯路線

    路由列表與編輯路線按鈕
  12. 選擇 [新增路線],然後::/0在 [目的地] 方塊中輸入。

    新增路線的目的地
  13. 針對「目標」,選取「僅出口 Internet Gateway」,然後選擇您先前建立的閘道。

    新增路線的目標
  14. 選擇 Save changes (儲存變更)。

設定 Lambda 函數

若要在建立函數VPC時設定
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇 建立函數

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

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

  5. 選取 [啟用]VPC,然後選擇一個VPC。

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

  7. 對於子網路,選取所有私人子網路。私有子網路可以透過NAT閘道存取網際網路。將函數連接到公共子網不會給它訪問互聯網。

    注意

    如果您選取 [允許雙堆疊子網路IPv6傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

  8. 對於安全性群組,請選取允許輸出流量的安全性群組。

  9. 選擇建立函數

Lambda 會透過AWSLambdaVPCAccessExecutionRole AWS 受管政策自動建立執行角色。只有為VPC配置建立彈性網路介面時,才需要此原則中的權限,而不是呼叫您的函數。若要套用最低權限權限,您可以在建立函數和VPC組態之後從執行角色移除AWSLambdaVPCAccessExecutionRole原則。如需詳細資訊,請參閱必要的IAM權限

VPC為現有函數配置

若要將VPC組態新增至現有函數,函數的執行角色必須具有建立和管理彈性網路介面的權限。受AWSLambdaVPCAccessExecutionRole AWS 管理的策略包括必要的權限。若要套用最低權限權限,您可以在建立組態之後從執行角色移除AWSLambdaVPCAccessExecutionRole原則。VPC

  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 選擇 [組態] 索引標籤,然後選擇VPC

  4. 在下 VPC,選擇「編輯」

  5. 選取VPC。

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

  7. 對於子網路,選取所有私人子網路。私有子網路可以透過NAT閘道存取網際網路。將函數連接到公共子網不會給它訪問互聯網。

    注意

    如果您選取 [允許雙堆疊子網路IPv6傳輸流量],則所有選取的子網路都必須有封IPv4CIDR鎖和區塊。IPv6 CIDR

  8. 對於安全性群組,請選取允許輸出流量的安全性群組。

  9. 選擇 Save (儲存)。

測試函數

使用以下示例代碼來確認您的 VPC-connected 功能可以連接到公共互聯網。如果成功,則代碼返回一個200狀態碼。如果不成功,則函數逾時。

Node.js

此範例使用fetch,在以後的執行階段中nodejs18.x均可使用。

  1. 在 Lambda 主控台的「程式碼原始碼」窗格中,將下列程式碼貼到 index.m js 檔案中。該函數向公共端點發出HTTPGET請求,並返回HTTP響應代碼以測試該函數是否可以訪問公共 Internet。

    主 Lambda 台程式碼編輯器。
    範例 — HTTP 請求異步/等待
    const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { // fetch is available with Node.js 18 and later runtimes const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } };
  2. 選擇部署

  3. 選擇測試標籤。

    主 Lambda 台測試索引標籤。
  4. 選擇 測試

  5. 該函數返回一個200狀態碼。這意味著該功能具有出站互聯網訪問。

    主 Lambda 台測試索引標籤。

    如果該功能無法訪問公共互聯網,則會收到如下錯誤消息:

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
Python
  1. 在 Lambda 主控台的「程式碼原始程式碼」窗格中,將下列程式碼貼到 lambda_function.py 檔案中。該函數向公共端點發出HTTPGET請求,並返回HTTP響應代碼以測試該函數是否可以訪問公共 Internet。

    主 Lambda 台程式碼編輯器。
    import urllib.request def lambda_handler(event, context): try: response = urllib.request.urlopen('https://aws.amazon.com') status_code = response.getcode() print('Response Code:', status_code) return status_code except Exception as e: print('Error:', e) raise e
  2. 選擇部署

  3. 選擇測試標籤。

    主 Lambda 台測試索引標籤。
  4. 選擇 測試

  5. 該函數返回一個200狀態碼。這意味著該功能具有出站互聯網訪問。

    主 Lambda 台測試索引標籤。

    如果該功能無法訪問公共互聯網,則會收到如下錯誤消息:

    { "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }