Статьи

Развертывание масштабируемого приложения с AWS Elastic Beanstalk и New Relic

 

Существует несколько вариантов развертывания ваших веб-приложений. Однако развертывание масштабируемых веб-приложений может принести некоторые уникальные сложности. Вы можете решить некоторые из этих сложностей самостоятельно, создав инфраструктуру на AWS. Но с Elastic Beanstalk вы можете получить полное масштабируемое решение, не конфигурируя все компоненты самостоятельно.

Масштабируемое веб-приложение может автоматически привлекать дополнительные ресурсы, не требуя вмешательства человека. Для этого типа автоматизированной оркестровки требуется немало инфраструктуры — что может занять много времени при настройке. Надежная масштабируемая инфраструктура должна включать серверы приложений, серверы баз данных, балансировщики нагрузки, агрегирование журналов, брандмауэр, мониторинг и оповещения. Без автоматизации почти каждый компонент вашей инфраструктуры потребовал бы обновления, чтобы он знал о новых ресурсах. С Elastic Beanstalk — который включает в себя все компоненты надежной инфраструктуры — создание и удаление ресурсов обрабатывается автоматически. Другими словами, вы можете съесть свой торт и съесть его тоже.

Elastic Beanstalk не является отдельным технологическим стеком от AWS. Фактически, он объединяет традиционные компоненты из EC2, S3, RDS и CloudWatch в полностью масштабируемую инфраструктуру. Поэтому, если ваше приложение уже работает на AWS, вполне вероятно, что вы можете воспользоваться преимуществами системы оркестровки и масштабирования Elastic Beanstalk прямо сейчас. Elastic Beanstalk поддерживает приложения, работающие на Java, Python, PHP и Ruby, работающие на Linux, или IIS, работающие на Windows Server. Он также поддерживает базы данных в MySQL, Oracle и Windows SQL Server. Поскольку ваше приложение работает на экземплярах EC2, у вас могут быть установлены дополнительные пакеты для поддержки вашего технологического стека, такие как memcached и Redis. Добавить New Relic в ваше приложение также просто. И так как мы будем просто использовать стандартные компоненты AWS,нет никаких специальных изменений, которые вам нужно будет сделать, чтобы начать работу.

В этом примере мы будем настраивать образец приложения Michael Hartl’s Rails Tutorial, работающего на Phusion Passenger. Прежде чем начать, вам понадобится настроить Elastic Beanstalk CLI Tools и правильно настроить его.

Конфигурирование стека приложений
Сначала инициализируйте стек приложений. На этом этапе выберите, где вы будете размещать приложение.

$ eb init

Проверив свои учетные данные AWS, выберите регион для развертывания приложения. Вы можете развернуть экземпляры в нескольких зонах доступности в этом регионе, чтобы обеспечить высококачественную избыточность. Мы выберем Запад США (Орегон), вариант 2, для этого примера:

Select an AWS Elastic Beanstalk service region.
Available service regions are:
1) US East (Virginia)
2) US West (Oregon)
3) US West (North California)
4) EU West (Ireland)
5) Asia Pacific (Singapore)
6) Asia Pacific (Tokyo)
7) Asia Pacific (Sydney)
Select:  (1 to 7): 2

Затем установите имя приложения, по умолчанию это имя каталога, в котором вы инициализировали Beanstalk. Просто нажмите return, чтобы принять значение по умолчанию:

Enter an AWS Elastic Beanstalk application name (auto-generated value is "railstutorial"):

Вы можете назвать среду для приложения, такую ​​как разработка, подготовка или производство. Мы будем развертывать промежуточную среду для этого урока:

Enter an AWS Elastic Beanstalk environment name (auto-generated value is "railstutorial-env"): railstutorial-staging

