![使用 NAT 和公有/私有子网导致 ELB 延迟较高](https://linux22.com/image/687490/%E4%BD%BF%E7%94%A8%20NAT%20%E5%92%8C%E5%85%AC%E6%9C%89%2F%E7%A7%81%E6%9C%89%E5%AD%90%E7%BD%91%E5%AF%BC%E8%87%B4%20ELB%20%E5%BB%B6%E8%BF%9F%E8%BE%83%E9%AB%98.png)
我开始为我们的应用程序使用默认的 VPC 配置,但最近它变得有点复杂。所以基本上我们使用一个带有 1 个 EC2 实例的 ECS 集群。1 个链接到 ECS 服务的 ELB。
我们最近不得不使用 Lambda 实现 SQS,并且不得不面对这样一个事实:为了让 lambda 函数访问 SQS 队列,我们必须使用 NAT。自从我们添加了这个 NAT 后,一切都出错了。
因此就网络配置而言,它几乎是默认的:
- 1 VPC (172.31.0.0/16)
- 2 Public subnets:
- pubsub1 - CIDR: 172.31.48.0/20
- pubsub2 - CIDR: 172.31.0.0/20
- 2 Private subnets:
- privsub1 - CIDR: 172.31.16.0/20
- privsub2 - CIDR: 172.31.32.0/20
- 1 Main route table (not explicitelly assign to any subnets):
- 172.31.0.0/16 -> local
- 0.0.0.0/0 -> igw
- 1 Public route table (pubsub1 and pubsub2):
- 172.31.0.0/16 -> local
- 0.0.0.0/0 -> igw
- 1 Private route table (privsub1 and privsub2):
- 172.31.0.0/16 -> local
- 0.0.0.0/0 -> NAT
- 远程数据传送系统使用默认子网组(发布订阅1,发布订阅2,privsub1和privsub2)
- EC2(ECS 集群的一部分)使用privsub1子网
- 紧急负载平衡使用发布订阅1和发布订阅2子网
- 拉姆达使用privsub1和privsub2子网
ELB 报告健康检查失败并从池中删除我的 EC2 实例。但是,如果我 ssh EC2 框(使用公共子网中的中间 ec2 服务器),并尝试 curl localhost:80/healthcheck.html(这是 ELB 健康检查配置),它会正确响应。
我也检查了安全组:
- 1 security group for the ELB allowing HTTP and HTTPS to ALL inbound source and allowing ALL outbound traffic
- 1 security group for the EC2 server allowing HTTP inbound from the elb-security-group (I also tried from all source)
- 1 security group for the RDS allowing TCP connection on database from ec2-security-group
如果我将 ELB 添加到 2 个私有子网,则健康检查将正常运行。但是,运行 curl 请求时,我可以看到高延迟:
HTTPCode=200 TotalTime=1.401
HTTPCode=200 TotalTime=1.660
HTTPCode=200 TotalTime=1.537
HTTPCode=200 TotalTime=1.529
HTTPCode=200 TotalTime=1.519
这时我有点迷茫,不知道该怎么办。我很确定这是网络问题,但我无法隔离它。
以下是 Chrome 请求时序之一:
以及随后的完全相同的请求:
我也在 AWS 论坛上发帖:https://forums.aws.amazon.com/thread.jspa?threadID=236569
更新1
我已在 ELB 上启用了跨区域负载平衡,以解决我的健康检查问题(ELB 位于公共子网中,而 EC2 位于私有子网中)。
网络 ACL 是默认的,允许一切。
ELB 延迟仍然相同(1 到 2 秒)
- 将 EC2 移至公共子网并直接访问该框,响应时间降至 400 毫秒
由于我们添加了 NAT,因此从我们的办公室(外部世界)无法访问公共子网和私有子网中的 RDS 实例。
更新2
我解决了我们办公室无法访问 RDS 的问题。我认为我们启用了 NAT 并且 RDS 使用 4 个子网(2 个公网和 2 个私网)导致了这个问题。
RDS 仅需要使用公共子网但是,仅修改 RDS 的子网组是不够的。尽管 RDS 信息详细信息显示子网已更改,但它并未将其考虑在内。
来自AWS 常见问题解答:
问:我可以更改数据库实例的数据库子网组吗?
[...] 目前,更新现有 DB 子网组不会更改已部署 DB 实例的当前子网;需要实例类型扩展操作。目前不允许明确更改已部署 DB 实例的 DB 子网组。
因此,唯一的方法是更改 RDS 实例的大小,或者从指定新子网组(仅使用公共子网)的数据库快照部署新实例。确保安全组也是正确的,因为它默认选择默认安全组。
我仍在调查 ELB 延迟......