Статьи

Поддерживать инфраструктуру с помощью Elastic Beanstalk и CloudFormation

Множество сервисов и способов построения инфраструктуры на AWS могут легко привести к созданию снежинки в системе, которую сложно поддерживать в течение длительного времени. Часто вы не знаете, кто представил какие изменения или как их воспроизвести в промежуточной среде для проверки будущих изменений.

Чтобы противостоять этой проблеме, AWS разработала CloudFormation, чтобы держать определение вашей инфраструктуры под контролем исходного кода и упростить его развитие. Это дает вашей команде возможность протестировать изменения в вашей инфраструктуре на промежуточных учетных записях и просмотреть их перед развертыванием.

Чтобы познакомить вас с CloudFormation, давайте пройдемся по настройке приложения на Elastic Beanstalk, которое также отправляет свои журналы в CloudWatch Logs . В следующем посте мы настроим дополнительные сигналы тревоги через CloudFormation для вашего приложения Elastic Beanstalk и балансировщиков нагрузки.

Введение в шаблоны CloudFormation

CloudFormation настраивается с помощью файлов шаблонов JSON, которые вы можете хранить в своем хранилище. Вы можете определить ресурсы, зависимости между ресурсами и параметры, чтобы вы могли изменить инфраструктуру во время установки. Все это также видно в пользовательском интерфейсе CloudFormation.

Чтобы глубже погрузиться в конфигурацию CloudFormation, ознакомьтесь с разделом « Начало работы» их документации. Как только вы хорошо разберетесь в основах, которые не слишком сложны, лучший способ узнать их специфику — это просмотреть справочник шаблонов, в котором перечислены различные типы ресурсов и все их параметры.

Синтаксис файла JSON может быть довольно многословным. Чтобы сделать это проще, команда CloudFormation представила дизайнерский интерфейс . Другой вариант — использовать разные DSL, построенные поверх формата JSON, чтобы было легче писать. Для Python есть проект Troposphere или Cfndsl, если вы предпочитаете синтаксис Ruby.

Я использовал Cfndsl для этого блога, но он очень близок к синтаксису JSON; это должно быть легко понять.

Настройка приложения и среды Elastic Beanstalk

Я использую пример репо flomotlik / cloudformation -astic-beanstalk-blog-demo . В нем есть подробное описание того, как развернуть его с помощью интерфейса командной строки Codeship Docker.

В репозитории есть небольшое приложение Sinatra, которое отвечает Hello World на любой запрос.

Шаблон прохождения

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

Давайте начнем с настройки простого приложения и среды Elastic Beanstalk.

01
02
03
04
05
06
07
08
09
10
ElasticBeanstalk_Application('DemoDockerApplication') do
    Property('Description', 'AWS Elastic Beanstalk Application')
  end
 
  ElasticBeanstalk_Environment('DemoEnvironment') do
    DependsOn %w(DemoDockerApplication)
    ApplicationName Ref('DemoDockerApplication')
    Description 'AWS Elastic Beanstalk Environment'
    SolutionStackName '64bit Amazon Linux 2015.09 v2.0.4 running Docker 1.7.1'
  end

После того, как этот стек настроен (вы должны следовать этому в пользовательском интерфейсе CloudFormation), вы сможете увидеть демонстрационную страницу стека Elastic Beanstalk Docker.

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

1
S3_Bucket('ElasticBeanstalkDeploymentBucket')

Это создаст уникальную корзину S3, которую мы будем использовать для развертывания. В файле codehip-steps.yml мы заменим заполнитель на имя созданного сегмента; Теперь мы можем запустить развертывание через Jet . Мы также добавили выходные данные в шаблон, чтобы было легче определить область S3 и URL-адрес для нашей среды Elastic Beanstalk.

Теперь вы можете запустить развертывание Elastic Beanstalk, как описано в README хранилища.

Если вы откроете URL для своей среды ElasticBeanstalk, вы должны увидеть сообщение Hello World.

Привет мир

Отправка журналов в журналы CloudWatch

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

CloudWatch — это сервис Amazon, который поддерживает обработку метрик и журналов из ваших приложений. Он автоматически предоставляет метрики для ваших экземпляров EC2 и эластичных балансировщиков нагрузки, но также может иметь собственные метрики. Кроме того, вы можете поместить в него все свои журналы, а затем создавать метрики из этих журналов, когда в журнале обнаруживаются определенные строки. Это дает вам большую гибкость для настройки и автоматического управления вашей инфраструктурой.

Вы даже можете автоматически запускать или останавливать экземпляры в зависимости от ваших аварийных сигналов, даже ваших пользовательских метрик, что мы и сделаем в последующем посте.

