AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关

Posted

技术标签:

【中文标题】AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关【英文标题】:AWS Lambda: How to set up a NAT gateway for a lambda function with VPC access 【发布时间】:2016-05-29 01:45:41 【问题描述】:

根据this document,如果我需要通过 VPC 访问从我的 Lambda 函数访问 Internet 资源,我需要设置一个 NAT 网关。

于是我跟着this guide设置了一个NAT网关。但是,在我需要编辑子网的路由表以添加目的地为 0.0.0.0/0 的条目并将目标作为我的 NAT 网关 id 的阶段,我收到了一个错误

An entry with this destination already exists

我检查并注意到对于该现有条目,目标是我的 VPC 的互联网网关。如果我将该条目替换为 NAT 网关 ID,我将无法通过 SSH 从外界访问该 VPC 中的任何 EC2 实例。我怎样才能实现这个 VPC 中所有 EC2 实例的解决方案:

只能通过 SSH 访问,其余流量被阻止 能够完全访问同一 VPC 中的其他 EC2 实例 有权访问此 VPC 的 Lambda 函数可以访问 SQS 和 Kinesis 等外部资源。

【问题讨论】:

这是我写的一个很好的教程:“如何设置 AWS lambda 函数以与互联网和 VPC 通信”gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7 刚刚查看了 NAT 网关定价,目前每小时 0.045 美元是否正确? 我在这个答案中解释了我们大多数人的绊脚石:***.com/a/63369754/2255753 【参考方案1】:

我在这里找到了关于如何让您的 lambda 连接到 VPC 资源和互联网的详细教程:https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7

快速浏览:

为您的 lambda 设置新子网(CIDR 不与现有子网重叠)。你需要: 一个子网将指向 NAT 使用的 Internet 网关 (IGW)(我们称之为 A) 几个指向您的 lambda(B、C 和 D)要使用的 NAT 添加NAT网关:设置子网为A 将您的 lambda VPC 子网设置为 B、C 和 D 创建 2 个路由表: 指向您的 NAT,目标为 0.0.0.0/0 指向您的 IGW(应该已经存在),目标为 0.0.0.0/0 更新子网 A 以使用指向 IGW 的路由表 更新子网 B、C 和 D 以使用指向 NAT 的路由表

希望这会有所帮助。

【讨论】:

我添加了详细的演练。不像链接的tuto那么详细,但这正是我所做的,它似乎回答了最初的问题。 链接的文章非常有用,但有一些错误 - 例如它使用'AWS服务'来表示'仅在您的VPC中的服务',但实际上许多AWS服务都在公共互联网上(例如作为默认 S3 设置) 本教程并不完美,省略了一些细节,但对于初学者来说仍然是一个很好的起点。 另外,对于那些想了解 VPC 以及它与 RDS/Lambda 的关系的人,这里有一个写得很好的解释,适合初学者:edgarroman.github.io/zappa-django-guide/aws_network_primer 如果我能给你 100 票我会的,OMG 很难得到这个答案,仍然对到底发生了什么感到困惑,哈哈【参考方案2】:

您需要 IGW 和 NAT 网关才能使其正常工作。

在公共子网(您想从外部访问的子网)中,将 0.0.0.0/0 流量指向 IGW 网关。 NAT 网关本身需要位于这些公共子网之一中。

在您想要 NAT 点 0.0.0.0/0 流量到 NAT 网关弹性网络接口的私有子网中。

如果 0.0.0.0/0 已绑定到网关,您需要将其删除并添加指向 NAT 网关。

见: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html

【讨论】:

我需要在 Lambda 函数的配置中选择私有子网 谢谢!!这对我帮助很大。 在最便宜的地区运行约 30 美元/月的 NAT 网关(免费层不提供 NAT GW),从业余爱好者的角度来看,这种做法很糟糕。 是和不是。如果您使用内置的,那您是对的,这对业余爱好者来说很糟糕。在这种情况下,您可以尝试利用您可以构建的 EC2 实例来充当 NAT 实例(人们在托管版本出现之前所做的事情) @nxmohamad 感谢您的客气话。我从早期就与 AWS 合作,但如果重要的话,我已经通过艰难的方式学到了大部分这些东西 :)【参考方案3】:

您需要两个不同的子网。听起来好像你只有一个。

Lambda 只能在 VPC 内使用私有子网。

私有子网的定义:默认路由是 NAT 实例(大多数位于不同的公共子网)或 NAT 网关,子网中的 no 机器有公共 IP 地址.具有公共 IP 地址的计算机可以在私有子网上使用,但在大多数情况下,它们将无法正常工作,因为这在技术上是错误配置。

