Подтвердить что ты не робот

Использование сценариев ec2-init с Ubuntu на EC2 - Автоматическое определение имени хоста и регистрация с помощью Route53

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

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

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

Спасибо заранее.

4b9b3361

Ответ 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 отличного учебника, найденного здесь.

http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/

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

НТН

Ответ 2

Я установил драгоценный камень route53 и написал немного script:

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

Ответ 3

Я применил аналогичный подход к "sgargan", который позволяет экземпляру создать собственную запись DNS в Route 53, но вместо этого я использовал библиотеку AWS phython "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.