【问题标题】:AWS Lambda - NAT Gateway internet access results in timeoutAWS Lambda - NAT 网关互联网访问导致超时
【发布时间】:2019-02-08 21:00:05
【问题描述】:

我有一个 AWS Lambda 函数:

  • 检查 Redis Elasticache 实例,
  • 如果在缓存中未找到该项目,则转到 Google Places API 服务。

Redis 实例位于私有子网;因此,为了获取它,我添加了 VPC 和实例所在的子网。我还指定了允许所有出站流量的安全组。网络 ACL 是默认的,应该用于所有入站和出站流量。

通过控制台将VPC添加到Lambda函数时,提示:

当您启用 VPC 时,您的 Lambda 函数将失去默认的互联网访问权限。 如果您的函数需要外部 Internet 访问,请确保您的安全组允许出站连接并且您的 VPC 具有 NAT 网关。

所以,在私有子网的Route Table 中,我也添加了一个NAT gateway。但是,在从 Lambda 函数调用 Google Places API 服务时,它总是注定会导致超时。

简而言之,我怀疑 NAT 网关是否正确允许 Lambda 函数访问 Internet。我如何检查它出了什么问题?

NAT 网关是否会在 CloudWatch 等中以某种方式记录呼叫或通过它尝试的呼叫尝试?

【问题讨论】:

    标签: amazon-web-services aws-lambda nat


    【解决方案1】:

    我的案例的问题是,我在私有子网中创建了 NAT 网关。

    确保将 NAT 网关放在公共子网中

    顺便说一下,CloudWatch for NAT Gateway 中有指标,但没有可用的直接日志记录。

    【讨论】:

    • 你能详细说明这个@vahdet 吗?我有完全相同的问题,但我对这个答案感到困惑,因为 IGW 已经在公共子网上,并且您不能 0.0.0.0/0 两次将 NAT 网关添加到 IGW 旁边。
    【解决方案2】:

    需要以下步骤

    1. 具有完全 VPC 权限的 IAM 角色分配给您的 lambda 函数。
    2. 具有公共子网和私有子网的 VPC
    3. 在创建 NAT 网关时 a)子网必须是公共子网 b)弹性IP新建或分配一个
    4. 创建路由表并添加另一个以目标作为我们在上面创建的 NAT 网关的路由。 你的 lambda 现在应该很高兴了

    【讨论】:

      【解决方案3】:

      我想详细说明@vahdet 的答案。试图协调 NAT 网关应该如何同时位于公共子网和私有子网中的方式让我失去了理智。似乎官方 AWS 文档 here 是错误的,但当然不是。我和其他人都错过了一个非常微妙的细节。

      NAT 网关必须同时跨两个不同的子网“热连线”,以便将私有地址桥接到面向互联网的公共地址。

      首先,我尝试将 NAT 网关与 IGW 放在同一个路由表中,但这当然行不通,因为您不能有两个具有不同目标的相同路由 (0.0.0.0/0)。

      指南说要将 NAT 网关放在专用网络的路由表中,我这样做了,但似乎没有用。

      我遗漏的关键细节是 NAT 网关必须公共子网中创建。文档实际上是这么说的,但它似乎令人困惑,因为后来我们被告知将 NAT 网关的 路由 放在 private table 中。

      这两件事都是真的。在公有子网中创建NAT网关,然后在私有路由表中只添加一个路由表条目

      文档告诉您在 VPC 中创建以下网络资源:

      • 两个新子网
      • 两个新的路由表
      • 一个新的 NAT 网关

      我已经有一个路由表和一些子网,所以我尝试只添加一个新子网和一个新路由表,这就是我遇到麻烦的地方。最好按照文档创建两个。

      这是子网对我来说的样子:

      subnet-public    10.8.9.0/24    us-east-1a
      subnet-private   10.8.8.0/24    us-east-1a
      

      然后在 subnet-public创建 NAT 网关。 它将等待几分钟,这很重要,因为它必须进入可用状态才能在路由表条目中被引用。

      这里是路由表:

      route-table-public
      10.8.0.0/16    local
      0.0.0.0/0      igw-xyz
      subnet-association: subnet-public
      
      route-table-private
      10.8.0.0/16    local
      0.0.0.0/0      nat-abc
      subnet-association: subnet-private
      

      你看到那里发生了什么吗?这真的很微妙。 NAT 网关是交叉连接的。它“存在”在创建它的公共子网中,但私有子网中的所有流量都被路由到它。

      如果您像我一开始那样在私有子网中创建 NAT 网关,那么 NAT 网关与私有子网中的其他所有东西一样隔离,并且无法将流量路由到互联网。它必须在公共子网中创建才能访问互联网,因为它必须在公共子网中有一个 IP 地址。我的 NAT 网关获得了 10.8.9.127 的内部 IP 和 54.X.X.X 范围内的外部 IP。

      通过使 NAT 网关成为私有路由表中的 0.0.0.0/0 路由,我们告诉所有非 10.8.0.0/16 流量直接进入 NAT 网关,即使它不是实际上在私有子网内

      VPC 本身知道如何跨自己的子网桥接流量,并且能够将 10.8.8.X 流量发送到 NAT 网关的 10.8.9.X IP。然后,它充当桥接器,并将通过其内部 IP 的所有流量转换为其外部 IP。因为它位于带有互联网网关的路由表中的公共子网中,所以外部 IP 具有通往互联网的清晰路径。

      现在我在 subnet-private 中的私有 VPC lambda 已通过 NAT 网关验证了互联网访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-20
        • 2021-01-09
        • 2019-12-06
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2021-03-02
        相关资源
        最近更新 更多