为连接到 VPC 的 Lambda 函数启用互联网访问权限 - AWS Lambda

为连接到 VPC 的 Lambda 函数启用互联网访问权限

默认情况下,Lambda 函数在可访问互联网的 Lambda 托管 VPC 中运行。要访问账户中 VPC 内的资源,可以向函数添加 VPC 配置。此举会将该函数限制为仅针对该 VPC 内的资源,除非该 VPC 可以访问互联网。本页内容会介绍如何为连接到 VPC 的 Lambda 函数提供互联网访问权限。

创建 VPC

创建 VPC 工作流程可创建 Lambda 函数从私有子网访问公有互联网所需的所有 VPC 资源,包括子网、NAT 网关、互联网网关和路由表条目。

创建 VPC
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在控制面板上,选择创建 VPC

  3. 对于要创建的资源,选择 VPC 等

  4. 配置 VPC

    1. 对于 Name tag auto-generation(名称标签自动生成),为 VPC 输入名称。

    2. 对于 IPv4 CIDR 块,您可以保留默认建议,也可以输入应用程序或网络所需的 CIDR 块。

    3. 如果应用程序使用 IPv6 地址进行通信,则选择 IPv6 CIDR 块Amazon 提供的 IPv6 CIDR 块

  5. 配置子网

    1. 对于可用区数量,选择 2。为了获得高可用性,建议至少选择两个 AZ。

    2. 对于Number of public subnets(公有子网数量),选择 2

    3. 对于 Number of private subnets(私有子网数量),选择 2

    4. 您可以保留公有子网的默认 CIDR 块,也可以展开自定义子网 CIDR 块并输入 CIDR 块。有关更多信息,请参阅子网 CIDR 块

  6. 对于 NAT 网关,选择每个可用区 1 个以提高故障恢复能力。

  7. 对于仅限出口的互联网网关,如果选择了包含 IPv6 CIDR 块,则选择

  8. 对于 VPC 端点,请保留默认值(S3 网关)。选择此项不会产生任何费用。有关更多信息,请参阅适用于 Amazon S3 的 VPC 端点类型

  9. 对于 DNS 选项,保留默认设置。

  10. 选择创建 VPC

配置 Lambda 函数

在创建函数时配置 VPC
  1. 打开 Lamba 控制台的 Functions page(函数页面)。

  2. 选择 Create function(创建函数)。

  3. 基本信息下的函数名称中输入函数的名称。

  4. 展开 Advanced settings(高级设置)。

  5. 选择启用 VPC,再选择一个 VPC。

  6. (可选)要允许出站 IPv6 流量,请选择允许双堆栈子网的 IPv6 流量

  7. 对于子网,选择全部私有子网。私有子网可以通过 NAT 网关访问互联网。将函数连接到公有子网并不会授予其互联网访问权限。

    注意

    如果您已选择允许双堆栈子网的 IPv6 流量,则所有选定的子网都必须具有 IPv4 CIDR 块和 IPv6 CIDR 块。

  8. 对于安全组,选择一个允许出站流量的安全组。

  9. 选择 Create function (创建函数)

Lambda 使用 AWSLambdaVPCAccessExecutionRole AWS 托管策略自动创建执行角色。只有在为 VPC 配置创建弹性网络接口时需要此策略中的权限,调用函数时并不需要。要应用最低权限,可以在创建函数和 VPC 配置之后,从执行角色中删除 AWSLambdaVPCAccessExecutionRole 策略。有关更多信息,请参阅 所需的 IAM 权限

为现有函数配置 VPC

要将 VPC 配置添加到现有函数,该函数的执行角色必须具有创建和管理弹性网络接口的权限AWSLambdaVPCAccessExecutionRole AWS 托管策略包含这些必要权限。要应用最低权限,可以在创建 VPC 配置之后,从执行角色中删除 AWSLambdaVPCAccessExecutionRole 策略。

  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择配置选项卡,然后选择 VPC

  4. VPC 下,选择 Edit(编辑)。

  5. 选择 VPC。

  6. (可选)要允许出站 IPv6 流量,请选择允许双堆栈子网的 IPv6 流量

  7. 对于子网,选择全部私有子网。私有子网可以通过 NAT 网关访问互联网。将函数连接到公有子网并不会授予其互联网访问权限。

    注意

    如果您已选择允许双堆栈子网的 IPv6 流量,则所有选定的子网都必须具有 IPv4 CIDR 块和 IPv6 CIDR 块。

  8. 对于安全组,选择一个允许出站流量的安全组。

  9. 选择保存

测试此函数

使用以下示例代码,确认连接到 VPC 的函数是否可以访问公有互联网。如果成功,代码将返回 200 状态代码。如果失败,函数将超时。

