EC2
Amazon EC2
Введение
Для работы нужно РПМки поставить: (yum, epel от амазона.)
# rpm -qa | grep aws aws-apitools-ec2-1.6.3.0-1.0.amzn1.noarch aws-scripts-ses-2012.07.09-1.0.amzn1.noarch aws-apitools-iam-1.5.0-1.2.amzn1.noarch aws-apitools-elb-1.0.17.0-1.4.amzn1.noarch aws-cfn-bootstrap-1.3-6.amzn1.noarch aws-amitools-ec2-1.4.0.7-1.4.amzn1.noarch aws-apitools-common-1.1.0-1.7.amzn1.noarch aws-apitools-as-1.0.61.1-1.0.amzn1.noarch aws-apitools-rds-1.10.002-1.1.amzn1.noarch aws-apitools-mon-1.0.13.4-1.0.amzn1.noarch
в ~/.bashrc (у меня под рутом)
export EC2_PRIVATE_KEY=$HOME/keys/nocrypt-ec2-key.pem export EC2_CERT=$HOME/keys/ec2_cert.pem export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/
ключи ec2-key - см. ниже (в моем случае они УЖЕ были сгенерированы)
Создание X.509 сертификата для аутентификации в Amazon AWS
- Идем в http://aws.amazon.com/account/
- Выбираем вкладку «Security Credentials»
- Проходим аутентификацию (email и пароль)
- Под заголовком «Access Credentials» выбираем вкладку «X.509 Certificates»
- Нажимаем кнопку/ссылку «Create a new Certificate»
- В открывшемся окне загружаем приватный ключ и сертификат. Обратите внимание что Amazon не хранит секретный ключ, поэтому скачать его надо здесь и сейчас.
Создание пары AWS Access ID и AWS Secret key аутентификации в Amazon AWS
- Идем в http://aws.amazon.com/account/
- Выбираем вкладку «Security Credentials»
- Проходим аутентификацию (email и пароль)
- Под заголовком «Access Credentials» выбираем вкладку «Access Keys»
- Нажимаем кнопку/ссылку «Create a new Access Key»
- В открывшемся окне загружаем access key и secret access key. Обратите внимание что Amazon не хранит секретный ключ, поэтому скачать его надо здесь и сейчас.
Внимание! нужно преобразовать ключ - с оригинальным работают не все утилиты!!!!
openssl pkcs8 -topk8 -in ec2-key.pem -nocrypt > nocrypt-ec2-key.pem
ssh keys
После подключения сертефикатов - начинают работать ec2-утилиты Например:
Просмотр ключей
#ec2-describe-keypairs KEYPAIR key001 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key002 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key003 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key004 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key005 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key006 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Регион указывать явно! Ключи работают только в пределах региона!
# ec2-describe-keypairs --region us-west-2 KEYPAIR key1 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key2 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx KEYPAIR key3 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Создание ключей
cd ~/.ssh ec2-add-keypair --region us-west-2 new_key > new_key.pem chmod 600 new_key.pem
Работа с инстансами (VM)
Создать instance
Мне нужен Amazon Linux, пока я не знаю где смотреть полный список возможных образов - указал как на уже существующем инстансе (чуть ниже немного деталей где смотреть, этот вопрос под сомнением)
ec2-run-instances ami-2a31bf1a --instance-type t1.micro --region us-west-2 --key keyName RESERVATION r-6dd5865e 371025327760 default INSTANCE i-d71c11e4 ami-2a31bf1a pending hcluster 0 t1.micro 2012-11-09T12:22:56+0000 us-west-2a aki-fc37bacc monitoring-disabled ebs paravirtual xen sg-c6dc4df6 default false
Обратить внимание: keyName это указатель на существующий ключ, и потому никакого расширения. Во многих источника я встречал keyName.pam - это ошибка
Параметры:
- ami-2a31bf1a – Идентификатор AMI образа. Определяет какая операционная система будет установлена на EC2 instance.
- --instance-type t1.micro – Какой величины будет instance. см. Варианты EC2 хостов
- --region eu-west-1 – регион где будет создан instance.
- --key test123.pem – Ключ который будет использоваться для доступа по ssh к instance.
Как то так смотреть список id:
ec2-describe-images -o amazon --region us-west-2 | grep "amzn-ami-pv"
Или тут что то есть http://aws.amazon.com/amazon-linux-ami/
Список instances в регионе
ec2-describe-instances --region us-east-1
Удалить instance
ec2-terminate-instances instance_id
instance_id можно посмотреть с помощью команды ec2-describe-instances.
Перезагрузка ec2 instance
ec2-reboot-instances
для ec2 instance идентична мягкой перезагрузке для обычного компьютера. Если попытка мягкой перезагрузки потерпит крах, возможна жесткая перезагрузка. Для instances с EBS 100% безопасно. Полезно если instance завис по каким то причинам.
ec2-reboot-instances --region eu-west-1 instance_id
instance_id можно посмотреть с помощью команды ec2-describe-instances.
Создание/просмотр/удаление tags
С помощью tags можно помечать instance, во избежании обретения кучи безымянных instances загадочного назначения.
Просмотр tags в регионе
ec2-describe-tags --region us-west-2
Создание tags
ec2-create-tags --region eu-west-1 instance_id --tag key[=value] [--tag key[=value]]
instance_id можно посмотреть с помощью команды ec2-describe-instances. удобно создавать tags вроде:
ec2-create-tags --region us-west-2 instance_id --tag Name=site_testing_area --tag Creator=employee1
Пример
Нахожу свой инстанс:
ec2-describe-instances --region us-west-2 .... RESERVATION r-6dd5865e 371025327760 default INSTANCE i-d71c11e4 ami-2a31bf1a ec2-50-112-212-246.us-west-2.compute.amazonaws.com ip-10-248-15-79.us-west-2.compute.internal running hcluster 0 t1.micro 2012-11-09T12:22:56+0000 us-west-2a aki-fc37bacc monitoring-disabled 50.50.50.50 10.10.10.10 ebs paravirtual xen sg-c6dc4df6 default false BLOCKDEVICE /dev/sda1 vol-83dbd1a5 2012-11-09T12:22:59.000Z true ....
ec2-create-tags --region us-west-2 i-d71c11e4 --tag Name=TestNode
Удаление tags
ec2-delete-tags --region eu-west-1 instance_id --tag clumsytag
Конфигурация инстанса
Я хочу наконфиггурировать инстанс паппетом, хотя эта часть статьи выходит за пределы EC2, все тами включу - обзорно. Сервер puppet у меня уже есть, подробностей минимум.
На ноде необходимо установить:
- tomcat7
- nginx
- syslog-ng вместо rsyslog (rsyslog мне кажется неудобным но многие с этим не согласны - дело вкуса).
- настроить пересылку логов на ценральное хранилище (инстансы подобные этому могут добавлятся и улдалятся автоматически, ничего не хранить локально)
- актуальная конфигурация (паппет запускается раз в X минут и делает все что нужно)
Наброски манифеста
class nginx-tomcat-lb { package { "nginx": ensure => installed } package { "tomcat7": ensure => installed } file { "/etc/nginx/nginx.conf": ensure => present, owner => "root", group => "root", alias => "nginx-config", content => template("nginx-tomcat-lb/nginx_conf.erb"), require => Package["nginx"], notify => Service["nginx"], } service { "nginx": ensure => running, subscribe => File[nginx-config] } service { "tomcat7": ensure => running, } }
Load Balancer
Для управление лоад балансерами используются elb- утилиты
Просмотр балансеров
elb-describe-lbs LOAD_BALANCER lb-test1 test1-1812564742.us-east-1.elb.amazonaws.com 2012-07-06T08:39:01.940Z internet-facing LOAD_BALANCER lb-dev1 dev1-1835033989.us-east-1.elb.amazonaws.com 2012-07-09T12:52:11.290Z internet-facing
elb-describe-lbs --region us-west-2 LOAD_BALANCER lb-west lb-west-1263536513.us-west-2.elb.amazonaws.com 2012-11-06T18:51:54.560Z internet-facing
Добавить балансер
elb-create-lb test-lb --headers --listener "lb-port=80,instance-port=80,protocol=http" --availability-zones us-west-2a --region us-west-2 DNS_NAME DNS_NAME DNS_NAME test-lb-1678700173.us-west-2.elb.amazonaws.com
Следить за --availability-zones us-west-2a - балансер работает внутри зоны!
Добавить инстанс под балансер
elb-register-instances-with-lb test-lb --instances i-d71c11e4 elb-register-instances-with-lb: Service error: There is no ACTIVE Load Balancer named 'test-lb' AWSRequestId:b74a0d60-2a75-11e2-9b12-73ca28379447
Не забывать про регион!
#elb-register-instances-with-lb test-lb --instances i-d71c11e4 --region us-west-2 INSTANCE_ID i-d71c11e4
Снять образ
ec2-create-image i-d71c11e4 --no-reboot -n 'MyImageName' -d 'Description' --region us-west-2IMAGE ami-180a8328
создать launch-config
as-create-launch-config test-launch-config -i ami-180a8328 --key=sshkey --group default --instance-type t1.micro --region us-west-2 OK-Created launch config
- test-launch-config - имя конфига
- sshkey — ssh kлючь с которым логинится на сервер
- group — секьюрити группа, в которой будут подыматься серверы. У меня (т.к. это только тест ) - дефолтная группа
Автоскейлинг группа
Везде помнить про регион! и про --availability-zones us-west-2 - это разные вещи!!!
as-create-auto-scaling-group test-scaling-group -l test-launch-config --availability-zones us-west-2a --min-size 0 --max-size 2 --load-balancers test-lb --region us-west-2 OK-Created AutoScalingGroup
Здесь:
- test-launch-config — конфиг (см. чуть выше)
- us-west-2a — зона, в которой будут подыматься инстансы Внимание - проверить что бы лоад балансер мог работать с этой зоной!
- 0 и 2 — минимальный и максимальный размеры группы соответственно;
- test-lb — имя вашего балансировщика, под которым будет поднята вся группа.
Итак, готова группа масштабирования и балансировщик.
Теперь нужно настроить CloudWatch алармы.
Автомасштабирование, основанное на CloudWatch работает через политику — policy, которая задаётся.
Примером политики является увеличение кол-ва интансов на 1. Т.е. сначала мы задаём политику, потом мы создаём аларм, который, например, срабатывает при Load Average больше X на протяжении минуты.
Политика скейл апа
as-put-scaling-policy ScaleUpPolicy --auto-scaling-group testsg --adjustment=1 --type ChangeInCapacity --cooldown 120 arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleUpPolicy
Здесь:
- --adjustment=1 — +1 хост к группе
- --cooldown 120 — на протяжении 2 минут все алармы будут игнорироваться и новые инстансы подняты не будут
Ну и аларм для скейл апа
mon-put-metric-alarm HighLoadAvAlarm --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --metric-name LoadAverage --namespace CustomMetric --period 60 --statistic Average --threshold 5 --alarm-actions arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleUpPolicy OK-Created Alarm
Здесь:
- --comparison-operator GreaterThanOrEqualToThreshold — оператор >= чем трешхолд.
- --evaluation-periods 1 — срабатывает с первого раза
- --metric-name LoadAverage --namespace CustomMetric — наша кастомная метрика
- --period 60 — минута на срабатывание
- --statistic Average — подсчитывается среднее значение
- --threshold 5 — Load Average не больше 5, помните?
- --alarm-actions — какая политика.
Политика скейл дауна
$ as-put-scaling-policy ScaleDownPolicy --auto-scaling-group testsg --adjustment=-1 --type ChangeInCapacity --cooldown 420 arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleDownPolicy
Здесь кулдаун больше. После даунскейла инстансы группа не даунскейлится ещё минимум 6 минут. Ну и adjustment=-1.
Аларм для скейл дауна:
$ mon-put-metric-alarm LoLoadAvAlarm --comparison-operator LessThanThreshold --evaluation-periods 1 --metric-name LoadAverage --namespace CustomMetric --period 120 --statistic Average --threshold 3 --alarm-actions arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleDownPolicy OK-Created Alarm
Здесь аларм срабатывает, если больше 2 минут Load Average был меньше 3.
Ну вот и всё. Итак, теперь в зависимости от нагрузки, наша скейл группа сможет разрастаться до 3х инстансов и 1 всегда будет жив. Здесь рассмотрен простейший пример автоскейлинга. Естественно, можно менять условия и баловаться с цифрами по своему усмотрению.
Ссылки
- http://xgu.ru/wiki/Amazon_EC2
- http://jakshi.org.ua/dokuwiki/%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_aws_%D0%B8%D0%B7_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8
- http://habrahabr.ru/post/92419/