Доступ к экземплярам AWS EC2 через ELB

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

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

Http://[publicdns]: PORT/

Балансировщик нагрузки содержит два экземпляра, и они оба являются "In Service", и он пересылает порт (PORT) в один и тот же порт в экземплярах.

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

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

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

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

Я уверен, что там что-то простое и глупое, что я забыл, не понял или сделал не так: P

Cheers, Свен.


Дополнительная информация добавлена:

Конфигурация порта для балансировки нагрузки выглядит так (фактически 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/, но балансировщик нагрузки говорил, что экземпляры были "Out of Service", хотя я, кажется, получаю ответ 200 на запрос на этом порту.

Затем я изменил его на TCP: PORT, а затем изменил, чтобы сказать, что они были "In Service".

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

Ответ 1

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

В качестве побочного примечания, когда я настраиваю свои loadbalancers, мне обычно не нравится открывать свои экземпляры на любом порту для широкой публики. Я только разрешаю loadbalancer делать запросы к этим экземплярам. В прошлом я заметил, что многие люди будут делать вредоносные запросы на IP-адрес экземпляра, пытаясь найти нарушение безопасности. Я даже видел, как люди пытались подключиться к моим машинам Windows...

Чтобы создать правило безопасности только для балансировщика нагрузки, выполните следующие команды и удалите любые другие правила, которые у вас есть в группе безопасности для порта, который использует loadbalancer. Если вы не используете командную строку для запуска этих команд, просто сообщите мне, какой интерфейс вы пытаетесь использовать, и я могу попытаться найти образец, который будет работать для вас.

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

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

Ответ 2

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

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

  • Скопируйте файлы сертификатов на компьютер, на котором будут выполняться команды

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

    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=`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 }'`
    
  • Создайте loadbalancer и прикрепите экземпляр

    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-адресам