Доступ к инстансам AWS EC2 через ELB

Я пытаюсь настроить два экземпляра под эластичным балансировщиком нагрузки, но не могу понять, как я должен получить доступ к экземплярам через балансировщик нагрузки.

Я настроил экземпляры с группой безопасности, чтобы разрешить доступ из любого места к определенным портам. Я могу получить доступ к экземплярам напрямую, используя их имя хоста "Public DNS" (publicdns) и порт PORT:

http: // [publicdns]: PORT /

Балансировщик нагрузки содержит два экземпляра, и оба они находятся в состоянии «В рабочем состоянии» и перенаправляют порт (ПОРТ) на один и тот же порт экземпляров.

Однако, если я запрошу

http: // [dnsname]: PORT (где dnsname - это запись A, указанная для ELB)

он не подключается к экземпляру (время ожидания истекло).

Разве это не правильный способ использования балансировщика нагрузки, или мне нужно что-то делать, чтобы разрешить доступ к балансировщику нагрузки? Единственное упоминание о группах безопасности в отношении балансировщика нагрузки - это ограничение доступа к экземплярам только для балансировщика нагрузки, но я этого не хочу. Я также хочу иметь доступ к ним по отдельности.

Я уверен, что есть что-то простое и глупое, что я забыл, не осознал или сделал неправильно: 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 (идентификатор группы безопасности)

Не уверен, что это имеет значение, но это экземпляры m1.small типа изображения ami-31814f58.


Что-то, что может иметь отношение:

Раньше моя проверка работоспособности выполнялась по протоколу HTTP: PORT /, но балансировщик нагрузки продолжал говорить, что экземпляры «вышли из строя», хотя я, кажется, получаю ответ 200 на запрос через этот порт.

Затем я изменил его на TCP: PORT, а затем он изменился, чтобы сказать, что они «В обслуживании».

Есть ли что-то очень конкретное, что нужно вернуть для HTTP, или это просто ответ HTTP 200, который требуется? ... и указывает ли тот факт, что он не работал, на то, почему не работала и сама балансировка нагрузки?


person Svend Hansen    schedule 24.02.2012    source источник
comment
Я тоже пробовал это, используя веб-консоль: 1) Создал группу безопасности, которая разрешает любой доступ из всех источников. 2) Создан новый экземпляр t1.micro с использованием новой группы безопасности. 3) SSH для группы и netcat Hello на порт 80. 4) Убедитесь, что я могу получить ответ Hello HTTP 200 напрямую (да) 5) Создайте балансировщик нагрузки и назначьте этот экземпляр. 6) Установите проверку работоспособности как TCP: 80 (HTTP: 80 / не работает). 7) Попробуйте получить доступ к балансировщику нагрузки. Не работает. 8) Грустно :(   -  person Svend Hansen    schedule 24.02.2012
comment
Как вы пытаетесь получить доступ к балансировщику нагрузки. Когда я делаю запросы к loadbalancer, я запрашиваю файл index.html. Возможно, балансировщику нагрузки не нравится отправлять пустой файл?   -  person bwight    schedule 24.02.2012
comment
Я немного поэкспериментировал, и похоже, что проблема в проверке работоспособности моих балансировщиков нагрузки. Просто получить код ответа 200 кажется недостаточно. Я добивался этого раньше, используя netcat (echo Hello | nc -l PORT), но это не сработало. Изменение его на использование TCP привело к тому, что он появился в сервисе, но, возможно, не сработал. Я только что создал небольшой экземпляр, и как только я установил httpd и получил ответ в виде правильного файла html (HTTP-ответ), все заработало! :) Спасибо вам всем. В понедельник я проверю, что это проблема (черт возьми, вы хотите написать это в форме ответа, чтобы я мог поставить галочку, если да :))   -  person Svend Hansen    schedule 25.02.2012
comment
После дополнительных проверок я могу подтвердить, что проблема в том, что проверка работоспособности имеет неправильный формат. Я не совсем уверен, что требуется, но могу сказать вот что: использование пустого ответа 200 от моего сервера tomcat, запущенного на экземпляре, не работает, но установка httpd и возврат статического (даже пустого) ) html файл работает. Я смотрел заголовки ответов, и единственное, что я могу придумать, это то, что у tomcat отсутствует тип содержимого ...   -  person Svend Hansen    schedule 27.02.2012
comment
Похоже, это то, что вы могли бы предложить на форумах Amazon. Один из сотрудников Amazon, вероятно, сможет дать вам хороший ответ, если вы представите факты, которые мы здесь собрали. Обычно они очень полезны, если это не просто OMG, балансировщик нагрузки не работает!   -  person bwight    schedule 27.02.2012


