AWS应用于私有EC2和HTTP流量

5

我有一个应用程序在EC2实例中运行,该实例位于私有子网中(为了增加额外的安全性),直接从与公共子网相关联的面向互联网的NLB接收流量。

我还在公共子网中配置了NAT网关,以便私有EC2实例可以从互联网下载所需内容。

我刚刚得出以下结论:

  • 如果我从互联网请求:http://index.html

  • 私有EC2实例使用NAT网关发送HTTP响应,因此您需要支付NAT处理费用。

https://aws.amazon.com/vpc/pricing/

“每个通过 NAT 网关处理的千兆字节数据都需要支付数据处理费用,无论流量的源头或目的地在哪里。”
“与私有子网(Web / App 服务器所在的位置)相关联的路由表具有 { - 本地; 0.0.0.0/0 - NATGateway }。如果我删除 0.0.0.0/0 条目,则无法使用 HTTP 请求访问服务器。如果我删除 NAT 网关,则会遇到同样的问题。此外,当我拥有 NAT 网关和路由表以从私有子网使用它时,当我从 Internet 进行简单的 HTTP 请求 - http:///index.html 时,我也可以在 NAT 网关的监视选项卡中看到流量。”
“有人遇到过相同的问题吗?我的理解正确吗?”
“是否有任何解决方法可以避免这种情况?我只能想到以下方法:”
  • 将应用程序移到 Web 层(位于公共子网中),使 EC2 实例具有公共 IP,因此它不需要 NAT 网关回应每个 HTTP 请求

  • 创建一个 Web 层,除了应用程序层之外,以便所有流量都经过 NLB <-> Web 层 <-> 应用程序层

  • 创建一个 NAT 实例,而不是 NAT 网关,这样您就不必支付 NAT 处理费用。

谢谢!

1个回答

10

所以, NLB 存在一个奇怪的行为(bug?),需要将默认路由指向某个资源,才能使返回流量正常工作。

场景:

  • NLB 位于公共子网中
  • NLB 目标组指向位于私有子网中的实例

向 NLB 发送流量将不会得到响应。

添加:

  • NAT 网关
  • 在私有路由表中添加一条路由,将其指向 NAT 网关

这样就可以正常工作了。

然而,实际上并没有使用 NAT 网关!

相反,您可以创建一个默认路由以指向另一个实例,例如:

0.0.0.0/0 -> 另一个实例

然后,连接到 NLB 就可以工作了!

在幕后,VPC 网络检测到从实例出来的流量是对通过 NLB 进来的请求的响应,并将流量路由到 NLB。

但是,只有在路由表中存在一个有效的默认路由时,它才能正常工作。该路由不会被使用--网络会覆盖它,所以它指向的内容并不重要。但是,它必须指向一个有效的资源。如果将其指向未连接任何内容的 ENI,则它无法正常工作。在我的测试中,如果将其指向相同的实例,则似乎也无法正常工作。但是,我将其指向另一个实例,它就可以正常工作

AWS 支持表示,这并不是最佳行为,但目前必须按照这种方式配置。

底线:它不需要 NAT 网关。它只需要一个有效的默认路由,用于路由返回流量时被忽略。


整洁的异常...但是等等...运营商报告称,流量似乎出现在NAT网关流量统计中。 - Michael - sqlbot
谢谢约翰。但是在你的例子中,你将NAT网关替换为公共子网中的EC2实例,这个实例就成了一个单点故障。如果你删除了该EC2实例(或者NAT网关,或者0.0.0.0/0路由),那么来自互联网的HTTP请求将无法工作。请在使用NAT网关时,发送HTTP请求时检查监控流量...它实际上使用的是NAT网关。 - Luis
据我所知,只需要有一个有效的默认路由即可。NLB将发送返回流量。例如,我将默认路由指向了私有子网中的一个实例(没有NAT网关),它可以正常工作。它实际上并没有使用该实例。 - John Rotenstein
我想知道如果停止用于默认路由的EC2实例,它是否仍然有效。同时,如果该EC2实例实际上正在接收某些流量(因为根据监控窗口,NAT网关实际上正在接收该流量),也是如此。 - Luis
我也得到了AWS支持的确认:“由于目标组中的实例不会通过NAT网关发送响应,而是将返回通过NLB,因此您不会被收费。” - Alex Rudd
另一个实例是哪个?来自同一子网吗?你使用了哪个IP地址? - Metalhead

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