Добавьте следующую конфигурацию в файл шаблона. Он создаст отдельную группу журналов, которую мы будем использовать во втором посте этой серии для настройки метрик и оповещений. Он также создает профиль роли и экземпляра IAM, который мы можем использовать для нашего приложения Elastic Beanstalk, чтобы он мог общаться со службой CloudWatch Logs.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Logs_LogGroup('ElasticBeanstalkMainLogGroup')
 
  IAM_Role('ElasticBeanstalkLoggingRole') do
    AssumeRolePolicyDocument(
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Principal: {
          Service: ['ec2.amazonaws.com']
        },
        Action: ['sts:AssumeRole']
      }]
    )
    Path '/'
    Policies [{
      PolicyName: 'ElasticBeanstalkLogging',
      PolicyDocument: ({
        Version: '2012-10-17',
        "Statement": [
          {
            "Effect": 'Allow',
            "Action": [
              'logs:CreateLogStream',
              'logs:GetLogEvents',
              'logs:PutLogEvents',
              'logs:DescribeLogGroups',
              'logs:DescribeLogStreams',
              'logs:PutRetentionPolicy'
            ],
            "Resource": [
              'arn:aws:logs:us-east-1:*:*'
            ]
          }
        ]
      })
    }]
  end
 
  IAM_InstanceProfile('ElasticBeanstalkInstanceProfile') do
    Path '/'
    Roles [Ref('ElasticBeanstalkLoggingRole')]
  end

Обязательно обновите среду Elastic Beanstalk с помощью OptionSettings, чтобы установить профиль экземпляра и добавить группу журналов в качестве параметра, который мы можем использовать в файлах конфигурации журнала.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
ElasticBeanstalk_Environment('DemoEnvironment') do
    DependsOn %w(DemoDockerApplication ElasticBeanstalkMainLogGroup)
    ApplicationName Ref('DemoDockerApplication')
    Description 'AWS Elastic Beanstalk Environment'
    SolutionStackName '64bit Amazon Linux 2015.09 v2.0.4 running Docker 1.7.1'
    OptionSettings [
      {
        Namespace: 'aws:autoscaling:launchconfiguration',
        OptionName: 'IamInstanceProfile',
        Value: Ref('ElasticBeanstalkInstanceProfile')
      },
      {
        Namespace: 'aws:elasticbeanstalk:customoption',
        OptionName: 'EBLogGroup',
        Value: Ref('ElasticBeanstalkMainLogGroup')
      }]
  end

После настройки всего в стеке CloudFormation разверните этот стек, чтобы мы могли настроить приложение Elastic Beanstalk.

Настройка ElasticBeanstalk для отправки журналов в журналы Cloudwatch

Мы уже создали инфраструктуру для экземпляров Elastic Beanstalk EC2 для отправки журналов; теперь мы должны соединить это вместе. Elastic Beanstalk поддерживает специальную папку с именем .ebextensions которая позволяет настраивать экземпляры.

В папке .ebextensions репозитория у нас есть три файла:

  • cwl-log-setup.config . Это позволяет настроить файл конфигурации агента журналов Cloudwatch для отправки файлов журналов, специфичных для журналов (в данном случае журналов приложений и журналов NGINX, но их можно легко расширить) в журналы Cloudwatch. Он также устанавливает поток журналов и принимает параметр EBLogGroup, который мы установили с помощью OptionSettings.
  • cwl-setup.config . Устанавливает на компьютер Агент журналов Cloudwatch.
  • eb-logs.config . Удостоверится, что Elastic Beanstalk Agent также забирает файлы журналов для агента журналов CloudWatch, когда вы заходите на панель мониторинга EB и запрашиваете там журналы. Это очень полезно для отладки других параметров конфигурации и файлов.

После развертывания этих файлов стек CloudFormation, представляющий ваше приложение Elastic Beanstalk, будет обновлен, и Elastic Beanstalk должен начать отправлять журналы в журналы CloudWatch.

Мы настроили его здесь так, чтобы для каждого приложения был новый поток журналов и журнал NGINX для каждого экземпляра, чтобы было легче искать проблемы в конкретных экземплярах. С этой настройкой мы завершим это на сегодня. Вдобавок к этому мы добавим больше метрик в моем последующем посте.

Выводы

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

С Elastic Beanstalk в сочетании с гибкостью, которую вы получаете, имея возможность измерять и изучать каждую часть стека, у вас есть действительно сильная система для запуска и эксплуатации вашего приложения.

Попробуйте и дайте нам знать в комментариях, если у вас есть какие-либо дополнительные советы и рекомендации для Elastic Beanstalk.