Теперь пришло время выбрать стек приложений. Это приложение Rails 3.2, которое работает на Ruby 1.9.3. Мы будем использовать 64-битные экземпляры Amazon Linux для нашего приложения, вариант 14. Ниже вы можете увидеть доступные варианты стека для вашего приложения:

Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux running PHP 5.3
2) 64bit Amazon Linux running PHP 5.3
3) 64bit Windows Server 2008 R2 running IIS 7.5
4) 64bit Windows Server 2012 running IIS 8
5) 32bit Amazon Linux running Tomcat 7
6) 64bit Amazon Linux running Tomcat 7
7) 32bit Amazon Linux running Tomcat 6
8) 64bit Amazon Linux running Tomcat 6
9) 32bit Amazon Linux running Python
10) 64bit Amazon Linux running Python
11) 32bit Amazon Linux running Ruby 1.8.7
12) 64bit Amazon Linux running Ruby 1.8.7
13) 32bit Amazon Linux running Ruby 1.9.3
14) 64bit Amazon Linux running Ruby 1.9.3
Select:  (1 to 14): 14

Наше приложение требует реляционной базы данных, поэтому нам нужно будет включить RDS как часть нашего стека. Мы начинаем с новой установки, поэтому у нас нет снимка для восстановления:

Create an RDS DB Instance? [y/n]: y

Create an RDS BD Instance from (current value is "No snapshot"):
1) No snapshot
2) Other snapshot
Select:  (1 to 2): 1
Enter an RDS DB master password:
Retype password to confirm:

Как правило, вы должны сделать резервную копию ваших данных, прежде чем завершить весь стек. Но в этом примере нам не нужно делать резервные копии данных, поэтому мы выберем «нет».

If you terminate your environment, your RDS DB Instance will be deleted and you will lose your data.
Create snapshot? [y/n]: n

Запустите свой стек приложений
Это все, что нужно для настройки Elastic Beanstalk для приложения. Если вам когда-нибудь понадобится обновить ваш выбор, просто используйте,eb initчтобы просмотреть их снова. Теперь нам просто нужно запустить стек и протолкнуть наш код.

$ eb start
Starting application "railstutorial".
Waiting for environment "railstutorial-staging" to launch.
2012-12-02 12:25:08 INFO    createEnvironment is starting.
...
Application is available at "railstutorial-staging-gcsi2pfevm.elasticbeanstalk.com".

Это займет некоторое время, и после завершения команды ваш стек приложений все еще будет загружаться. Вы можете проверить состояние своего стека, ища Health: Green:

$ eb status --verbose
Retrieving status of environment "railstutorial-staging".
URL : railstutorial-staging-gcsi2pfevm.elasticbeanstalk.com
Status  : Updating
Health  : Grey
Environment Name:   railstutorial-staging
Environment ID:     e-twb3pccvxz
Solution Stack:     64bit Amazon Linux running Ruby 1.9.3
Version Label:      git-c5b54c38f70ed4afcbd3624746fb0e6b9fffde3d-1354481313527
Date Created:       2012-12-02 12:25:09
Date Updated:       2012-12-02 12:48:35
Description:        None

RDS Database: AWSEBRDSDatabase | aapx7gzecu7cns.chojteloju75.us-west-2.rds.amazonaws.com:3306
Database Engine:    mysql 5.5.27
Allocated Storage:  5
Instance Class:     db.t1.micro
Multi AZ:       False
Master Username:    ebroot
Creation Time:      2012-12-02 12:30:13
DB Instance Status: available

Как только состояние вашего приложения изменится на зеленый, у вас будет все необходимое для развертывания кода. Вы можете перейти по URL-адресу приложения сейчас, чтобы найти образец приложения AWS.

Настройка базы данных для использования RDS
Ваше приложение почти готово к развертыванию, для начала вам нужно изменить конфигурацию базы данных, чтобы использовать экземпляр RDS. За нас лежит тяжелая работа, где большая часть конфигурации базы данных хранится в переменных среды. Поэтому для нашего приложения на Rails вам просто нужно, чтобы вашconfig/database.ymlфайл содержал следующее:

