Использование сценариев ec2-init с Ubuntu в EC2 - автоматическая установка имени хоста и регистрация в Route53 - PullRequest
12 голосов
/ 03 марта 2011

Мне бы очень хотелось иметь возможность использовать сценарии ec2-init для ведения домашнего хозяйства, когда я запускаю экземпляр. В идеале я хотел бы иметь возможность передавать пользовательские данные для установки имени хоста и запускать несколько сценариев инициализации (для настройки puppet и т. Д.).

Я вижу скрипт с именем ec2-set-hostname, но я не уверен, что вы можете использовать его для установки произвольного имени хоста из пользовательских данных или в каком формате эти пользовательские данные должны быть.

Кто-нибудь использовал эти сценарии и знает, как, если можно установить имя хоста и запустить несколько сценариев одновременно?

Заранее спасибо.

Ответы [ 4 ]

16 голосов
/ 28 марта 2011

В конце концов я решил пропустить сценарии 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, которую можно использовать для создания других экземпляров с теми же возможностями автоматического присвоения имен.

НТН

2 голосов
/ 30 декабря 2011

Я установил gem route53 и написал небольшой скрипт:

gem install route53

#!/bin/bash
DATE=`date +%Y%m%d%H%M%S`
export HOME=/root
export DEBIAN_FRONTEND=noninteractive
export PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/aws/bin    /usr/local/node:$PATH
export JAVA_HOME=/usr/java/current
export EC2_HOME=/usr/local/aws
export EC2_PRIVATE_KEY=/root/.ec2/pk-XXXXXXXXXXXXXXXXXXXXXXX
export EC2_CERT=/root/.ec2/cert-XXXXXXXXXXXXXXXXXXXX
export EC2_INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
echo "$EC2_INSTANCE_ID"
mkdir  /root/$EC2_INSTANCE_ID
ec2din $EC2_INSTANCE_ID > /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt
export FQDN=`cat /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt |grep Name |awk '{print $5}'`
export EC2_DNS_NAME=`cat /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt |grep INSTANCE |awk '{print $4}'`
/usr/bin/ruby1.8 /usr/bin/route53 -g -z /hostedzone/XXXXXXXX --name $FQDN. --type CNAME --ttl 60 --values $EC2_DNS_NAME > /tmp/route53.out 2>&1

-Josh

0 голосов
/ 29 апреля 2015

Ссылка, указанная в предыдущем ответе, больше не доступна.Но он все еще доступен на Wayback Machine: http://web.archive.org/web/20140709022644/http://www.practicalclouds.com/content/blog/1/dave-mccormick/2012-02-28/route53-bring-back-some-dns-lovin-ec2

0 голосов
/ 29 февраля 2012

Я применил аналогичный подход к 'sgargan', который позволяет экземпляру создавать свою собственную запись DNS в Route 53, но вместо этого я использовал библиотеку phython AWS 'boto' и настроил 'systemd' (замена init / upstart, выпущенная в Fedora 15/16) для удаления записи dns при выключении хоста.

Пожалуйста, ознакомьтесь со следующим пошаговым описанием того, как это сделать: -

http://www.practicalclouds.com/content/blog/1/dave-mccormick/2012-02-28/using-route53-bring-back-some-dns-lovin-your-cloud

Хотя это не идеальное представление ваших внутренних ips во внешнем файле зоны DNS, до тех пор, пока Amazon не создаст внутреннюю службу DNS, тогда я думаю, что это предпочтительнее, чем запускать ваши собственные экземпляры BIND.

...