私有 EC2 和 HTTP 流量中的 AWS 应用程序
AWS Application in Private EC2 and HTTP traffic
我在私有子网的 EC2 实例中有一个应用程序 运行(以增加额外的安全性),直接从与 public 子网关联的面向互联网的 NLB 接收流量。
我还在 public 子网中配置了 NAT 网关,以便私有 EC2 实例可以从 Internet 下载任何需要的内容。
我刚刚得出下一个结论:
如果我从网上请求:http://index.html
私有 EC2 实例使用 NAT 网关发回 HTTP 响应,因此您需要为该 NAT 处理付费。
https://aws.amazon.com/vpc/pricing/
"Data processing charges apply for each Gigabyte processed through the NAT gateway regardless of the traffic’s source or destination"
与私有子网(web/app 服务器所在的位置)关联的路由 Table 具有 { - local ; 0.0.0.0/0 - NATGateway} 如果我删除 0.0.0.0/0 条目,则对服务器的 HTTP 请求将不起作用。如果我删除 NAT 网关,我会遇到同样的问题。
此外,当我有 NAT 网关和路由 table 从私有子网使用它时,当我从 Internet 发出一个简单的 HTTP 请求时,我还可以在 NAT 网关的监控选项卡中看到流量 - http: ///index.html
有人遇到过同样的问题吗?我的理解正确吗?
是否有任何解决方法可以避免这种情况?我只能想到以下几点:
将应用程序移动到 Web 层(在 public 子网中)以便 EC2 实例具有 public IP,因此它不需要 NAT 网关来响应每个 HTTP 请求
除了应用层之外还创建一个 Web 层,以便所有流量都来自 NLB <-> Web 层 <-> App 层
创建 NAT 实例而不是 NAT 网关,这样您就不会为该 NAT 处理付费。
谢谢!
所以,事实证明 NLB 中存在一个奇怪的行为(错误?),它需要一个默认路由到 某物 才能使 return 流量正常工作。
场景:
- Public 子网中的 NLB
- NLB 目标组指向私有子网中的一个实例
向 NLB 发送流量将不会给出响应。
添加:
- NAT 网关
- 在私有路由中添加一条路由Table指向NAT网关
这有效。
但是,它实际上并没有使用NAT网关!
您可以创建到另一个实例的默认路由,而不是 添加 NAT 网关,例如:
0.0.0.0/0 -> another instance
然后,连接到 NLB 成功了!
在幕后,VPC 网络检测到来自实例的流量是对通过 NLB 发出的请求的响应,流量将路由出 NLB。
但是,它仅在路由 table 中存在 有效默认路由 时才有效。路由未被使用——网络覆盖它,所以它指向什么并不重要。但是,它必须指向有效资源。如果它指向一个没有附加到任何东西的 ENI,它就不起作用。在我的测试中,如果将它指向同一个实例,它似乎也不起作用。但是,我将它指向另一个实例,它工作得很好。
AWS Support 同意这不是最佳行为,但这是目前必须配置的方式。
底线:它不需要 NAT 网关。它只需要一个有效的默认路由,在路由 return 流量时将被忽略。
我在私有子网的 EC2 实例中有一个应用程序 运行(以增加额外的安全性),直接从与 public 子网关联的面向互联网的 NLB 接收流量。
我还在 public 子网中配置了 NAT 网关,以便私有 EC2 实例可以从 Internet 下载任何需要的内容。
我刚刚得出下一个结论:
如果我从网上请求:http://index.html
私有 EC2 实例使用 NAT 网关发回 HTTP 响应,因此您需要为该 NAT 处理付费。
https://aws.amazon.com/vpc/pricing/
"Data processing charges apply for each Gigabyte processed through the NAT gateway regardless of the traffic’s source or destination"
与私有子网(web/app 服务器所在的位置)关联的路由 Table 具有 { - local ; 0.0.0.0/0 - NATGateway} 如果我删除 0.0.0.0/0 条目,则对服务器的 HTTP 请求将不起作用。如果我删除 NAT 网关,我会遇到同样的问题。 此外,当我有 NAT 网关和路由 table 从私有子网使用它时,当我从 Internet 发出一个简单的 HTTP 请求时,我还可以在 NAT 网关的监控选项卡中看到流量 - http: ///index.html
有人遇到过同样的问题吗?我的理解正确吗?
是否有任何解决方法可以避免这种情况?我只能想到以下几点:
将应用程序移动到 Web 层(在 public 子网中)以便 EC2 实例具有 public IP,因此它不需要 NAT 网关来响应每个 HTTP 请求
除了应用层之外还创建一个 Web 层,以便所有流量都来自 NLB <-> Web 层 <-> App 层
创建 NAT 实例而不是 NAT 网关,这样您就不会为该 NAT 处理付费。
谢谢!
所以,事实证明 NLB 中存在一个奇怪的行为(错误?),它需要一个默认路由到 某物 才能使 return 流量正常工作。
场景:
- Public 子网中的 NLB
- NLB 目标组指向私有子网中的一个实例
向 NLB 发送流量将不会给出响应。
添加:
- NAT 网关
- 在私有路由中添加一条路由Table指向NAT网关
这有效。
但是,它实际上并没有使用NAT网关!
您可以创建到另一个实例的默认路由,而不是 添加 NAT 网关,例如:
0.0.0.0/0 -> another instance
然后,连接到 NLB 成功了!
在幕后,VPC 网络检测到来自实例的流量是对通过 NLB 发出的请求的响应,流量将路由出 NLB。
但是,它仅在路由 table 中存在 有效默认路由 时才有效。路由未被使用——网络覆盖它,所以它指向什么并不重要。但是,它必须指向有效资源。如果它指向一个没有附加到任何东西的 ENI,它就不起作用。在我的测试中,如果将它指向同一个实例,它似乎也不起作用。但是,我将它指向另一个实例,它工作得很好。
AWS Support 同意这不是最佳行为,但这是目前必须配置的方式。
底线:它不需要 NAT 网关。它只需要一个有效的默认路由,在路由 return 流量时将被忽略。