Ответы (2)


Похоже, у вас все настроено правильно. Это те же порты, которые входят в балансировщик нагрузки, что и экземпляр? Или вы пересылаете запрос на другой порт?

В качестве побочного примечания, когда я настраиваю свои балансировщики нагрузки, я обычно не люблю открывать свои экземпляры на любом порту для широкой публики. Я разрешаю балансировщику нагрузки делать запросы только этим экземплярам. В прошлом я заметил, что многие люди будут делать злонамеренные запросы к 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

Вернемся к вашему вопросу. Как я уже сказал, шаги, которые вы объяснили, верны, открытия порта на экземпляре и перенаправления порта на экземпляр должно быть достаточно. Возможно, вам нужно опубликовать полную конфигурацию группы безопасности вашего экземпляра и балансировщика нагрузки, чтобы я мог увидеть, влияет ли что-то еще на вашу ситуацию.

person bwight    schedule 24.02.2012
comment
Я не смог воспроизвести твои ошибки. Я попробовал ту же настройку, что и вы, с теми же портами, и, похоже, все работает нормально. Потребовалось несколько минут, чтобы балансировщик начал работать. - person bwight; 24.02.2012
comment
Хм. Конечно, я только что прочитал, что вы сказали, что видели ту же проблему: P ... Я настроил экземпляры, группы безопасности и балансировщик нагрузки, используя java api. Я попробую настроить его через веб-интерфейс, чтобы посмотреть, есть ли разница ... - person Svend Hansen; 24.02.2012
comment
Я увидел ту же проблему, но через минуту она, похоже, сработала. Я думаю, что экземпляр все еще не был активен в балансировщике нагрузки, когда я попробовал в первый раз. - person bwight; 24.02.2012
comment
Знаете ли вы, как ограничить подключение к определенному эластичному балансировщику нагрузки. Кажется, это позволяет получить доступ к любому балансировщику нагрузки. - person Bill Rosmus; 07.03.2013
comment
Насколько я понимаю, только ELB внутри VPC могут быть запущены с настраиваемой группой безопасности. docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/ а> - person bwight; 09.03.2013

Я пошел дальше и создал сценарий, который будет точно воспроизводить те же шаги, что и я. Это предполагает, что вы используете Linux в качестве операционной системы и что инструменты AWS CLI уже установлены. Если у вас еще нет этой настройки, я рекомендую запустить новый микро-экземпляр Amazon Linux и запустить сценарий оттуда, поскольку у них все уже установлено.

  1. Загрузите файлы сертификатов X.509 с сайта amazon https://aws-portal.amazon.com/gp/aws/securityCredentials

  2. Скопируйте файлы сертификата на машину, где вы будете запускать команды

  3. Сохраните две переменные, которые требуются в скрипте

    aws_account=<aws account id>
    keypair="<key pair name>"
    
  4. Экспорт сертификатов как переменных среды

    export EC2_PRIVATE_KEY=<private_Key_file>
    export EC2_CERT=<cert_file>
    export EC2_URL=https://ec2.us-east-1.amazonaws.com
    
  5. Создайте группы безопасности

    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. Запустите новый экземпляр и сохраните 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 }'`
    
  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 не станет "InService", и попробуйте получить доступ к URL-адресам.
person bwight    schedule 24.02.2012