AWS Lambda + NAT 网关的替代方案
Posted
技术标签:
【中文标题】AWS Lambda + NAT 网关的替代方案【英文标题】:Alternative to AWS Lambda + NAT gateway 【发布时间】:2019-10-20 13:13:57 【问题描述】:快速介绍我的场景:我有一个 VPC,其中包含一个 API 网关,该网关将其调用重定向到我的 Lambda 函数,然后它们访问 RDS 实例和外部 API 调用(互联网访问)。
它的结构
由于函数需要访问 RDS,我将 RDS 和 Lambda 放在同一个 VPC 中,从而在不公开访问的情况下正确保护 RDS。现在,由于 Lambda 在 VPC 中,它们需要一个 NAT 网关来访问互联网(几乎所有这些功能都需要调用第三方 API),这就是我面临的一个巨大问题。
问题
我有一个为少数用户(从 10 到 200 个用户)提供服务的小项目,使用我创建的无服务器设置,我预计成本会每月从 3.00 美元到 10.00 美元强>。这就是没有单个 NAT 网关的成本。现在,如果我们加上网关的价格,即 $0.045 per hour - 我什至没有考虑每 GB 数据传输 0.045 美元 - 那就是 >30 美元/月。如果我不创建另一个多可用区并减轻可能的可用区故障,那就太愚蠢了——所以 >2 个 NAT 网关需要 60.00 美元。
这不仅对我来说是不切实际的,而且它是否也会使通常遵循按需方法的整个无服务器结构的点失效?
如何解决?
我的一个替代方案是将 Lambda 移出 VPC(意味着没有 VPC)并通过某种机制访问 RDS,而不使其公开访问 - 这也是我失败的地方,如何安全地访问Lambdas函数在RDS VPC之外的场景中的RDS?
在最坏的情况下 - 我知道将我的 RDS 暴露给公众是不好的 - 但是暴露它的漏洞有多大?
请记住,我并不是在责怪 AWS 的价格,这只是专注于寻找 NAT 网关的替代品 - 我很欣赏解决这种情况的建议。另外,如果我做了一个完全错误的假设,我很抱歉,我是 AWS 生态系统的新手。
【问题讨论】:
目前还不清楚您的系统有多忙,但例如,一个 t3.medium - 4GB,2CPU's - 每月大约 30 美元,无需预订。它可以在没有 NAT 网关的情况下放入 VPC,同样,根据您的负载,应该能够毫无问题地托管 Web 服务器和数据库。当然,还有许多其他尺寸的机器,从 $3.38/月到 $22k/月(见ec2instances.info有很多选择)。 我认为 t2.nano 可以满足我的需要。问题是,假设在一个简短的窗口中,5 个 lambdas 同时调用了这个实例。它能够同时处理这么多的多个请求吗? NAT 网关肯定会为我管理这个,但我不知道 ec2 实例是否可以 - 你有什么想法吗? 作为 NAT 实例的 t2.nano 处理 5... 可能没有问题,即使有 100 个或更多同时请求通过它。在预算紧张的环境中,我会毫不犹豫地使用它们。您可以随时查看实例指标。 【参考方案1】:公共 RDS 实例可以解决您的成本问题,但我强烈建议您避免这样做,因为这意味着任何人都可以发现并尝试对其进行身份验证。
Lambdas
因为您的 lambda 需要与 Internet 以及您的 VPC 通信,所以它们必须位于 VPC 中。 Lambda 也不能部署到公共子网中,因此它们必须位于私有子网中 因为他们需要与 Internet 通信,所以您的私有子网需要 NAT幸运的是,使用 AWS 托管的 NAT 网关不是将 NAT 附加到私有子网的唯一选择,您还可以选择运行自己的 NAT 实例。
https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html
虽然不再建议这样做(NAT 网关是托管的,因此是首选),但 AWS 仍提供 NAT 实例 AMI,您可以使用它们来完成相同的工作。您应该能够在每个私有子网中运行一个 t2.nano NAT 实例(在不同的 AZ 中以获得 HA),每个大约 5 美元。
这将为您每月节省 50 美元,这意味着您可以让您的 RDS 实例存在于私有子网中,而无需公开它。唯一的缺点是现在您必须自己管理 NAT 实例(打补丁等)。
【讨论】:
查看docs.aws.amazon.com/vpc/latest/userguide/…了解两种类型的更详细比较。 嗯,这是一个可行的解决方案,但假设我有 5 个 lambda“实例”同时调用我创建的这个 NAT 实例,它会如何表现?我的意思是,该实例显然只有 1 个与之关联的 IP,它是否能够处理来自 Lambda 的大量同时调用? 是的,相对而言,它会处理大量的同时通话。但是,如果您正在寻找一个可扩展的解决方案,您将需要考虑 NAT 网关。 关于您对公共 RDS 的评论,可以使用安全组阻止访问,您为什么不推荐此选项? 现在可以使用:Interface Endpoints 来完成吗?我在某些地方看到过这个弹出窗口以上是关于AWS Lambda + NAT 网关的替代方案的主要内容,如果未能解决你的问题,请参考以下文章
VPC 中的 AWS Lambda 在 NAT 之后没有互联网访问权限