使用NAT和公共/私有子网的高ELB延迟

我从我们的应用程序开始使用默认的VPCconfiguration,但是最近它变得更复杂了。 所以基本上我们正在使用ECS集群和1个EC2实例。 1个ELB链接到ECS服务。

我们最近不得不使用Lambda来实现SQS,并面对这样一个事实:为了使lambda函数能够访问SQS队列,我们​​必须使用NAT。 既然我们加了这个NAT,一切都出错了。

所以就networkingconfiguration而言,它几乎是默认的:

- 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 
  • 使用默认子网组的RDSpubsub1pubsub2privsub1privsub2
  • EC2 (ECS集群的一部分)使用privsub1子网
  • ELB使用pubsub1pubsub2子网
  • 使用privsub1privsub2子网的Lambda

ELB报告健康检查失败,并从池中删除我的EC2实例。 但是,如果我ssh的EC2框(使用公共子网中的中间ec2服务器),并试图curl本地主机:80 / healthcheck.html(这是ELB健康检查configuration)它的响应correclty。

我也检查安全组:

 - 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 

在这一点上,我有点失落,不知道该怎么做。 我很确定这是一个networking问题,但我不能孤立它。

这是一个chrome请求时间:

在这里输入图像说明

和随后完全一样的请求:

在这里输入图像说明

我也在AWS论坛上发帖: https : //forums.aws.amazon.com/thread.jspa? threadID =236569


UPDATE1

我已经启用了ELB上的跨区域负载平衡function来解决我的健康检查问题(ELB在公共子网中,EC2在私有中)。
networkingACL是默认的,允许一切。

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

    • 将公共子网中的EC2直接打开,响应时间缩短到400ms
  2. 由于我们已经添加了NAT,所以在公共子网和私有子网中的RDS实例不能从我们的办公室(外部世界)访问。


UPDATE2

我解决了我们在RDS上无法从我们的办公室访问的问题。 我认为我们启用了NAT,RDS使用了4个子网(2个公共networking和2个私有networking)的事实引起了这个问题。
RDS只需要使用公共子网 。 但是,修改RDS的子网组是不够的。 即使RDS信息的详细信息显示子网已更改,但没有考虑到这一点。

从AWS常见问题解答 :

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

[…]目前,更新现有的数据库子网组不会更改部署的数据库实例的当前子网; 需要实例types的缩放操作。 显式更改部署的数据库实例的数据库子网组目前不允许使用。

所以唯一的方法就是改变RDS实例的大小,或者从db快照中指定新的子网组(只使用公有子网)部署一个新的实例。 确保安全组也是正确的,因为它默认select默认的安全组。

我仍然在调查ELB延迟