Используйте один AWS Elasti c IP для нескольких экземпляров. - PullRequest
0 голосов
/ 29 января 2020

Мне нужно предоставить своим клиентам фиксированные URL-адреса, которые не меняются, когда экземпляры EC2 останавливаются / запускаются, потому что иногда нам нужно изменить размер EC2, а когда мы перезапускаем экземпляр, изменился IP-адрес publi c. .

Я думал об использовании IP-адресов Elasti c, чтобы при перезапуске экземпляра можно было сохранить тот же IP-адрес c, но я видел, что Amazon сообщает вам, что у вас есть только 5 Elasti c IP-адреса. Если вы спросите их, они скажут, что могут дать вам больше, но я думаю, что они не дадут вам 10.000 из них.

Как я могу использовать один публичный c Elasti c IP, чтобы дать каждому Пользователь разные URL для нашего сервиса?

Это было бы что-то вроде этого, будучи 11.22.33.44 Elasti c IP и 192.168.0.X two EC2 instances:

11.22.33.44:**1000** --> 192.168.0.**1**:22
11.22.33.44:**1001** --> 192.168.0.**1**:80
11.22.33.44:**1002** --> 192.168.0.**1**:443

11.22.33.44:**1003** --> 192.168.0.**2**:22
11.22.33.44:**1004** --> 192.168.0.**2**:80
11.22.33.44:**1005** --> 192.168.0.**2**:443

Мне нужно, чтобы это работало программно, так как я создаю экземпляры EC2 из SDK по мере необходимости.

Еще один способ, которым я думал, - это использование поддоменов из моего домена .com, который указывает на текущий общедоступный c IP каждого экземпляра EC2, но с использованием IP, как я описал ранее, звучит лучше.

1 Ответ

0 голосов
/ 30 января 2020

Проблема заключается в том, что экземпляры получают новые (временные) IP-адреса Publi c после их остановки и запуска.

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

Сценарий должен go перейти в каталог /var/lib/cloud/scripts/per-boot, что заставит Cloud-Init автоматически запустить сценарий каждый раз, когда запускается экземпляр.

# Set these values based on your Route 53 Record Sets
ZONE_ID=Z3NAOAOAABC1XY
RECORD_SET=my-domain.com

# Extract information about the Instance
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/)
MY_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4/)

# Extract Name tag associated with instance
NAME_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`Name`].Value' --output text)

# Update Route 53 Record Set based on the Name tag to the current Public IP address of the Instance
aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"'$NAME_TAG.$RECORD_SET'","Type":"A","TTL":300,"ResourceRecords":[{"Value":"'$MY_IP'"}]}}]}'

Сценарий извлекает тег Name экземпляра и обновляет соответствующий набор записей на маршруте 53. (Не стесняйтесь изменять его, чтобы использовать другой тег. ) Для экземпляра также потребуются разрешения IAM для ec2 describe-tags и route53 change-resource-record-sets.

Обновление: Я превратил этот ответ в сообщение в блоге: Amazon Route 53: Как для автоматического обновления IP-адресов без использования Elasti c IPs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...