私有EC2和HTTP流量中的AWS应用程序

时间:2018-02-13 21:51:44

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

我在私有子网中的EC2实例中运行应用程序(以增加额外的安全性),直接从与公有子网关联的面向Internet的NLB接收流量。

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

我刚刚得出下一个结论:

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

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

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

"数据处理费用适用于通过NAT网关处理的每千兆字节,无论流量的来源或目的地如何"

与私有子网(Web / app服务器所在的位置)关联的路由表具有{ - local; 0.0.0.0/0 - NATGateway}如果删除0.0.0.0/0条目,则对服务器的HTTP请求不起作用。如果我删除NAT网关,我会遇到同样的问题。 此外,当我有NAT网关和路由表从私有子网使用它时,当我从Internet做一个简单的HTTP请求时,我也可以在NAT网关的监控选项卡中看到流量 - http:/// index html的

有人遇到同样的问题吗?我的理解是否正确?

是否有任何解决方法可以避免这种情况?我可以想到以下几点:

  • 将应用程序移动到Web层(在公有子网中),以便EC2实例具有公共IP,因此不需要NAT网关来响应每个HTTP请求

  • 除了应用程序层之外还创建一个Web层,以便所有流量都来自NLB< - > Web Tier< - > App Tier

  • 创建NAT实例而不是NAT网关,这样就不需要为NAT处理付费。

谢谢!

1 个答案:

答案 0 :(得分:7)

因此,事实证明NLB中存在一种奇怪的行为(错误?),需要默认路由到某些以使返回流量起作用。

情景:

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

向NLB发送流量不会给出回复。

添加:

  • NAT网关
  • 在专用路由表中添加路由以指向NAT网关

这很有效。

但是,它实际上并没有使用NAT网关!

相反添加NAT网关,您可以改为创建到另一个实例的默认路由,例如:

0.0.0.0/0 -> another instance

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

在幕后,VPC网络检测到来自实例的流量是响应来自NLB的请求,流量将路由到NLB。

但是,它仅在路由表中存在有效默认路由时才有效。路线没有被使用 - 网络覆盖它,所以它指向的并不重要。但是,它必须指向有效的资源。如果它指向一个不附加在任何东西上的ENI,它就不起作用。在我的测试中,如果你将它指回同一个实例,它似乎也无法工作。但是,我把它指向另一个实例并且它工作得很好

AWS Support同意这不是最好的行为,但它是目前必须配置的方式。

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