Ответ 1
В конце концов я решил пропустить сценарии ubuntu ec2 и сделать что-то подобное. Я изучил использование сервиса Amazon Route53 в качестве службы имен, и было действительно легко получить его и запустить.
Использование Route53
Вот что я сделал; Во-первых, я использовал инструменты IAM для создания пользовательского маршрута53 с либеральными политическими разрешениями для взаимодействия с сервисом 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 script символически связан в /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
Теперь остается установить script для автоматического выполнения этого при загрузке машины. Это решение и следующие script обязаны огромному долгу для Marius Ducea отличного учебника, найденного здесь.
В основном он выполняет то же самое, что и настройка Marius, но использует Route53 вместо Bind.
script использует простые службы на основе REST, доступные для каждого экземпляра EC2 в
http://169.254.169.254
для получения фактического открытого DNS-имени и захвата требуемого имени хоста из экземпляра. Имя хоста передается экземпляру с использованием настраиваемых "пользовательских данных", которые мы можем указать при запуске экземпляра. script ожидает пользовательские данные в формате
hostname=test2
script будет
- захватить имя хоста из пользовательских данных экземпляра
- захватить общедоступное 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
Чтобы запустить script во время загрузки, добавьте строку в /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, который вы можете использовать для создания других экземпляров с теми же способностями автошоунга.
НТН