The Apple Geek

Чему ты научился сегодня?

Amazon Web Services. Часть 2. Запуск сервера

В первой части статьи я описал создание учётной записи на 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 ~/.ec2drwx------   4 ctrld  staff   136 Nov 13 15:24 .drwxr-xr-x+ 43 ctrld  staff  1462 Nov 13 15:24 [email protected]  1 ctrld  staff   916 Nov 13 15:18 [email protected]  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-toolsexport PATH=$PATH:$EC2_HOME/binexport EC2_PRIVATE_KEY=~/.ec2/pk-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pemexport EC2_CERT=~/.ec2/cert-R3A4BRDL7YPWEYAQKUF2GK2HWYPBIWDM.pemexport 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.comREGION  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-keypairKEYPAIR 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 80GROUP        default PERMISSION      default ALLOWS  tcp 80  80  FROM    CIDR    0.0.0.0/0$ ec2-authorize default -p 22GROUP        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: ””. Создатель - . Эти образы можно посмотреть на сайте. Обратите внимание, что нужно смотреть свой регион (Europe):

Итак, AMI ID Ubuntu 9.04 Jaunty server 32 bit - ami-605b7014. Для гарантии существования проверяю:

$ cd ~/.ec2$ ec2-describe-images ami-605b7014IMAGE    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.04IMAGE    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-keypairRESERVATION  r-02ab4575  042588059738    defaultINSTANCE    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-e803f59fRESERVATION  r-02ab4575  042588059738    defaultINSTANCE    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-e803f59fLinux version 2.6.21.7-2.fc8xen-ec2-v1.0 ([email protected]) (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=c134c000Xen reported: 2666.762 MHz processor....ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----/etc/ssh/ssh_host_key.pub: No such file or directoryec2: 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 [email protected]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 Hammondhttp://alestic.com  http://[email protected]:~# 

Дальше нужно установить и настроить софт, после чего сделать свой AMI. Об этом - в следующей части статьи. Пока можно поиграться с сервером, помня, что ни одна настройка не сохранится после останова.

Остановка Instance

Оплата в AWS почасовая, что мобилизирует. Когда закончите развлечения с этим Instance, то, чтобы не опустошать кошелёк, нужно остановить Instance. Запустить ранее остановленный Instance нельзя.

Остановить можно или из самого Instance привычным “shutdown -h now” (-h очень важно, если его не указать, то сервер перейдёт в Single User Mode и деньги будут сниматься). Или же выйти из сервера и остановить его командой ec2-terminate-instances.

Получаем список запущенных Instance (кстати, стоит то же самое проверить и при “shutdown -h now”):

$ ec2-describe-instancesRESERVATION  r-02ab4575  042588059738    defaultINSTANCE    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-e803f59fINSTANCE i-e803f59f  running shutting-down

Через секунд 20 проверям, остановился ли Instance:

$ ec2-describe-instancesRESERVATION  r-02ab4575  042588059738    defaultINSTANCE    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…


Comments