В первой части статьи я описал создание учётной записи на 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...