Доступ к экземплярам 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-адресам