Рубрики
Uncategorized

От гальки до кирпичных кладов: История облачной инфраструктуры развивалась

Вы можете построить вещи из гальки. Работа с таким количеством уникальных частей не легко, но если вы разрушили … Помечено DevOps, AWS, Terraform, Anbible.

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

Как и многие стартапы, вот где Коан Инфраструктура началась. С любовью ручной прокат экземпляров EC2, сидя за любящими ручными элаксами внутри с любовью — да — ручной клавиш VPC. Каждый пошел со своими собственными причудами, обновлениями программного обеспечения и версией Linux. Техническое обслуживание было постоянным испытанием нашего технического окумена и терпения (не говоря уже о нержавых отношениях); Масштабируемость была вне вопроса.

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

Мотивации

Волк преследовал их по переулке, и он почти поймал их. Но они сделали это в кирпичный дом и замкнули дверь закрытой.

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

  1. Видимость Отказ Зная, кто сделал то, что (и когда) позволяет понять и сотрудничать на инфраструктуре. Это также абсолютный должен соблюдать соответствие. Повторяемая, контролируемая версиями инфраструктуры, добавляемым файловыми файлогами с моментальным снижением самой нижней инфраструктуры.
  2. Уверенность Отказ Не зная — по крайней мере, не совсем зная — инфраструктура делает изменения очень нервными. Для нашей стороны мы этого не сделали. Что не имеет большого значения, когда эта инфраструктура должна масштабироваться.
  3. Согласованность Отказ Галька приходит во всех формах и размерах. Новые переменные среды, ассигнования портов, разрешения, структура каталогов и зависимости должны быть индивидуально применены и проверены на каждом экземпляре. Это потребляет время разработки и повышает риск «дружественных-пожарных» инцидентов от любых несоответствий между различными хозяевами (см.: # 2).
  4. Повторяемость Отказ Восстановление галька означает репликацию всех природных сил, которые сформировали его над эонами. Восстановление нашей инфраструктуры после катастрофического провала казалась невозможной задачей — подозрение, что мы не спешили, чтобы проверить.
  5. Масштабируемость Отказ Замена и продление — две стороны одной монеты. Хотя можно защелачить изображение машины и масштабировать ее на неопределенный срок, глаз к обслуживанию, и наше собственное психическое здоровье призвало нас рассмотреть новое начало. Из минимального, разумно затвердевшего базового изображения.

Поскольку наша работа в KOAN все о достижении цели, большинство наших технических проектов начинаются именно там, где вы ожидаете. Здесь: воспроизводимая инфраструктура (или что-то ближе к нему), задокументировано и версию в качестве кода. У нас было много опыта с такими инструментами, как террафом и Anbible нарисовать и чувствовал себя разумно уверенно, положив их к использованию — но Даже с знакомым инструментальным инструментом наш изначально Shaky Foundation не имел не осторожно.

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

Dev сегодня, завтра мир

«Где-то», — была наша надежная среда CI, dev Отказ Частые, тщательно проверенные релизы являются разумными ожиданиями и точкой профессиональной гордости для нашей команды развития. dev там, где происходит магия Qa, а также простоя на dev Обзор блоков, нам нужно было провести сбои минимум.

До dev Может принять его новую форму, нам нужно было разумно уверенно, что мы могли бы восстановить это:

  • … В правом VPC
  • …с Группы правильных групп безопасности присваиваются
  • … С нашей стандартной регистрацией и мониторингом
  • …и Предоставлено с рабочим экземпляром коанской платформы

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

Мы планировали решить dev в два шага. Во-первых, мы будем документировать (и в конечном итоге восстановить) нашу инфраструктуру AWS, используя террафом Отказ Как только у нас была достаточно правдоподобная конфигурация на наших руках, мы тогда использовали Anbible Развернуть платформу коан. Двухступенчатый подход отсчитывал более долгосрочную мечту о полностью неизменяемых ресурсах, но оно позволило нам решить одну большую проблему (инфраструктуру), оставляя наши существующие процессы развертывания в значительной степени неповрежденной.

Заменив инфраструктуру с террафом

Во-первых, инфраструктура. Формула для документирования существующей инфраструктуры в террафом Идет что-то вроде этого:

  1. Создайте запись заглушки для существующего ресурса
  2. Использовать Импорт террафора Чтобы прикрепить заглушку к существующей инфраструктуре
  3. Использовать Государство террафора и/или План террафора Для согласования несоответствий между заглушкой и реальностью
  4. Повторить, пока все ресурсы не будут задокуменными

Вот как мы документировали dev Группа безопасности VPC по умолчанию, например:

$ echo '
resource "aws_default_security_group" "default" {
  # hard-coded reference to a resource not yet represented in our
  # Terraform configuration
  vpc_id = var.vpc_id
}' >> main.tf

На данный момент мы могли бы запустить План террафора Чтобы увидеть разницу между существующей инфраструктурой и нашей конфигом Terraform:

$ terraform import aws_default_security_group.default sg-123456
$ terraform plan
# module.dev-appserver.aws_default_security_group.default will be updated in-place
  ~ resource "aws_default_security_group" "default" {
      ~ egress                 = [
          - {                                 
              - cidr_blocks      = [
                  - "0.0.0.0/0",
                ]                    
              - description      = ""
              - from_port        = 0
              - ipv6_cidr_blocks = []
              - prefix_list_ids  = []
              - protocol         = "-1"
              - security_groups  = []
              - self             = false
              - to_port          = 0
            },
        ]
        id                     = "sg-123456"
    # ...
    }

Используя различие в качестве наброски, мы могли затем заполнить соответствующие aws_default_security_group.default вход:

# main.tf
resource "aws_default_security_group" "default" {
  vpc_id = var.vpc_id
  ingress {
    protocol  = -1
    self      = true
    from_port = 0
    to_port   = 0
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Повторно работает План террафора , мы могли бы подтвердить, что обновленная конфигурация соответствует существующему ресурсу:

$ terraform plan
...
No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between
your configuration and real physical resources that exist. As a 
result, no actions need to be performed.

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

Обмен террафом штата с небольшой командой

По умолчанию Terraform отслеживает состояние управляемой инфраструктуры в местном tfstate файл. Этот файл содержит как детали конфигурации, так и сопоставление обратно в ресурсы «живых» (с помощью идентификаторов, имен ресурсов и в корпусе Amazon, ARNS) в соответствующем поставщике облака. Как мелкая коммуникативная команда в спешке, мы чувствовали себя комфортно Bucking Best Reparies и проверяя наш государственный файл прямо в контроль источника. Почти не времени мы не столкнулись с столкновениями в целях GIT-филиалов — тень о сотрудничестве и блокирующих проблемах, но мы решили максимально принять большую дружелюбную практику. На данный момент мы были до бега.

Заставить его работать, сделай это правильно .

Предоставление приложения с помощью Anisible

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

Платформа KOAN развертывает в качестве монолитного пакета, содержащего нашу бизнес-логику, интерфейсы и небольшую монагерию зависимых услуг, которые их потребляют. Какие услуги работают на данном экземпляре EC2, будут варьироваться от одного к следующему. В зависимости от его конфигурации производственный узел может управлять нашим API-APIS-APIS, серверами веб-каналов, процессоров задач, любым из различных вакансий CRON или все вышеперечисленное.

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

Строительство местной среды Amazon Linux

Воспроизведение облачных служб локально сложно. Мы не можем запустить EC2 на ноутбуке разработчика, но Amazon помогло погрузился Изображения Amazon Linux — Наше распределение целевого распределения кирпичей. С небольшим количеством возобновляемых и много помощи от облако-init. Нам удалось поднять разумно представительные экземпляры Amazon Linux в местном VirtualBox :

$ ssh -i local/ssh/id_rsa dev@localhost -p2222
Last login: Fri Sep 20 20:07:30 2019 from 10.0.2.2
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\\___|___|

На данный момент мы могли бы создать неизбежный инвентарь, присваивающий те же группы нашей «локальной» среде, которую мы в конечном итоге присваиваем dev :

# local/inventory.yml
appservers:
  hosts:
    127.0.0.1:2222
cron:
  hosts:
    127.0.0.1:2222
# ...

Если мы сделали это снова, мы могли бы сэкономить некоторое время, пропустив VirtualBox в пользу отдельного экземпляра EC2. С другой стороны, имея местную, быструю безопасную среду для тестирования против уже сохраненного времени в разработке новых анабимых игровых книгов. Жюри все еще на этом.

Действительно!

С разумным факсимиром нашей «живой» среды мы были окончательно до уровня приложений. Несмысленные подходы хосты с точки зрения их ролей-баз данных, веб-серверов или чего-то другого полностью. Мы подошли к этому, разделяя две «базовые» роли для наших виртуальных виртуальных машин ( Common ) и наших серверов приложений в частности ( Backend ), где:

  • общий Роль Описанный мониторинг, среда выполнения и структура и разрешения каталогов по умолчанию
  • Backend Роль добавлена (Verioned) выпуск платформы кона

Дополнительные роли, наслоенные сверху представляют каждый из наших минимально зависимых услуг — API. , Задачи , крон И так далее, на котором мы затем назначали местному хосту:

# appservers.yml 
- hosts: all
  roles:
  - common
  - backend
- hosts: appservers
  roles:
  - api
- hosts: cron
  roles:
  - cron

Мы не могли принести EC2 из облака, но поднимая местный экземпляр, который дробил Лот Как EC2 теперь было так же просто, как:

$ ansible-playbook \
  --user=dev \
  --private-key ./local/ssh/id_rsa \
  --inventory local/inventory.yml \
  appservers.yml

От гальки к кирпичной кладке

С нашей инфраструктурой в террафом наше развертывание в Anbible И вся уверенность в том, что местное тестирование могло купить, мы были готовы начать делать кирпичи. План (и всегда есть план!) Был достаточно простым:

  1. Используйте Terraporm Apply для создания нового DEV-экземпляра
  2. Добавьте новый хост на наш неизбежный инвентаризацию и предоставление его
  3. Добавьте его в DEV Elb и дождитесь его присоединения (при условии, что предоставление успешных проверок и проверки здоровья)
  4. Проверьте его поведение и внесите коррективы по мере необходимости
  5. Удалите старый экземпляр Dev (наш галька!) От террафора
  6. Промыть и повторять в производстве

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

Сделайте это работать, сделайте это правильно.

Вывод

Вышли! Только с небольшим цветом назад и вперед, чтобы разобраться ранее незаметные детали, наше новое dev Хозяин взял свое место как кирпич № 1 в растущей конструкции Коана. Мы извлекли dev Конфигурация в многоразовый террафом Модуль и к концу недели наша кирпичная кладка вытянула весь путь к производству.

В нашем следующем посте мы рассмотрим глубже в том, как мы импортировали объемы некументированной инфраструктуры в террафору.

Благодаря Ашвин Бхат Для ранних отзывов, Рэндалл Гордон и Энди Питас Для помощи повернуть Домашние животные/метафора скота во что-то более гуманный, и Эмар ди на Бессмысленно для обложки изображения.

И Если вы в строительстве программного обеспечения, чтобы помочь каждому команде достичь своих целей, Коан нанимает !

Оригинал: «https://dev.to/koan/from-pebbles-to-brickworks-a-story-of-cloud-infrastructure-evolved-3p63»