為虛擬私人電腦連線的 Lambda 函數啟用網際網路 - AWS Lambda

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

為虛擬私人電腦連線的 Lambda 函數啟用網際網路

根據預設,Lambda 函數會在可存取網際網路的 Lambda 管理 VPC 中執行。若要存取帳戶中 VPC 中的資源,您可以將 VPC 組態新增至函數。這會將功能限制在該 VPC 內的資源,除非 VPC 可以存取網際網路。本頁說明如何提供 VPC 人雲端連線 Lambda 函數的網際網路存取權。

建立 VPC

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

若要建立 VPC
  1. 前往 https://console.aws.amazon.com/vpc/ 開啟 Amazon VPC 主控台。

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

  3. 針對 Resources to create (建立資源),選擇 VPC and more (VPC 等)。

  4. 設定 VPC

    1. 針對自動產生名稱標籤,輸入 VPC 的名稱。

    2. 對於 IPv4 CIDR 區塊,您可以保留預設建議,或者您也可以輸入應用程式或網路所需的 CIDR 區塊。

    3. 如果您的應用程式使用 IPv6 地址進行通訊,請選擇 IPv6 CIDR 區塊 > Amazon 提供的 IPv6 CIDR 區塊

  5. 設定子網路

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

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

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

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

  6. 若為 NAT 閘道,請選擇每個 AZ 1 個以提高彈性。

  7. 如果您選擇包含 IPv6 CIDR 區塊,請針對僅輸出網際網路閘道,選擇

  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 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

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

  9. 選擇建立函數

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

若要為現有函數設定 VPC

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

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

  2. 選擇一個函數。

  3. 選擇配置選項卡,然後選擇 VPC

  4. VPC 下,選擇 Edit (編輯)

  5. 選取 VPC。

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

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

    注意

    如果您選取允許雙堆疊子網路的 IPv6 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

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

  9. 選擇儲存

測試函數

使用下列範例程式碼,確認連接 VPC 的功能可以連線到公用網際網路。如果成功,則代碼返回一個200狀態碼。如果不成功,則函數逾時。

Node.js

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

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

    主 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 檔案中。該函數向公共端點發出 HTTP GET 請求,並返回 HTTP 響應代碼以測試該函數是否可以訪問公共互聯網。

    主 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. 前往 https://console.aws.amazon.com/vpc/ 開啟 Amazon VPC 主控台。

  2. 選擇 VPC 識別碼

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

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

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

      注意

      如果您的子網路沒有 IPv6 CIDR 區塊,您只會看到 IPv4 路由 () 0.0.0.0/0

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

      注意

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

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

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

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

使用 Amazon VPC 主控台建立自訂路由表
  1. https://console.aws.amazon.com/vpc/ 開啟 Amazon 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. https://console.aws.amazon.com/vpc/ 開啟 Amazon VPC 主控台。

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

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

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

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

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

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

    將網際網路閘道連接至 VPC
  8. 選擇 VPC 識別碼

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

    已篩選的 VPC 清單
  10. 向下捲動至 [資源對應] 區段,然後選擇子網路。子網路詳細資訊會顯示在新索引標籤中。

    VPC 主控台具有子網路清單的資源對應。
  11. 選擇路由表下的鏈接。

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

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

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

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

    新增路線的目標
  16. 選擇儲存變更

請依照下列步驟建立 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. 針對目標,選取 NAT 閘道,然後選擇您先前建立的 NAT 閘道。

    新增路線的目標
  8. 選擇儲存變更

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

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

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

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

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

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

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

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

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

    VPC 主控台具有子網路清單的資源對應。
  9. 選擇路由表下的鏈接。

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

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

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

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

    新增路線的目標
  14. 選擇儲存變更

設定 Lambda 函數

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

  2. 選擇 建立函數

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

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

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

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

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

    注意

    如果您選取允許雙堆疊子網路的 IPv6 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

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

  9. 選擇建立函數

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

若要為現有函數設定 VPC

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

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

  2. 選擇一個函數。

  3. 選擇配置選項卡,然後選擇 VPC

  4. VPC 下,選擇 Edit (編輯)

  5. 選取 VPC。

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

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

    注意

    如果您選取允許雙堆疊子網路的 IPv6 流量,則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

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

  9. 選擇儲存

測試函數

使用下列範例程式碼,確認連接 VPC 的功能可以連線到公用網際網路。如果成功,則代碼返回一個200狀態碼。如果不成功,則函數逾時。

Node.js

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

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

    主 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 檔案中。該函數向公共端點發出 HTTP GET 請求,並返回 HTTP 響應代碼以測試該函數是否可以訪問公共互聯網。

    主 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" }