Node.js
  1. 在 Lambda 控制台的代码源窗格中,将以下代码粘贴到 index.mjs 文件中。该函数向公有端点发出 HTTP GET 请求,再返回 HTTP 响应代码来测试该函数是否可以访问公有互联网。

    Lambda 控制台代码编辑器。
    例 示例:包含 async/await 的 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. 部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
  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 控制台的代码源窗格中,将以下代码粘贴到 ambda_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. 部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
  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 ID

    VPC 控制台中的 VPC 列表。
  3. 向下滚动到资源映射部分。请注意路由表映射。打开映射到子网的每个路由表。

    VPC 控制台中的“资源映射”部分
  4. 向下滚动到路由选项卡。查看路由,判断是否满足以下情况之一。这些要求中的每一项都必须由单独的路由表来满足。

    • 将面向互联网的流量(IPv4 的路由为 0.0.0.0/0,IPv6 的路由为 ::/0)路由到互联网网关 (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. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 Route tables(路由表)。

  3. 选择创建路由表

  4. (可选)对于 Name(名称),为您的路由表输入名称。

  5. 对于 VPC,选择您的 VPC。

  6. (可选)若要添加标签,请选择 Add new tag(添加新标签),然后输入标签键和标签值。

  7. 选择创建路由表

  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 ID

    “互联网网关”的详细信息页面
  9. 再次选择 VPC ID 打开 VPC 详细信息页面。

    在 Amazon VPC 控制台中筛选的 VPC 列表
  10. 向下滚动到资源映射部分,然后选择一个子网。子网详细信息显示在新选项卡中。

    VPC 控制台中显示子网列表的“资源映射”部分。
  11. 选择路由表下的链接。

    链接到子网详细信息页面上的路由表
  12. 选择路由表 ID 打开路由表的详细信息页面。

    筛选后的路由表列表
  13. 路由下,选择编辑路由

    带有“编辑路由”按钮的路由列表
  14. 选择添加路由,然后在目的地框中输入 0.0.0.0/0

    为新路由添加目的地
  15. 目标中选择互联网网关,然后选择之前创建的互联网网关。如果子网具有 IPv6 CIDR 块,还须添加指向同一互联网网关的 ::/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. 目标中选择 NAT 网关,然后选择之前创建的 NAT 网关。

    为新路由添加目标
  8. 选择 Save changes(保存更改)

按照以下步骤创建“仅出口互联网网关”,在将之添加到私有子网的路由表中。

创建“仅出口互联网网关”
  1. 在导航窗格中,选择仅出口互联网网关

  2. 选择创建仅出口互联网网关

  3. (可选)输入名称。

  4. 选择要在其中创建“仅出口互联网网关”的 VPC。

  5. 选择创建仅出口互联网网关

  6. 选择附加的 VPC ID下的链接。

    “仅出口互联网网关”的详细信息页面
  7. 选择 VPC ID 下的链接,打开 VPC 详细信息页面。

  8. 向下滚动到资源映射部分,然后选择一个私有子网。(私有子网是其路由表中不具有指向互联网网关的路由的子网。) 子网详细信息显示在新选项卡中。

    VPC 控制台中显示子网列表的“资源映射”部分。
  9. 选择路由表下的链接。

    链接到子网详细信息页面上的路由表
  10. 选择路由表 ID 打开路由表的详细信息页面。

    筛选后的路由表列表
  11. 路由下,选择编辑路由

    带有“编辑路由”按钮的路由列表
  12. 选择添加路由,然后在目的地框中输入 ::/0

    为新路由添加目的地
  13. 目标中选择仅限出口互联网网关,然后选择之前创建的网关。

    为新路由添加目标
  14. 选择 Save changes(保存更改)

配置 Lambda 函数

在创建函数时配置 VPC
  1. 打开 Lamba 控制台的 Functions page(函数页面)。

  2. 选择 Create function(创建函数)。

  3. 基本信息下的函数名称中输入函数的名称。

  4. 展开 Advanced settings(高级设置)。

  5. 选择启用 VPC,再选择一个 VPC。

  6. (可选)要允许出站 IPv6 流量,请选择允许双堆栈子网的 IPv6 流量

  7. 对于子网,选择全部私有子网。私有子网可以通过 NAT 网关访问互联网。将函数连接到公有子网并不会授予其互联网访问权限。

    注意

    如果您已选择允许双堆栈子网的 IPv6 流量,则所有选定的子网都必须具有 IPv4 CIDR 块和 IPv6 CIDR 块。

  8. 对于安全组,选择一个允许出站流量的安全组。

  9. 选择 Create function (创建函数)

Lambda 使用 AWSLambdaVPCAccessExecutionRole AWS 托管策略自动创建执行角色。只有在为 VPC 配置创建弹性网络接口时需要此策略中的权限,调用函数时并不需要。要应用最低权限,可以在创建函数和 VPC 配置之后,从执行角色中删除 AWSLambdaVPCAccessExecutionRole 策略。有关更多信息,请参阅 所需的 IAM 权限

为现有函数配置 VPC

要将 VPC 配置添加到现有函数,该函数的执行角色必须具有创建和管理弹性网络接口的权限AWSLambdaVPCAccessExecutionRole AWS 托管策略包含这些必要权限。要应用最低权限,可以在创建 VPC 配置之后,从执行角色中删除 AWSLambdaVPCAccessExecutionRole 策略。

  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择配置选项卡,然后选择 VPC

  4. VPC 下,选择 Edit(编辑)。

  5. 选择 VPC。

  6. (可选)要允许出站 IPv6 流量,请选择允许双堆栈子网的 IPv6 流量

  7. 对于子网,选择全部私有子网。私有子网可以通过 NAT 网关访问互联网。将函数连接到公有子网并不会授予其互联网访问权限。

    注意

    如果您已选择允许双堆栈子网的 IPv6 流量,则所有选定的子网都必须具有 IPv4 CIDR 块和 IPv6 CIDR 块。

  8. 对于安全组,选择一个允许出站流量的安全组。

  9. 选择保存

测试此函数

使用以下示例代码,确认连接到 VPC 的函数是否可以访问公有互联网。如果成功,代码将返回 200 状态代码。如果失败,函数将超时。

Node.js
  1. 在 Lambda 控制台的代码源窗格中,将以下代码粘贴到 index.mjs 文件中。该函数向公有端点发出 HTTP GET 请求,再返回 HTTP 响应代码来测试该函数是否可以访问公有互联网。

    Lambda 控制台代码编辑器。
    例 示例:包含 async/await 的 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. 部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
  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 控制台的代码源窗格中,将以下代码粘贴到 ambda_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. 部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
  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" }