通过 ELB 访问 AWS EC2 实例

Posted

技术标签:

【中文标题】通过 ELB 访问 AWS EC2 实例【英文标题】:Accessing AWS EC2 instances through ELB 【发布时间】:2012-03-14 21:15:28 【问题描述】:

我正在尝试在弹性负载均衡器下设置两个实例,但无法弄清楚我应该如何通过负载均衡器访问这些实例。

我已使用安全组设置实例,以允许从任何地方访问某些端口。我可以使用它们的“公共 DNS”(publicdns)主机名和端口 PORT 直接访问实例:

http://[publicdns]:PORT/

负载均衡器包含两个实例,它们都处于“服务状态”,并将端口 (PORT) 转发到实例上的同一端口。

但是,如果我要求

http://[dnsname]:PORT(其中 dnsname 是为 ELB 列出的 A 记录)

它没有连接到实例(连接超时)。

这不是使用负载均衡器的正确方法,还是我需要做任何事情来允许访问负载均衡器?唯一提到与负载均衡器相关的安全组是restrict 仅对负载均衡器的实例进行访问,但我不希望这样。我也希望能够单独访问它们。

我确信有些简单而愚蠢的事情我已经忘记了,没有意识到或做错了:P

干杯, 斯文德。


添加了额外信息:

负载均衡器的端口配置如下所示(实际上是 3 个端口):

10060 (HTTP) 转发到 10060 (HTTP) 粘性:禁用(编辑)

10061 (HTTP) 转发到 10061 (HTTP) 粘性:禁用(编辑)

10062 (HTTP) 转发到 10062 (HTTP) 粘性:禁用(编辑)

它使用标准/默认 elb 安全组 (amazon-elb-sg)。

实例有两个安全组。一个看起来像这样的外部:

22 (SSH)          0.0.0.0/0 10060 - 10061 0.0.0.0/0 10062              0.0.0.0/0

和一个内部,允许内部组内的任何东西在所有端口上进行通信:

0 - 65535 sg-xxxxxxxx(安全组 ID)

不确定这有什么区别,但实例是 m1.small 类型的图像 ami-31814f58。


可能有相关性的东西:

我的运行状况检查曾经是 HTTP:PORT/,但负载均衡器一直说实例“停止服务”,即使我似乎在该端口上收到了 200 响应。

然后我将其更改为 TCP:PORT,然后更改为“正在服务”。

是否应该为 HTTP 返回一些非常具体的内容,或者只是需要一个 HTTP 200 响应? ...并且它没有工作的事实是否暗示了为什么负载平衡本身也没有工作?

【问题讨论】:

我也尝试过,使用 Web 控制台:1) 创建了一个安全组,允许所有来源的所有访问。 2) 使用新的安全组创建新的 t1.micro 实例。 3) SSH 到组和端口 80 上的 netcat "Hello"。 4) 检查我是否可以直接获得 "Hello" HTTP 200 响应(是) 5) 创建负载均衡器并分配此实例。 6) 将健康检查设置为 TCP:80 (HTTP:80/ 不起作用)。 7) 尝试访问负载均衡器。不工作。 8) 感到难过:( 您是如何尝试访问负载均衡器的。当我向负载均衡器发出请求时,我请求的是一个文件 index.html。负载均衡器可能不喜欢发送空文件? 我进行了一些试验,但问题似乎出在我的负载均衡器健康检查上。仅获得 200 响应代码似乎还不够。我之前通过使用 netcat (echo "Hello" | nc -l PORT) 实现了这一点,但这不起作用。将其更改为使用 TCP 使其显示为“服务中”,但可能不起作用。我刚刚创建了一个小实例,一旦我安装了 httpd 并让它回复了一个正确的 html 文件(http 回复),它就可以工作了! :) 谢谢你们。周一我会验证是不是问题(bwight,你想把它写成答案形式吗,如果是的话我可以打勾:)) 经过额外验证后,我可以确认问题运行状况检查的格式不正确。我不确定到底需要什么,但可以这么说:使用实例上运行的我的 tomcat 服务器的空 200 响应确实 not 工作,但安装 httpd 并返回一个静态(甚至是空的) html 文件确实 工作。我一直在查看响应标头,我唯一能想到的是 tomcat 缺少内容类型... 听起来这可能是您可以带到亚马逊论坛的东西。如果您介绍我们在这里收集的事实,亚马逊的一位员工可能会给您一个很好的答案。通常,如果它不仅仅是“OMG,负载均衡器不起作用!”,它们会非常有帮助 【参考方案1】:

听起来您已经正确设置了所有内容。它们与实例进入负载均衡器的端口是否相同?还是您将请求转发到另一个端口?

附带说明,当我配置负载均衡器时,我通常不喜欢在任何端口上为公众开放我的实例。我只允许负载均衡器向这些实例发出请求。我过去注意到很多人会向实例的 IP 发出恶意请求,试图找到安全漏洞。我什至看到有人试图强行登录我的 Windows 机器......

要仅为负载均衡器创建安全规则,请运行以下命令并删除您在负载均衡器正在使用的端口的安全组中拥有的任何其他规则。如果您不使用命令行来运行这些命令,那么只需让我知道您尝试使用哪个界面,我可以尝试提供一个适合您的示例。

elb-create-lb-listeners <load-balancer> --listener "protocol=http, lb-port=<port>, instance-port=<port>"
ec2-authorize <security-group>  -o amazon-elb-sg -u amazon-elb

回到你的问题。就像我说的,您解释的步骤是正确的,在实例上打开端口并将端口转发到实例就足够了。也许您需要发布您的实例的安全组和负载均衡器的完整配置,以便我查看是否有其他因素影响您的情况。

【讨论】:

我无法重现您的错误。我使用相同的端口尝试了与您相同的设置,它似乎工作正常。负载均衡器花了几分钟才开始工作。 嗯。当然,我刚刚读到您说您看到了同样的问题:P ...我已经使用 java api 设置了实例、安全组和负载均衡器。我将尝试通过网络界面进行设置,看看是否有任何不同... 我看到了同样的问题,但它似乎在一分钟后起作用。我认为当我第一次尝试时,负载均衡器上的实例仍然没有激活。 你知道任何限制连接到特定弹性负载均衡器的方法吗?似乎这允许访问任何负载均衡器。 据我了解,只有 VPC 内的 ELB 可以使用自定义安全组启动。 docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/…【参考方案2】:

我继续创建了一个脚本,该脚本将重现我正在使用的完全相同的步骤。这假设您使用 linux 作为操作系统并且已经安装了 AWS CLI 工具。如果您还没有此设置,我建议您启动一个新的 Amazon Linux 微型实例并从那里运行脚本,因为它们已经安装了所有东西。

    从亚马逊https://aws-portal.amazon.com/gp/aws/securityCredentials下载X.509证书文件

    将证书文件复制到您将运行命令的机器上

    保存脚本中需要的两个变量

    aws_account=<aws account id>
    keypair="<key pair name>"
    

    将证书导出为环境变量

    export EC2_PRIVATE_KEY=<private_Key_file>
    export EC2_CERT=<cert_file>
    export EC2_URL=https://ec2.us-east-1.amazonaws.com
    

    创建安全组

    ec2-create-group loadbalancer-sg -d "Loadbalancer Test group"
    ec2-authorize loadbalancer-sg -o loadbalancer-sg -u $aws_account
    ec2-authorize loadbalancer-sg -p 80 -s 0.0.0.0/0
    

    为实例创建用户数据文件,以便启动 apache 并创建 index.html 文件

    mkdir -p ~/temp/ 
    echo '#! /bin/sh
    yum -qy install httpd
    touch /var/www/html/index.html
    /etc/init.d/httpd start' > ~/temp/user-data.sh
    

    启动新实例并保存instanceid

    instanceid=`ec2-run-instances ami-31814f58 -k "$keypair" -t t1.micro -g loadbalancer-sg -g default -z us-east-1a -f ~/temp/user-data.sh | grep INSTANCE | awk ' print $2 '`
    

    创建负载均衡器并附加实例

    elb-create-lb test-lb --availability-zones us-east-1a --listener "protocol=http, lb-port=80, instance-port=80"
    elb-register-instances-with-lb test-lb --instances $instanceid
    
    等到 loabalancer 中的实例状态为“InService”,然后尝试访问 url

【讨论】:

以上是关于通过 ELB 访问 AWS EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cloudfront 设置 AWS ELB 而不是单个 EC2 实例有啥意义?

AWS 云产品 CloudFront + ELB + EC2 + S3 构建虚拟主机动静分离站点

如何设置AWS CodeDeploy和EC2 CodeDeploy安全环境

在某些情况下,AWS ELB 不会将请求分发到 Auto Scaling 组 EC2 实例

使用 AWS Certificate Manager (ACM) 和在 ELB 后面运行的 EC2 服务器通过 HTTPS 处理会话需要 LEMP 堆栈进行哪些更改?

AWS - 无法通过 443 端口访问 EC2 实例