公有子网的定义:默认路由是igw-xxxxxxxx Internet Gateway 对象,机器分配有公有IP 地址。没有公共 IP 地址的机器可以在公共子网上使用,但它们将无法访问 Internet,因为这是错误配置。

听起来您正试图通过更改默认路由将现有子网从公共子网更改为私有子网。正如预期的那样,这会破坏其他东西。

另见Why do we need private subnet in VPC?

【讨论】:

私有子网不必将 nat 实例或网关作为默认路由。您可以在公共子网中拥有没有公共 IP 的机器。私有子网和公共子网之间唯一真正的区别是到 igw 的路由。 我将编辑以更清楚地解决 igw 包含/排除作为定义属性,并添加权威引用。 这个账号有很多EC2实例,有4个子网。我想确保在进行更改时不会搞砸任何事情。我应该添加一个新子网吗?我不确定我应该如何配置我的 Lambda 以使用此策略 如果您已经有一个子网,其中默认路由指向 NAT 实例或 NAT 网关,您应该能够将该子网与 Lambda 一起使用。如果没有,您将需要创建一个新子网,如果您想确定不会中断,然后为该子网中的机器(包括 Lambda 接口)安排 NAT(NAT 网关最简单,通常具有最佳性能;NAT 实例涉及更多但记录在案,性能较低(尽管您可能没有注意到,具体取决于流量),并且更便宜)。 @Michael-sqlbot 我想质疑你的第二个陈述。 Lambda 可以在公共子网中运行。但是,由于为 Lambda 创建的 ENI 不尊重子网“自动分配公共 IP”设置,因此它没有获得公共 IP,也无法访问外部资源,因此考虑到 OP 的问题,它没有帮助。也就是说,我已经在公共子网中部署了 Lambda,可以访问相同公共子网中的 ElastiCache 集群。【参考方案4】:

大家好,我开发了一个分步教程,并附有明确的屏幕截图:

第一部分

    在 AWS 中创建 lambda 函数 创建 API 网关以将所有请求重定向到您的 AWS Lambda 函数 https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-ec7ce38e18be

第二部分

    为您的 lambda 函数配置 VPC 以安全的方式授予对 lambda 函数的 Internet 访问权限 将 Node.js Restful API 部署到您的 Lambda 函数中 https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-8ff6cc97780f

【讨论】:

【参考方案5】:

在您的 VPC 和互联网访问中使用您的 Lambda:

我相信,你们中的大多数人已经拥有 IGW,您正在 VPC 内部使用并使用互联网,因此无需创建新的。

对我有用的步骤:

    在您的主 VPC 下创建一个新子网(建议 2 个或更多)。给它一个带有掩码的新 CIDR,你认为这将是你的 Lambda 中使用的网络接口的计数。(我做了 X.X.X.X/28 ,因为对我们来说已经足够了)

    创建 NAT 网关,添加弹性 IP 或创建新的 EIP 并将其添加到 VPC 下的主子网。 (请记住,如果您已经有 Internet 网关,它会起作用)

    创建路由表并将 0.0.0.0/0 路由添加到目标 - 我们创建的 Nat 网关 ID (nat-xxxxxxxxxxxxxxxxx)(步骤 2)

    为您的 lambda 创建新的安全组(ALL 到 ALL)以使用 Internet。我相信将 0.0.0.0/0 添加到互联网的 lambda 是安全的。

    打开 lambda - 选择您的 VPC,添加您正在使用的 SG,并添加从第 4 步创建的新产品以使用互联网。按保存并测试。

【讨论】:

【参考方案6】:

您实际上不再需要创建 Internet 和 NAT 网关:https://aws.amazon.com/blogs/security/how-to-connect-to-aws-secrets-manager-service-within-a-virtual-private-cloud/

【讨论】:

这仅适用于 AWS Secret Manager。如果您的 Lambda 仍需要访问位于 VPC 之上的 ElasticSearch、RDS 或其他服务,您仍需要对其进行配置。

以上是关于AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关的主要内容,如果未能解决你的问题,请参考以下文章

aws lambda函数调用内部负载均衡器

如何为 AWS API Gateway Custom Authorizer 提供 Lambda 权限?

从 VPC 中的 Lambda 访问 AWS S3

AWS Lambda 无法访问同一 VPC 中的 EC2 端口

使用 VPC 配置添加 AWS Lambda 会导致访问 S3 时超时

AWS Lambda 无法调用没有 VPC 的另一个 AWS Lambda - NodeJs