production:
  adapter: mysql2
  encoding: utf8
  database: <= ENV['RDS_DB_NAME'] >
  username: <= ENV['RDS_USERNAME'] >
  password: <= ENV['RDS_PASSWORD'] >
  host: <= ENV['RDS_HOSTNAME'] >
  port: <= ENV['RDS_PORT'] >

В настоящее время RDS поддерживает MySQL, Oracle и MS SQL Server. В нашем приложении мы используем MySQL, поэтому нам нужно включить mysql2гем в наш Gemfile и сделать bundle install.

Развертывание кода приложения
Чтобы развернуть приложение, нам просто нужно нажать git push в наш стек:

$ git aws.push

Для приложений Rails инструменты Elastic Beanstalk автоматически запускают миграции и компилируют наши активы с помощью конвейера активов. После нажатия кнопки приложение необходимо будет перезапустить, поэтому вы можете eb statusснова использовать его для отслеживания перезапуска, пока состояние не станет зеленым. Как только вы снова станете зеленым, вы сможете посетить URL своего приложения и увидеть, как работает ваш код.

Настройка Elastic Beanstalk для HTTPS
Наше приложение использует HTTPS для защиты наших пользователей от прослушивателей. Настоятельно рекомендуется, чтобы все части вашего сайта обслуживались по протоколу HTTPS (не только части регистрации / входа в систему). Для настройки HTTPS на Elastic Beanstalk требуется два шага. Сначала создайте и загрузите сертификат SSL, затем настройте Elastic Beanstalk для использования вашего сертификата.

Для производственного приложения вы должны использовать приобретенный сертификат от авторитетного центра сертификации. Для нашего примера приложения мы используем самозаверяющий сертификат (ваш браузер покажет вам предупреждение о сертификате при использовании самоподписанных сертификатов, поэтому их никогда не следует использовать в производстве).

Мы будем использовать OpenSSL для генерации сертификата. Во-первых, нам нужен закрытый ключ:

$ openssl genrsa 1024 > privatekey.pem

Затем мы используем наш закрытый ключ для генерации запроса на подпись сертификата:

$ openssl req -new -key privatekey.pem -out csr.pem

Вам будет предложено заполнить данные сертификата. Ответьте на каждый из вопросов, чтобы выполнить запрос. Затем мы генерируем самоподписанный сертификат:

$ openssl x509 -req -days 365 -in csr.pem -signkey privatekey.pem -out server.crt

Теперь у вас есть самозаверяющий сертификат и закрытый ключ, который мы загрузим в службу управления идентификацией AWS. Для продолжения необходимо установить и настроить IAM CLI Tools . Используйте интерфейс командной строки IAM для загрузки сертификата и закрытого ключа:

$ iam-servercertupload -b server.crt -k privatekey.pem -s railstutorial

Хотя команда ничего не возвращает в ваш запрос, все должно быть загружено. Теперь вам нужно получить уникальный идентификатор для вашего сертификата:

$ iam-servercertlistbypath
arn:aws:iam::YOURACCOUNTNUM:server-certificate/railsTutorial

Чтобы настроить Elastic Beanstalk для использования HTTPS, вам нужно Edit Configurationв Actionsменю.

Изменить конфигурацию

Перейдите на Load Balancerвкладку и установите HTTPS Listener Portзначение 443. Введите уникальный идентификатор из вашего сертификата в SSL Certificate IDполе.

Конфигурация балансировщика нагрузки

Нажмите Apply Changesи, как только ваш стек приложений перезапустится, вы сможете посетить свое приложение по HTTPS.

Добавление новой Relic в ваше приложение
Добавление новой Relic в приложение — это просто вопрос установки агента и добавления файла конфигурации в вашу кодовую базу. Для Rails мы просто добавимnewrelic_rpmгем и конфигурацию вconfig/newrelic.yml.

Вы можете получить новый стандарт Relic бесплатно, если используете AWS. Просто зарегистрируйтесь для учетной записи и следуйте инструкциям по загрузке агента и файла конфигурации. Через несколько минут после использования вашего приложения вы увидите метрики производительности на панели инструментов New Relic.