使用 NAT 和公有/私有子网导致 ELB 延迟较高

使用 NAT 和公有/私有子网导致 ELB 延迟较高

我开始为我们的应用程序使用默认的 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发布订阅2privsub1privsub2
  • EC2(ECS 集群的一部分)使用privsub1子网
  • 紧急负载平衡使用发布订阅1发布订阅2子网
  • 拉姆达使用privsub1privsub2子网

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 是默认的,允许一切。

  1. ELB 延迟仍然相同(1 到 2 秒)

    • 将 EC2 移至公共子网并直接访问该框,响应时间降至 400 毫秒
  2. 由于我们添加了 NAT,因此从我们的办公室(外部世界)无法访问公共子网和私有子网中的 RDS 实例。


更新2

我解决了我们办公室无法访问 RDS 的问题。我认为我们启用了 NAT 并且 RDS 使用 4 个子网(2 个公网和 2 个私网)导致了这个问题。
RDS 仅需要使用公共子网但是,仅修改 RDS 的子网组是不够的。尽管 RDS 信息详细信息显示子网已更改,但它并未将其考虑在内。

来自AWS 常见问题解答

问:我可以更改数据库实例的数据库子网组吗?

[...] 目前,更新现有 DB 子网组不会更改已部署 DB 实例的当前子网;需要实例类型扩展操作。目前不允许明确更改已部署 DB 实例的 DB 子网组。

因此,唯一的方法是更改​​ RDS 实例的大小,或者从指定新子网组(仅使用公共子网)的数据库快照部署新实例。确保安全组也是正确的,因为它默认选择默认安全组。

我仍在调查 ELB 延迟......

相关内容