AWS Lambda + NAT网关的替代方案

12

简要介绍我的情况:我有一个VPC,其中包含一个API网关,它将其调用重定向到我的Lambda函数,然后它们访问RDS实例和外部API调用(互联网访问)。

它的结构

由于函数需要访问RDS,因此我将RDS和Lambda放在同一个VPC中,正确保护RDS而不公开。现在,由于Lambda位于VPC中,它们需要NAT网关才能访问互联网(几乎所有这些函数都需要调用第三方API),这就是我面临的巨大问题。

问题

我有一个小项目为几个用户提供服务(从10到200个用户),并且使用我创建的无服务器设置,我预计每个月的成本为从3.00美元到10.00美元,这是没有单个NAT网关的成本。现在,如果我们增加一个价格为$0.045每小时的网关的价格 - 我甚至没有考虑每传输1GB数据的$0.045 - 就是>每月30美元。对我来说,不创建另一个进行多AZ和减轻可能的可用区故障是愚蠢的 - 因此需要>两个NAT网关每月60.00美元

这不仅对我来说不切实际,而且也会使整个无服务器结构的重点失效,因为通常会遵循按需方法。

如何解决这个问题?

我的其中一个选择是将Lambda移出VPC(即没有VPC),并通过某种机制访问RDS,而无需使其公开可访问-在这里我也失败了,如何在Lambda函数在RDS VPC之外的情况下安全地访问RDS?

在最坏的情况下 - 我知道公开我的RDS是不好的 - 但是公开它会有多大的漏洞风险?

请注意,我不是责怪AWS的价格,这完全集中在寻找替代NAT网关的方法上 - 我欢迎解决此问题的建议。另外,如果我做了完全错误的假设,我很抱歉,我是AWS生态系统的新手。


不清楚你的系统有多忙,但以t3.medium为例——4GB,2CPU——大约每月30美元(未预订)。它可以放入VPC而无需NAT网关,并且再次取决于负载,应该能够轻松托管Web服务器和数据库。当然,还有许多其他大小的机器,价格从每月3.38美元到每月22,000美元不等(请参见https://ec2instances.info以获取众多选择)。 - stdunbar
我认为t2.nano可能适合我的需求。问题是,在一个短暂的时间窗口内,如果有5个Lambda同时调用这个实例,它能够处理这么多的并发请求吗?NAT网关肯定可以为我管理这个问题,但我不知道EC2实例是否可以胜任 - 你有什么想法吗? - Guilherme Matuella
1
一个作为NAT实例的t2.nano不会有问题处理5个...甚至100个或更多同时通过它传递的请求。在预算紧张的环境中,我毫不犹豫地使用它们。您始终可以监视实例指标。 - Michael - sqlbot
1个回答

6

一个公共的RDS实例解决了你的成本问题,但我强烈建议你避免这样做,因为这意味着任何人都可以发现并尝试对其进行身份验证。

Lambda函数

  • 由于Lambda函数需要与Internet和你的VPC通信,它们必须存在于一个VPC中。
  • Lambda函数也无法部署在公共子网中,因此它们必须存在于私有子网中。
  • 由于它们需要与Internet通信,你的私有子网需要一个NAT。

幸运的是,使用AWS托管的NAT网关不是连接到你的私有子网的唯一选择,你还可以选择运行自己的NAT实例。

https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html

虽然这已经不再推荐使用(NAT Gateways是托管的,所以更受欢迎),AWS仍提供可以用来完成相同工作的NAT实例AMI。你应该能够在每个私有子网中运行一个t2.nano NAT实例(在不同的可用区以获得HA),每个实例大约5美元。

这将为你节省50美元/月,并意味着你可以让你的RDS实例存在于私有子网中,而不需要公开它。唯一的缺点是现在你必须自己管理NAT实例(打补丁等)。


请参阅 https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-comparison.html 以获取更详细的两种类型比较。 - ik1ne
嗯,那是一个可行的解决方案,但是假设我有5个lambda“实例”同时调用我创建的这个NAT实例,它会怎么表现呢?我的意思是,该实例显然只有一个关联的IP,它能否处理来自这些Lambda的大量并发调用? - Guilherme Matuella
1
是的,相对而言,它可以处理相当大量的同时呼叫。但如果您正在寻找可扩展的解决方案,那么您需要考虑NAT网关。 - Chris McKinnel
关于您对公共RDS的评论,可以使用安全组阻止访问,那么为什么不推荐这个选项呢? - manash
现在可以使用接口端点来完成吗?我在一些地方看到过这个。 - SomeTypeFoo
@SomeTypeFoo 很抱歉,我认为不行。接口端点仅适用于 RDS API 端点,这意味着可以管理您的 RDS 实例,但无法查询其数据。 - PenguinBlues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接