В конце концов я решил пропустить сценарии ubuntu ec2 и сделать что-то подобное. Я рассмотрел использование сервиса Amazon Route53 в качестве службы имен, и его было действительно легко запустить и запустить.
Использование Route53
Вот что я сделал; Во-первых, я использовал инструменты IAM , чтобы создать пользователя 'route53' с разрешениями либеральной политики для взаимодействия со службой Route53
Создать группу DNS и пользователя
iam-groupcreate -g route53 -v
iam-usercreate -u route53 -g route53
Создайте ключи для пользователя и запишите их на потом
iam-useraddkey -u route53
Предоставить доступ к группе для добавления зон и DNS-записей
iam-grouplistpolicies -g route53
iam-groupaddpolicy -p hostedzone -e Allow -g route53 -a route53:* -r '*'
список пользователей и политик для группы
iam-grouplistusers -g route53
iam-grouplistpolicies -g route53
iam-grouplistpolicies -g route53 -p hostedzone
Для добавления и удаления записей записей DNS я использую отличную библиотеку оболочки Python для Route53, cli53. Это избавляет от боли при использовании route53. Вы можете взять его отсюда
https://github.com/barnybug/cli53
В моем случае скрипт python имеет символическую ссылку в / usr / bin как cli53. Вам необходимо установить следующие переменные среды, содержащие ключи, созданные ранее для пользователя route53.
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXX
Затем необходимо создать запись зоны для вашего домена, например, simple.org
cli53.py create simple.org
Это должно вернуть вам адрес сервера имен amazon, который вы можете связать с вашим доменным именем через регистратора доменных имен, так что поиск имени хоста для домена будет перенаправлен на серверы Route53.
Как только зона настроена, добавление и удаление записей в ней просто, например
cli53 rrcreate simple.org hostname CNAME ec2-184-73-137-40.compute-1.amazonaws.com
cli53 rrdelete simple.org hostname
Мы используем запись CNAME с публичным DNS-именем экземпляра ec2, так как это имя хоста будет преобразовываться в публичный IP-адрес извне и частный IP-адрес из EC2. Далее добавляется запись для хоста «test2.simple.org».
cli53 rrcreate simple.org test2 CNAME ec2-184-73-137-40.compute-1.amazonaws.com --ttl 60 --replace
Автоматически установить имя хоста и обновить Route53
Теперь осталось настроить скрипт для автоматического выполнения этого при загрузке машины. Это решение и следующий скрипт обязаны огромному долгу перед прекрасным учебником Мариуса Дучеа, который можно найти здесь
http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/
Он в основном делает то же самое, что и установка Мариуса, но использует Route53 вместо Bind.
Сценарий использует простые службы на основе REST, доступные для каждого экземпляра EC2 на
http://169.254.169.254
для получения фактического публичного DNS-имени и получения нужного имени хоста из экземпляра. Имя хоста передается экземпляру с помощью настраиваемых «пользовательских данных», которые мы можем указать при запуске экземпляра. Скрипт ожидает пользовательских данных в формате
hostname=test2
Сценарий будет
- получить информацию об имени хоста из пользовательских данных экземпляра
- получить общедоступное DNS-имя из метаданных экземпляра
- разобрать имя хоста
- установить в качестве имени хоста полное имя, например test2.simple.org
- Добавьте запись CNAME для этого полного доменного имени в точке Route53 к общедоступному DNS-имени
- записать запись в Сообщения дня, чтобы пользователи могли видеть отображение домена в ec2 при входе в систему
Скопируйте и сохраните следующее как /usr/bin/autohostname.sh
#!/bin/bash
DOMAIN=simple.org
USER_DATA=`/usr/bin/curl -s http://169.254.169.254/latest/user-data`
EC2_PUBLIC=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-hostname`
HOSTNAME=`echo $USER_DATA| cut -d = -f 2`
#set also the hostname to the running instance
FQDN=$HOSTNAME.$DOMAIN
hostname $FQDN
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxxxx
# Update Route53 with a CNAME record pointing the hostname to the EC2 public DNS name
# in this way it will resolve correctly to the private ip internally to ec2 and
# the public ip externally
RESULT=`/root/dns/cli53/cli53.py rrcreate $DOMAIN $HOSTNAME CNAME $EC2_PUBLIC --ttl 60 --replace`
logger "Created Route53 record with the result $RESULT"
# write an MOTD file so that the hostname is displayed on login
MESSAGE="Instance has been registered with the Route53 nameservers as '$FQDN' pointing to ec2 domain name '$EC2_PUBLIC'"
logger $MESSAGE
cat<<EOF > /etc/update-motd.d/40-autohostname
#!/bin/bash
# auto generated on boot by /root/bin/auto_hostname.sh via rc.local
echo "$MESSAGE"
EOF
chmod +x /etc/update-motd.d/40-autohostname
exit 0
Чтобы скрипт запускался во время загрузки, мы добавляем строку в /etc/rc.local, например:
/usr/bin/autohostname.sh
Измените пользовательские данные для экземпляра теста на 'hostname = test2' и перезагрузите экземпляр. Как только он перезагрузится, вы сможете войти в него через test2.simple.org. Это может занять несколько минут для правильного разрешения, в зависимости от указанных вами TTL. При входе в систему вы должны увидеть сообщение MOTD, сообщающее вам
Экземпляр зарегистрирован на серверах имен Route53 как 'test2.simple.org', указывающий на доменное имя ec2 'ec2-184-73-137-40.compute-1.amazonaws.com'
После того, как вы настроите этот экземпляр на работу с тестовым экземпляром, имеет смысл сделать его резервную копию в виде AMI, которую можно использовать для создания других экземпляров с теми же возможностями автоматического присвоения имен.
НТН