В первой части статьи я описал создание учётной записи на Amazon Web Services. Сейчас же приступим к реальной работе. Весь процесс работы отлично описан в официальном документе ”Amazon Elastic Compute Cloud. Getting Started Guide”, очень рекомендую с ним ознакомиться.
Создавал в последний раз сервера три дня назад. Сегодня же, уставившись на консоль, почувствовал себя как себя как герой рассказа ”Цветы для Элджернона“… Ладно, прорвёмся.
Создание сертификата X.509
Заходим на ”Amazon Web Services”, “Your Account”, “Security Credentials”.
Если вы зашли сюда через некоторое время после последнего входа, то система попросит аутентифицироваться:
Переходим на X.509 и создаём сертификат:
Сохраняем файлы с приватным и публичным ключами в надёжное место (это Downloads ;-):
Созданный сертификат уже есть в системе:
Из надёжного места нужно скопировать сертификат в каталог ~/.ec2 - этот каталог используется утилитами AWS EC2.
$ cd ~ $ mkdir .ec2 $ mv ~/Downloads/{cert*pem,pk*pem} ~/.ec2 $ chmod 700 .ec2 $ chmod 600 .ec2/*pem $ ls -al ~/.ec2 drwx------ 4 ctrld staff 136 Nov 13 15:24 . drwxr-xr-x+ 43 ctrld staff 1462 Nov 13 15:24 .. -rw-------@ 1 ctrld staff 916 Nov 13 15:18 cert-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pem -rw-------@ 1 ctrld staff 922 Nov 13 15:18 pk-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pem
Установка утилит для работы EC2
В руководстве пользователя можно найти, где находятся утилиты для EC2. Если лень смотреть, то они доступны по адресу ”Amazon EC2 API Tools”:
Архив ec2-api-tools.zip я распаковал в Documents/AWS, и сделал симлинк на случай обновления:
$ cd ~/Documents/AWS/ $ ln -s ec2-api-tools-1.3-42584 ec2-api-tools
Настройка окружения в shell
Для работы с EC2 нужно настроить переменные окружения. Вот фрагмент моего ~/.profile (спасибо @andy_shev за конструкцию ‘$(/usr/libexec/java_home)’, я обычно пользовался ‘`command`’, но так гораздо удобнее):
export JAVA_HOME=$(/usr/libexec/java_home) export EC2_HOME=/Users/ctrld/Documents/AWS/ec2-api-tools export PATH=$PATH:$EC2_HOME/bin export EC2_PRIVATE_KEY=~/.ec2/pk-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pem export EC2_CERT=~/.ec2/cert-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pem export EC2_URL=https://eu-west-1.ec2.amazonaws.com
Для того, чтобы переменные окружения установились, можно или создать новую сессию в Terminal.app, а старую закрыть, или же воспользоваться “source”:
$ . ~/.profile
Обратите внимание на последнюю строку в фрагменте .profile. Я использую регион EU-WEST (второй вариант ориентирован на USA - US-EAST, меня он не интересует). Получить список доступных регионов можно так:
$ ec2-describe-regions REGION eu-west-1 eu-west-1.ec2.amazonaws.com REGION us-east-1 us-east-1.ec2.amazonaws.com
Конечно же, в переменных $EC2_PRIVATE_KEY и $EC2_CERT нужно указать ваши сертификаты X.509 - мои вам не пригодятся, и путь тоже стоит поменять на ваш (то, что нужно поменять, выделено жирным).
Создание ключа для доступа по SSH
Процесс можно посмотреть в ”User guide”.
Создаём ключи для доступа по SSH. Это можно сделать в браузере через AWS Management Console, я же предпочитаю консоль. Лучше при работе с EC2 перейти сразу в каталог ~/.ec2 - это упрощает некоторые операции.
$ ec2-add-keypair gsg-keypair KEYPAIR gsg-keypair 7d:b5:85:0c:7d:5d:fd:bf:b4:8c:3e:d6:b5:bd:7f:08:71:d2:c1:9d -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEArTGhs3XCfhkxpfos8Wd8F3HXCGd/aVK5boOafptNVcTeP6afDyY7V9CoExK4 ... cnidqNgk7bFPkKGR6mMB9l8AZelzMJljLCKBiDstj3uEW9C0t13nAo0mdgMZsJSF75ja -----END RSA PRIVATE KEY-----
Записываем ключ (включая строки “—-BEGIN…” и “—–END…”) в файл ~/.ec2/id_rsa-gsg-keypair:
$ cd ~/.ec2 $ cat id_rsa-gsg-keypair -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEArTGhs3XCfhkxpfos8Wd8F3HXCGd/aVK5boOafptNVcTeP6afDyY7V9CoExK4 ... cnidqNgk7bFPkKGR6mMB9l8AZelzMJljLCKBiDstj3uEW9C0t13nAo0mdgMZsJSF75ja -----END RSA PRIVATE KEY----- $ chmod 600 id_rsa-gsg-keypair
Разрешение сетевого доступа
Политика безопасности “default” запрещает какой-либо доступ к Instance. Для того, чтобы получить доступ к сервисам на сервере, нужно открыть по крайней мере http (для всех) и ssh (для хоста, с которого будет производиться доступ). К сожалению, у меня динамический адрес, и я для во время написания статьи открою ssh для всех адресов (а потом закрою).
$ ec2-authorize default -p 80 GROUP default PERMISSION default ALLOWS tcp 80 80 FROM CIDR 0.0.0.0/0 $ ec2-authorize default -p 22 GROUP default PERMISSION default ALLOWS tcp 22 22 FROM CIDR 0.0.0.0/0
Запуск Instance
Я буду работать с Ubuntu 9.04 Server 32 bit. 32 bit - ограничение Small Instance, так бы я использовал 64 bit. 9.04 по причине LTS (Long Term Support). Ну а Ubuntu - из-за того, что xfs работает нормально под EC2.
Образы серверов в терминах Amazon - это AMI (Amazon Machine Images). На основании AMI запускается Instance. Грубо говоря AMI - это образ на диске, а Instance - это операционная система, запущенная из этого образа. При остановке Instance все изменения теряются, поэтому нужно брать готовые AMI, запускать на их основании Instance, ставить нужные пакеты, настраивать их, а затем создавать свой AMI, и уже дальше стартовать с него. Для долгосрочного хранения данных используется ”Elastic Block Storage”. AMI доступны по AMI ID.
AMI Ubuntu 9.04 описан на сайте Amazon: ”Ubuntu 9.04 Jaunty Server”. Создатель - Alestic.com. Эти образы можно посмотреть на сайте. Обратите внимание, что нужно смотреть свой регион (Europe):
Итак, AMI ID Ubuntu 9.04 Jaunty server 32 bit - ami-605b7014. Для гарантии существования проверяю:
$ cd ~/.ec2 $ ec2-describe-images ami-605b7014 IMAGE ami-605b7014 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20091011.manifest.xml 063491364108 available public i386 machine aki-02486376 ari-fa4d668e
Можно также находить AMI так:
$ ec2-describe-images --all | grep -i 9.04 IMAGE ami-98032bec alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20081222.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-22103856 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090215.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-f6e1c982 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090313.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-dcfcd4a8 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090329.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-36cde542 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090418.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-48cfe73c alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090423.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-0db89079 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090614.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-6686ae12 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20090804.manifest.xml 063491364108 available public i386 machine aki-7e0d250a ari-7d0d2509 IMAGE ami-605b7014 alestic-32-eu-west-1/ubuntu-9.04-jaunty-base-20091011.manifest.xml 063491364108 available public i386 machine aki-02486376 ari-fa4d668e
Запускаем Instance на базе нужного AMI с использованием ранее созданного ключа id_rsa-gsg-keypair:
$ ec2-run-instances ami-605b7014 -k gsg-keypair RESERVATION r-02ab4575 042588059738 default INSTANCE i-e803f59f ami-605b7014 pending gsg-keypair 0 m1.small 2009-11-13T14:47:46+0000 eu-west-1a aki-02486376 ari-fa4d668e monitoring-disabled
Обратить внимание нужно на параметры:
- i-e803f59f - Instance ID, идентификатор запущенного сервера
- pending - ожидает запуска, обычно нужно около 15-60 секунд на запуск
- m1.small - тип Instance, small
- eu-west-1a - регион, также есть eu-west-1b. Важно обращать внимание при создании Elastic Block Store, но об этом в следующей части
Проверить статус запуска можно командой (Instance ID нужно подставить из предыдущей команды):
$ ec2-describe-instances i-e803f59f RESERVATION r-02ab4575 042588059738 default INSTANCE i-e803f59f ami-605b7014 ec2-79-125-56-187.eu-west-1.compute.amazonaws.com ip-10-227-53-194.eu-west-1.compute.internal running gsg-keypair 0 m1.small 2009-11-13T14:47:46+0000 eu-west-1a aki-02486376 ari-fa4d668e monitoring-disabled 79.125.56.187 10.227.53.194
- ec2-79-125-56-187.eu-west-1.compute.amazonaws.com - внешний адрес Instance, доступный через Интернет. Назначить постоянный адрес можно через ”Elastic IP”, об этом тоже поговорим в другой части
- running - сервер запущен
- 79.125.56.187 - внешний адрес
- 10.227.53.194 - внутренний адрес, который транслируется во внешний для выхода в Интернет
Процесс загрузки виден в консольном выводе (да, это Xen)
$ ec2-get-console-output i-e803f59f Linux version 2.6.21.7-2.fc8xen-ec2-v1.0 (root@domU-12-31-39-06-50-93) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #2 SMP Tue Sep 1 10:04:29 EDT 2009 ... CPU 0 irqstacks, hard=c136c000 soft=c134c000 Xen reported: 2666.762 MHz processor. ... ec2: -----BEGIN SSH HOST KEY FINGERPRINTS----- /etc/ssh/ssh_host_key.pub: No such file or directory ec2: 2048 b2:14:33:14:79:14:b8:94:5d:35:78:c8:a2:6c:93:2c /etc/ssh/ssh_host_rsa_key.pub (RSA) ec2: 1024 d9:e9:9d:33:d6:25:42:6d:08:e9:ff:0f:a5:e7:09:af /etc/ssh/ssh_host_dsa_key.pub (DSA) ec2: -----END SSH HOST KEY FINGERPRINTS-----
Instance запущен, доступ по ssh мы открыли ранее, теперь можно зайти на сервер (ставим свой внешний адрес). Аутентификация - по публичному ключу RSA. В Amazon повёрнуты на безопасности, поэтому они даже рекомендуют отслеживать возможность атаки “man-on-the-middle” путём проверки fingerprints при входе по ssh. Поэтому стоит сравнить RSA-fingerprint, который мы видели в выводе ec2-get-console-output с тем, который отобразится при попытке входа, и только если они совпадают, то входить, написав “yes”:
$ ssh -i id_rsa-gsg-keypair root@ec2-79-125-56-187.eu-west-1.compute.amazonaws.com The authenticity of host 'ec2-79-125-56-187.eu-west-1.compute.amazonaws.com (79.125.56.187)' can't be established. RSA key fingerprint is b2:14:33:14:79:14:b8:94:5d:35:78:c8:a2:6c:93:2c. Are you sure you want to continue connecting (yes/no)? yes
Вуаля, мы зашли в сервер:
Linux ip-10-227-53-194 2.6.21.7-2.fc8xen-ec2-v1.0 #2 SMP Tue Sep 1 10:04:29 EDT 2009 i686 ... Amazon EC2 Ubuntu 9.04 jaunty AMI built by Eric Hammond http://alestic.com http://ec2ubuntu-group.notlong.com root@ip-10-227-53-194:~#
Дальше нужно установить и настроить софт, после чего сделать свой AMI. Об этом - в следующей части статьи. Пока можно поиграться с сервером, помня, что ни одна настройка не сохранится после останова.
Остановка Instance
Оплата в AWS почасовая, что мобилизирует. Когда закончите развлечения с этим Instance, то, чтобы не опустошать кошелёк, нужно остановить Instance. Запустить ранее остановленный Instance нельзя.
Остановить можно или из самого Instance привычным “shutdown -h now” (-h очень важно, если его не указать, то сервер перейдёт в Single User Mode и деньги будут сниматься). Или же выйти из сервера и остановить его командой ec2-terminate-instances.
Получаем список запущенных Instance (кстати, стоит то же самое проверить и при “shutdown -h now”):
$ ec2-describe-instances RESERVATION r-02ab4575 042588059738 default INSTANCE i-e803f59f ami-605b7014 ec2-79-125-56-187.eu-west-1.compute.amazonaws.com ip-10-227-53-194.eu-west-1.compute.internal running gsg-keypair 0 m1.small 2009-11-13T14:47:46+0000 eu-west-1a aki-02486376 ari-fa4d668e monitoring-disabled 79.125.56.187 10.227.53.194
Останавливаем Instance (конечно же, подставляем свой instance id)
$ ec2-terminate-instances i-e803f59f INSTANCE i-e803f59f running shutting-down
Через секунд 20 проверям, остановился ли Instance:
$ ec2-describe-instances RESERVATION r-02ab4575 042588059738 default INSTANCE i-e803f59f ami-605b7014 terminated gsg-keypair 0 m1.small 2009-11-13T14:47:46+0000 aki-02486376 ari-fa4d668e monitoring-disabled
Terminated - всё в порядке.
Кстати, для получения краткой справки по команде EC2 можно использовать ключ “-h”:
$ ec2-terminate-instances -h SYNOPSIS ec2kill ([ec2-terminate-instances]) ec2kill [GENERAL OPTIONS] INSTANCE [INSTANCE [...]] GENERAL NOTES Any command option/parameter may be passed a value of '-' to indicate that values for that option should be read from stdin. DESCRIPTION Terminate selected running instances. The INSTANCE parameter is an instance ID to terminate. GENERAL OPTIONS -K, --private-key KEY Specify KEY as the private key to use. Defaults to the value of the EC2_PRIVATE_KEY environment variable (if set). Overrides the default. ...
Деньги
Выставленные платежи можно посмотреть на странице Amazon Web Services в “Your Account”/”Account Activity”:
Но нужно дождаться завершения полного часа, у меня все сервисы по нулям:
По моей второй учётной записи, в которой я делал похожие эксперименты, статистика такая:
Итог
В этой части мы запустили свой Instance. Операционную систему можно выбирать на свой вкус, есть даже Windows, я видел Server2003r2-i386 и Server2003r2-x86_64. Mac OS X, конечно же, нет.
Как вы видите, AWS не настолько тривиален, как хотелось бы, но для нормального IT-спеца вполне подъёмен.
To be continued…