2012-02-24 239 views
10

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

我已经设置了一个安全组实例来允许从任何地方访问某些端口。

的http:// [publicdns]:PORT/

负载均衡包含了两个实例,他们是我可以直接使用他们的 “公共DNS”(publicdns)主机名和端口端口访问实例都是“In Service”并且它将端口(PORT)转发到实例上的同一个端口上。

然而,如果我请求

HTTP:// [DNSNAME]:PORT(其中DNSNAME是用于ELB列出的A记录)

它不连接到该实例(连接超时)。

这不是使用负载均衡器的正确方式,还是我需要做任何事情才能访问负载均衡器?与负载平衡器相关的唯一提到的安全组是限制只能访问负载平衡器的实例,但我不想那样做。我希望能够单独访问它们。

我敢肯定有一些简单和愚蠢的我忘了,没有意识到或冤屈:P

干杯, 斯文。


额外的信息说:

端口配置为负载平衡器看起来是这样的(实际上是3个):

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

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

1 0062(HTTP)转发到10062(HTTP) 粘滞性:已禁用(编辑)

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

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

22(SSH)                    0.0.0.0/0
10060 - 10061 0.0.0.0/0
                      0.0.0。0/0

和一个内部,内部组内允许任何对所有端口进行通信:

0 - 65535 SG-XXXXXXXX(安全组ID)

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


东西可能有相关性:以前是HTTP

我的健康检查:PORT /但负载平衡器口口声声说情况是“不在服务区”,即使我似乎得到200对该端口上的请求作出响应。

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

是否有一些非常具体的应该返回HTTP的,或者它只是一个HTTP 200响应是必需的? ...并且确实没有提示为什么负载均衡本身无法正常工作?

+0

我想这是好,使用Web控制台: 1)创建一个安全组,允许所有来自所有来源的访问。 2)使用新的安全组创建新的t1.micro实例。 3)将SSH连接到组80上的“Hello”。 4)检查我是否可以直接获取“Hello”HTTP 200响应(是) 5)创建负载平衡器并分配此实例。 6)将健康检查设置为TCP:80(HTTP:80 /不起作用)。 7)尝试访问负载平衡器。不工作。 8)感觉很伤心: – 2012-02-24 17:45:50

+0

你是如何访问loadbalancer的?当我向loadbalancer发送请求时,我正在请求一个index.html文件,它可能loadbalancer不喜欢发送一个空文件吗? – bwight 2012-02-24 18:31:11

+0

I我一直在试验一下,看起来问题出在我的负载平衡器健康检查上,只是得到一个200响应代码似乎不够,我之前通过使用netcat实现了这一点(echo“Hello”| nc -l PORT),但没有起作用,改为使用TCP使其显示为“服务中”,但可能没有奏效,我只创建了一个小实例,并且一旦我安装了httpd并且回复了它一个合适的html文件(http回复),它工作!:)谢谢大家。在星期一我会验证它是问题(bwight,你想写在答案的形式,所以我可以勾选它,如果是这样:)) – 2012-02-25 09:06:17

回答

3

这听起来像你有一切正确设置。它们是否与进入负载均衡器的端口相同?或者你是否将请求转发到另一个端口?

作为一个侧面说明,当我配置我的负载均衡器时,我通常不喜欢在任何端口上为公众开放我的实例。我只允许负载均衡器向这些实例发出请求。我注意到过去有很多人会向试图找到安全漏洞的实例的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 

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

+0

我已经在上面添加了一些更多信息... – 2012-02-24 14:14:47

+0

谢谢我会看看 – bwight 2012-02-24 14:20:44

+0

我无法重现您的错误。我尝试了与你使用相同的端口相同的设置,它似乎工作正常。花了几分钟让负载均衡器开始工作。 – bwight 2012-02-24 14:43:22

1

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

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

  2. 复制证书文件到本机在将要运行的命令中所需的脚本

    aws_account=<aws account id> 
    keypair="<key pair name>" 
    
  3. 导出证书,

  4. 保存两个变量环境变量

    export EC2_PRIVATE_KEY=<private_Key_file> 
    export EC2_CERT=<cert_file> 
    export EC2_URL=https://ec2.us-east-1.amazonaws.com 
    
  5. 创建安全gr oups

    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 
    
  6. 创建用户数据文件的情况下,这样的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 
    
  7. 启动新的实例,并保存实例id

    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 }'` 
    
  8. 创建负载均衡器和连接实例

    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 
    
  9. 等待,直到loabalancer您的实例状态是“在职”和尝试访问的URL