Этот пост в блоге является частью моей серии AWS:
- Инфраструктура как код — Управление AWS с Terraform
- Развертывание HTTP API на AWS с использованием Lambda и API Gateway
- Развертывание HTTP API на AWS с помощью Elastic Beanstalk
- Развертывание и сравнение экземпляра AWS RDS MySQL
- Обработка событий в AWS с использованием SNS, SQS и Lambda
- Непрерывная доставка на AWS с Terraform и Travis CI
- Обработка данных датчика на AWS с использованием IoT Core, Kinesis и Elasticache
- Мониторинг функций AWS Lambda с помощью CloudWatch
Компании сегодня часто больше не должны запускать свой собственный центр обработки данных. Поставщики общественного и частного облака предлагают отличные продукты на разных уровнях абстракции. Независимо от того, нужен ли вам доступ к гипервизорам для создания виртуальных машин или просто вы хотите запустить фрагмент Python, все возможно. Эти разные уровни абстракции обычно называют XAAS. Начиная с самой высокой абстракции, обычно используется следующая категоризация:
- Программное обеспечение как услуга (SaaS)
- Платформа как услуга (PAAS)
- Инфраструктура как услуга (IAAS)
Хотя использование таких предложений от Amazon Web Services (AWS) или Google Cloud Уберите большую сложность, управление различными ресурсами и зависимостями между отдельными компонентами может стать очень грязным. Как вы справляетесь с неисправными деталями? Как вы выполняете обновления и броска? А как насчет технического обслуживания?
Возможно, вы слышали об аналогии с учетом ваших серверов как скота, а не кошек. Если кошка не чувствует себя хорошо, вы погладили ее и пытаетесь сделать ее счастливым. Если это произойдет с одной из ваших коров, вы убиваете его и получаете новый. Вы не инвестируете ресурсы в исправление одного животного из стада. Я веган, и я не одобряю убоя животных, но концепция, применяемая к инфраструктуре, имеет для меня смысл.
В разработке программного обеспечения люди разработали методы для управления зависимостями и контроля версий программных модулей. Можем ли мы применить некоторые из этих методов и к нашей инфраструктуре? Ответ — да, мы можем. И одним из важных ингредиентов для достижения этого является рассматривание нашей инфраструктуры как кода. И это то, на что мы собираемся посмотреть в этом посте, вместе с примером управления ресурсами AWS с использованием Terraform.
Сообщение в блоге структурировано следующим образом. В первой части мы хотим немного углубиться в концепцию инфраструктуры в качестве кода. Вторая часть проведет простой пример того, как управлять ресурсами на AWS с помощью Terraform. Мы закрываем пост, суммируя основные идеи.
Инфраструктура как код (IAC) относится к процессу управления ИТ -инфраструктурой через файлы определения, а не к интерактивным инструментам конфигурации. Он тесно связан с принципом крупного рогатого скота, и не CAT, так как воссоздание частей инфраструктуры может быть полностью автоматизировано на основе файлов определения.
Файлы определения обычно помещаются под контроль версий. В сочетании с непрерывной интеграцией и непрерывными трубопроводами доставки может быть достигнута высокая степень автоматизации. IAC в сочетании с автоматизацией приносит три преимущества:
- Воспроизводимость. Можно воссоздать детали или всю инфраструктуру с нуля на основе файлов определения. Используя явные версии для каждого компонента, а также для управления версиями файлов определения, результаты развертывания воспроизводимы.
- Скорость. Компьютеры быстро, когда дело доходит до выполнения предопределенных задач. При настройке и настройке новой среды наличие как можно меньше человеческого взаимодействия ускорит ваше развертывание.
- Качественный. Из-за первых двух преимуществ становится возможным и достаточно экономичным для реализации автоматических тестов для вашей инфраструктуры. Это улучшает надежность и качество вашего развертывания. Удаление человеческих взаимодействий также помогает избежать ошибок.
Существует много инструментов, которые позволяют подходу IAC, все они в другое расширение. Ansible , Кукол , Шеф -повар и SaltStack несколько примечательных примеров. Ansible — это императив т.е. вы заявляете, как настроить инфраструктуру, и работает с push Принцип, то есть он активно идет к компонентам и меняет их. Махварь, с другой стороны, декларативный , то есть вы описываете желаемое состояние и работают в тянуть Принцип, то есть агент марионетки работает на каждом сервере, вытаскивая последнюю конфигурацию из марионеточного мастера.
Что общего имеет все вышеупомянутые инструменты, так это то, что они Управление конфигурацией инструменты. Они предназначены для установки программного обеспечения и управления конфигурацией на разных серверах. Вопрос в том, как получить серверы, которыми вы хотите управлять? Ответ Управление оркестровкой Анкет
Управление оркестровкой фокусируется на создании различных ресурсов, например, Виртуальные машины, в правильном порядке и соедините их вместе по мере необходимости. В сочетании с неизменной инфраструктурой, которая очень связана с принципом нашего скота, не выставки, возникает вопрос о том, действительно ли вам вообще нужно управление конфигурацией вообще. Каждый облачный провайдер предлагает какое -то неподвижное хранилище компонентов в виде контейнеров или изображений виртуальных машин.
Hashicorp Terraform является мощным инструментом оркестровки инфраструктуры. В следующем разделе мы хотим поближе взглянуть на Terraform в действии.
Проблема
Чтобы продемонстрировать рабочий процесс Terraform, мы собираемся развернуть простую инфраструктуру на AWS. Цель состоит в том, чтобы создать виртуальную машину с помощью Amazon Elastic Compute Cloud (EC2) и используйте SSH для его подключения. Для этого нам нужно настроить брандмауэр, чтобы разрешить трафик TCP на порту 22 и скопировать наш общедоступный ключ на машину.
Настройка AWS
Прежде чем мы сможем начать, нам нужно убедиться, что мы можем получить доступ к Консоль AWS Анкет Для этого вам сначала нужно создать учетную запись AWS, если у вас ее еще нет. Затем вы должны создать нового пользователя и назначить полный доступ к EC2, чтобы мы могли выполнить необходимые операции.
На машине, которая будет запускать Terraform, например, Наш ноутбук на данный момент, нам нужно выполнить некоторую базовую конфигурацию. Есть несколько способов сделать это, но мы собираемся выбрать подход на основе файлов. Нам нужно создать Учетные данные
и конфигурация
Файл внутри ~/.aws
Папка со следующим контентом:
# ~/.aws/credentials [default] aws_access_key_id=aws_secret_access_key=
# ~/.aws/config [default] region=eu-central-1 output=json
Как ключ доступа, так и ключ секретного доступа могут быть получены из консоли AWS. Обратите внимание, что не рекомендуется использовать корневые учетные данные, а скорее конкретный пользователь. Вы также можете установить AWS CLI , но не обязательно для работы Terraform. Здесь мы также настраиваем регион и выходной формат CLI AWS, хотя на самом деле это не влияет на Terraform.
Обратите внимание, что мы работаем с профилем по умолчанию. Если вы используете AWS для других целей, вы можете захотеть Создать новый профиль .
Развертывание терраформ
Настраивать
Инфраструктура, управляемая Terraform, определена в .tf
файлы, которые написаны в Язык конфигурации Hashicorp (HCL) или JSON. Terraform поддерживает переменную интерполяцию на основе различных источников, таких как файлы, переменные среды, другие ресурсы и т. Д.
Файлы определения являются декларативными, описывая, как должна выглядеть окончательное изображение. Если текущее состояние не удовлетворяет определению, ресурсы будут скорректированы, например, уничтожен и воссоздан, чтобы соответствовать желаемому состоянию.
Чтобы инициализировать каталог Terraform, вы выполняете Terraform Init
командование Конечно, у вас должен быть терраформ Установлен Анкет Terraform хранит свое состояние в так называемом Бэкэнд Анкет Для этого простого примера мы собираемся использовать местный Бэкэнд, который хранит государство в Terraform.tfstate
Файл в рабочем каталоге. В сценарии производства вы можете выбрать разные бэкэнд в зависимости от ваших потребностей.
Инициализация также загрузит требуемый поставщики , в нашем случае для AWS. Поставщик используется в качестве абстракции для взаимодействия с ресурсами. Поставщик AWS позволяет нам управлять ресурсами AWS.
Давайте создадим новый файл определения под названием Пример.tf
Анкет
# example.tf provider "aws" { region = "eu-central-1" }
Бег Terraform Init
даст следующий выход:
Initializing provider plugins... ... * provider.aws: version = "~> 1.21" ... Terraform has been successfully initialized!
Основные команды
На данный момент нам понадобятся четыре основные команды: план
, применить
, Показать
и уничтожить
Анкет Аналогично init
командование их можно выполнить, используя Terraform CLI ( terraform
).
План терраформ
используется для оценки текущего и желаемого состояния вашей инфраструктуры и рассказать вам, какие операции необходимы для выполнения двух совпадений. Для полной предсказуемости вы можете сохранить план, чтобы убедиться, что, когда вы запустите его, не происходит неожиданного, в случае, если ваше текущее состояние изменилось в то же время. Если в этом случае Terraform обнаружит любые расхождения, он прервет заявку.
терраформ применить
используется для выполнения необходимых операций, чтобы достичь желаемого состояния инфраструктуры. Будут созданы отсутствующие ресурсы, и модификации вызовут изменения в существующих ресурсах.
Terraform Show
может использоваться для осмотра текущего состояния инфраструктуры. Хотя это в основном полезно для отладки, в некоторых случаях это может быть очень полезно.
Terraform Drouss
удалит все определенные ресурсы. Полезно, если вам больше не нужна ваша инфраструктура, или ваш босс сказал вам сократить некоторые расходы.
Шаги
Добавить экземпляр EC2
Сначала мы собираемся добавить новый экземпляр EC2 на основе изображения Ubuntu 14.04. Обратите внимание, что мы настроили регион Франкфурта ( eu-central-1
) и идентификатор Ami-23A48CC8
зависит от региона. Вы можете использовать Ubuntu Ami Locator Чтобы найти правильное изображение для вашего региона. Давайте установим это изображение на t2.micro
экземпляр, который включен в бесплатный уровень Анкет
# example.tf provider "aws" { ... } resource "aws_instance" "example" { ami = "ami-23a48cc8" # Ubuntu 14.04 LTS AMD64 in eu-central-1 instance_type = "t2.micro" }
Бег План терраформ
скажет нам, что он создаст новый экземпляр, как только мы применим изменения:
Terraform will perform the following actions: + aws_instance.example id:ami: "ami-23a48cc8" instance_type: "t2.micro"
Помимо id
Поле есть много других
Поля, которые я на данный момент исключил из наклеженного вывода. Вычисленное поле означает, что Terraform даст значение после выполнения плана. Позже увидим, как мы можем получить доступ к этим вычисленным значениям непосредственно, кроме использования Terraform Show
Анкет
Теперь, когда мы определили экземпляр, давайте продолжим подготовку аутентификации открытого ключа для нашего SSH -сервера.
Добавить открытый ключ
В дополнение к управлению виртуальными машинами в EC2, AWS позволяет вам Управляйте своими общественными ключами также. Чтобы войти в систему с нашей публичной/частной парой ключей, нам нужно создать новый открытый ключ внутри AWS. Мы можем добавить новый aws_key_pair
ресурс в наш файл определения:
# example.tf provider "aws" { ... } resource "aws_instance" "example" { ... } resource "aws_key_pair" "my-key" { key_name = "my-key" public_key = "${file("~/.ssh/id_rsa.pub")}" }
Как вы можете видеть, мы вменяли ключ из файла открытого ключа. Вы также можете сохранить клавиши в отдельном файле переменной или вставить их напрямую, например.
Однако добавить открытого ключа недостаточно. Нам нужно связать набор правил брандмауэра с нашим экземпляром, чтобы правильно направить трафик SSH в порт 22.
Добавить группу безопасности
В AWS вы управляете входящим и исходящим трафиком, определяя Правила безопасности Анкет Давайте добавим новый aws_security_group
Это пересылает любое входящее соединение TCP в порту 22.
# example.tf provider "aws" { ... } resource "aws_instance" "example" { ... } resource "aws_key_pair" "my-key" { ... } resource "aws_security_group" "allow_ssh" { name = "allow_ssh" # SSH access ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
Выглядит неплохо! Теперь, когда у нас есть экземпляр EC2, а также публичный ключ и правила безопасности, единственное, что нам нужно сделать, это подключить их вместе.
Обновите экземпляр EC2
Чтобы объявить зависимость между ресурсами Terraform, вы просто используете переменную из другого ресурса. Доступа к aws_key_pair.my-key.key_name
и aws_security_group.allow_ssh.name
из -за aws_instance.example
Ресурс, Terraform узнает, что сначала он должен создать ключ и группу безопасности. Теперь мы можем изменить наш экземпляр примера для использования определенных ключей и групп безопасности:
# example.tf provider "aws" { ... } resource "aws_instance" "example" { ami = "ami-23a48cc8" # Ubuntu 14.04 LTS AMD64 in eu-central-1 instance_type = "t2.micro" key_name = "${aws_key_pair.my-key.key_name}" security_groups = ["${aws_security_group.allow_ssh.name}"] } resource "aws_key_pair" "my-key" { ... } resource "aws_security_group" "allow_ssh" { ... }
Давайте выполнить терраформ применить
Анкет Сначала он напечатает план и попросит подтверждения:
Terraform will perform the following actions: + aws_instance.example ... + aws_key_pair.my-key ... + aws_security_group.allow_ssh ...
Если мы утвердим, ресурсы будут созданы в правильном порядке. Terraform параллелизирует создание независимых ресурсов.
aws_key_pair.my-key: Creating... aws_security_group.allow_ssh: Creating... aws_key_pair.my-key: Creation complete after 0s (ID: my-key) aws_security_group.allow_ssh: Creation complete after 2s (ID: sg-0231ae1c04f2f9556) aws_instance.example: Creating... aws_instance.example: Still creating... (10s elapsed) aws_instance.example: Still creating... (20s elapsed) aws_instance.example: Creation complete after 22s (ID: i-0761f0d410df33154) Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Удивительно! Но как мы узнаем, с чем подключиться? Как называется сервер? Мы могли бы использовать Terraform Show
или консоль AWS, чтобы узнать. Но есть гораздо более приятный путь.
Результат
Мы можем добавить вывод
Объявления файлов DefineTon, которые дадут нам доступ к вычисленным значениям сразу после успешного выполнения. Финал Пример.tf
Похоже:
# example.tf provider "aws" { region = "eu-central-1" } resource "aws_instance" "example" { ami = "ami-23a48cc8" # Ubuntu 14.04 LTS AMD64 in eu-central-1 instance_type = "t2.micro" key_name = "${aws_key_pair.my-key.key_name}" security_groups = ["${aws_security_group.allow_ssh.name}"] } resource "aws_security_group" "allow_ssh" { name = "allow_ssh" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_key_pair" "my-key" { key_name = "my-key" public_key = "${file("~/.ssh/id_rsa.pub")}" } output "example_public_dns" { value = "${aws_instance.example.public_dns}" }
Теперь терраформ применить
даст нам имя сервера:
Outputs: example_public_dns = ec2-18-184-130-203.eu-central-1.compute.amazonaws.com
И выполнять SSH Ubuntu@
успешно, как и ожидалось:
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-149-generic x86_64) ubuntu@ip-172-31-47-208:~$
После того, как вы закончите, не забудьте уничтожить инфраструктуру, используя Terraform Drouss
так как это больше не нужно.
В этом сообщении мы видели, как рассматривать вашу инфраструктуру как об неизменных компонентах, определенных в коде контролируемого версией. Инфраструктура как код может улучшить воспроизводимость, скорость и качество вашего развертывания. Существует много разных инструментов, чтобы поддержать эту парадигму.
Использование инструмента оркестровки, такого как Terraform вместе с неизменными контейнерами или изображениями виртуальных машин, является действительной альтернативой традиционным инструментам управления конфигурацией, таким как Ansible или Puppet. Terraform поддерживает множество различных поставщиков ресурсов и позволяет настраивать бэкэнды для хранения своего состояния.
Какие инструменты вы используете для управления своей инфраструктурой? Вы раньше использовали какие -нибудь из упомянутых инструментов? Вы предпочитаете инструменты управления конфигурацией, инструменты управления оркестровками или комбинацию обоих? Дайте мне знать, что вы думаете в комментариях!
Покрытие изображения, лицензированное в соответствии с cc by-sa 3.0, https://commons.wikimedia.org/w/index.php?curid=1194108 Анкет
Оригинал: «https://dev.to/frosnerd/infrastructure-as-code—managing-aws-with-terraform-i9o»