Amazon ELB用于VPC中私有子网内的EC2实例

78
我正在使用Amazon EC2,并且我想将一个面向互联网的ELB(负载均衡器)放到私有子网上的2个实例中。我正在使用带有公共和私有子网的VPC。
- 如果我只添加私有子网到ELB,则它将不会获得任何连接。 - 如果我将两个子网连接到ELB,则它可以访问实例,但它经常会超时。(见截图1) - 如果我仅连接到公共子网,则我的附加到ELB的实例会变为OutofService状态,因为我没有任何实例在公共子网中,实例计数显示为0(见截图2)。
我的问题实际上是对此问题的扩展。按照已接受答案中提到的6个步骤后,我仍然无法解决问题。我甚至尝试了在EC2实例和ELB的安全组中允许端口,但这并没有帮助。
请帮忙看一下,我现在非常困扰。
2个回答

108

您提到的另一个SO问题是正确的。请仔细检查以下内容:

  • 您需要仅将公共子网附加到ELB上,并确保这些子网的可用区与您的实例所在的私有子网的可用区对齐。
  • 确保实例的安全组允许从负载均衡器的安全组访问
  • 负载均衡器安全组应具有出站规则,以允许健康检查达到实例
  • 确保您的健康检查在实例上本地工作。例如,如果ELB中的健康检查为HTTP:8080 / health_check,则可以在实例上使用curl x.x.x.x:8080 / health_check(其中x.x.x.x是实例的私有IP)并获得200响应代码。
  • 公共子网路由表应将0.0.0.0/0路由到连接到VPC的Internet网关。
  • 私有子网路由表应将0.0.0.0/0路由到公共子网中的NAT实例或网关

2
我注意到在截图1中,健康的实例位于AZ ap-southeast-1b。请确保您ELB的公共子网与该区域相同。例如,ELB的公共子网位于ap-southeast-1b,而实例的私有子网位于ap-southeast-1b。如果区域不匹配,则无法正常工作。 - Ben Whaley
3
@BenWhaley是正确的。稍微扩展一下:您的ELB应只位于公共子网上,并且仅位于与实例相同可用区中的子网上。 - Michael - sqlbot
2
Cross Zone 确保负载均衡器接口在一个区域内将流量发送到其他可用区的实例。文档 - Ben Whaley
2
这个要求的原因是AWS在与ELB相关的每个子网中放置了一个ELB“节点”。这些节点的网络接口具有公共IP,需要能够与互联网通信,因此需要位于具有IGW路由的子网中。 - seanmcl
1
我发现这个官方来源非常准确,但是这个问题帮助我向我的DevOps团队证明他们的设置在我们的QA环境中引起了问题,所以谢谢!https://aws.amazon.com/premiumsupport/knowledge-center/public-load-balancer-private-ec2/ - Brett Green
显示剩余11条评论

4

我也从另一个stackoverflow问题中得到了帮助。对于我来说,我经常忘记需要在服务器上安装软件(例如Apache),如果您没有创建NAT GW或其他方法以允许软件安装,则将失败。如果您想尝试自动化方式而不需要太多麻烦,可以尝试使用以下脚本:

https://github.com/jouellnyc/AWS/tree/master/create_aws_vpc3

注意,已有许多好的文档和讨论,但是:
我从ELB获取到的HTTP代码如下:
504 - 可能与安全组相关 - 允许访问实例的80端口
503 - 可能是错误的目标组设置
502 - 可能由于没有NAT GW或安装软件的方法,导致Apache/Server未运行或未安装。

我在私有子网中拥有一个没有NAT的EC2,以及在公共子网中带有IG的ELB。我一直无法弄清楚为什么会不断出现502错误。我通过CDK进行部署,你的答案让我意识到我需要至少最初附加一个NAT,以便必要的软件安装在实例上。非常感谢! - Akash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接