【问题标题】:AWS Lambda Function in VPC With Internet Gateway Still Can't access Internet带有 Internet 网关的 VPC 中的 AWS Lambda 函数仍然无法访问 Internet
【发布时间】:2019-10-28 13:34:40
【问题描述】:

我有一个 lambda 函数,它只是将 http.get 转换为 http://www.google.com。如果我没有 VPC 背后的功能,它可以正常工作。当我将它放入我的 VPC 时,就会出现问题。

我知道您需要设置一个 Internet 网关。我这样做了。我的两个子网附加到将0.0.0.0/0 路由到此 Internet 网关的路由表。这不应该是我所需要的吗?

无论 Internet 网关的关联如何,该功能仍然挂起。子网的安全组允许来自0.0.0.0/0" 的所有流量。

根据Grant Internet Access to a VPC Lambda Function,这就是我应该做的一切。

编辑:

添加要明确的 VPC 组件的完整列表。

  • 创建了一个新的 VPC (vpc-09*)
  • 创建了一个新子网 (subnet-05*) 指向我的新子网:
  • 路由表,(rtb-0b)。我在子网关联下看到了子网 05*。在 Routes 下,我看到 Destination 0.0.0.0/0 链接到目标的
  • 一个新的 NAT 网关 (nat-08*)。此 NAT 网关具有弹性 IP 地址和私有 IP 地址。它位于正确的子网中。状态为可用。
  • 此外,我为 Lambda 函数创建了一个新的安全组。这包含一个目标为 0.0.0.0/0 的“所有流量”的出站规则

据我所知,我已经完成了该 AWS 文档链接中的所有工作,以便为我的 Lambda 提供 Internet 访问。然而,当尝试向外部互联网发出请求时,它仍然永远挂起。

【问题讨论】:

  • “它位于正确的子网中” 你确定吗? NAT 网关进入子网 X,默认路由到 Internet 网关。然后,Lambda 函数必须与子网 Y 关联,并具有到 NAT 网关的默认路由。
  • 是的,两者都需要,因为 NAT 网关必须位于公共子网上。这就是他们通过 Internet 网关到达 Internet 的方式。 NAT 网关不在它们所服务的同一子网中。
  • Lambda 函数指向一个或多个默认路由为 NAT 网关的子网。 NAT 网关位于不同的子网上,其默认路由是 Internet 网关。
  • Lambda 的第二个子网需要是第二个 private 子网,所以总共是 3 个。除非您的 RDS 实例是多可用区,并且您正在设计高可用性,否则可以忽略该警告。

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


【解决方案1】:

你快到了。您提供的链接直接解决了您的问题:

如果您的函数还需要互联网访问(例如,访问公共 AWS 服务端点),则您的函数必须使用 NAT 网关或实例

你错过了这个:

您的 VPC 应包含公有子网中的 NAT 网关或实例。

这意味着如果没有 NAT,您的 Lambda 将无法访问互联网 - 即使“它们”在公共子网中。这就是 lambda 在 VPC 中的基本工作方式。

您提供的完全相同的link 将指导您如何与您的 VPC 和 Lambda 一起创建此 NAT 网关。

补充答案 - 关于在这种情况下为什么需要 NAT 网关 - 是由于:

...您可以使用网络地址转换 (NAT) 网关来启用 私有子网 中的实例连接到互联网或其他 AWS 服务,但阻止互联网启动与那些实例...

摘自aws docs


记住:如果您需要您的 lambdas 访问仅互联网 - 而不是同一 VPC 中的任何其他资源 - 我建议将它们设为非 VPC然后他们就可以开箱即用地访问 Internet - 您无需支付 NAT 的费用。

【讨论】:

  • 我的 lambda 必须访问 RDS 和 S3,所以它必须在 VPC 中。我已经删除了所有代码,只是想让 http.get 工作。我创建了一个新的 VPC、一个新的子网、一个新的 NAT 网关,将它们全部链接起来,将其分配给 lambda 函数,但它仍然挂起。
  • 我认为您可能在整个配置和附件列表中缺少一步 - 您可以编辑您的问题以明确共享您的设置吗?如果您使用 CloudFormation,那就更好了。
  • 编辑了我的原始帖子以包含我设置的所有组件。我认为不为此使用 CloudFormation...
  • 这是正确答案。添加 NAT 网关最初不起作用,因为我不理解两个独立子网(一个用于私有子网,一个用于公共子网)的概念,其中一个将流量路由到 NAT 网关,另一个将流量路由到 Internet 网关。两者都需要,并且需要 lambda 函数指向私有函数。如果您只使用一个子网,Lambda 会抱怨高可用性,但我不在乎,所以我会留下警告。
  • 是的,AWS 定义 HA 是必要的 - 但这应该只适用于生产环境或产品,您可以在服务停机一段预定的时间内保持冷静。另外,我添加了更多关于 NAT 主题的信息!
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 2018-10-20
  • 2021-05-30
  • 2019-07-27
  • 2019-03-30
相关资源
最近更新 更多