Terraform: инфраструктура на уровне кода — страница 11 из 65

• развертывание кластера веб-серверов;

• развертывание балансировщика нагрузки;

• удаление ненужных ресурсов.


Пример кода

Напоминаю, что все примеры кода из этой книги доступны по адресу github.com/brikis98/terraform-up-and-running-code.


Подготовка вашей учетной записи в AWS

Если у вас нет учетной записи в AWS, пройдите на страницу aws.amazon.com и зарегистрируйтесь. Сразу после регистрации вы входите в систему в качестве корневого пользователя. Эта учетная запись позволяет делать что угодно, поэтому с точки зрения безопасности ее лучше не использовать регулярно. Она вам будет нужна только для создания других пользовательских учетных записей с ограниченными правами, на одну из которых вы должны немедленно переключиться26.

Чтобы создать более ограниченную учетную запись, следует использовать сервис Identity and Access Management (IAM). IAM — это то место, где происходит управ­ление учетными записями пользователей и их правами. Чтобы создать нового пользователя IAM, перейдите в консоль IAM (https://amzn.to/33fM2jf), щелкните на ссылке Users (Пользователи) и затем нажмите кнопку Create New Users (Создать новых пользователей). Введите имя пользователя и убедитесь, что флажок Generate an access key for each user (Сгенерировать ключ доступа для каждого пользователя) установлен, как показано на рис. 2.1. Имейте в виду, что AWS вносит косметические изменения в свою веб-консоль, поэтому на момент чтения этой книги страницы IAM могут немного отличаться.

Рис. 2.1. Создание нового пользователя IAM

Нажмите кнопку Create (Создать). AWS покажет вам учетные данные доступа этого пользователя, которые, как видно на рис. 2.2, состоят из ID ключа доступа (Access Key ID) и секретного ключа доступа (Secret Access Key). Их следует немедленно сохранить, поскольку их больше никогда не покажут, а они в этом руководстве еще понадобятся. Помните, что эти данные дают доступ к вашей учетной записи в AWS, поэтому храните их в безопасном месте (например, в диспетчере паролей, таком как 1Password, LastPass или OS X Keychain) и никогда никому не давайте.

Сохранив свои учетные данные, нажмите кнопку Close (Закрыть). Таким образом вы перейдете к списку пользователей IAM. Щелкните на имени пользователя, которого только что создали, и выберите вкладку Permissions (Права доступа). Новые пользователи IAM по умолчанию лишены всяких прав и, следовательно, не могут ничего делать в рамках учетной записи AWS.

Рис. 2.2. Храните свои учетные данные AWS в надежном месте. Никому их не показывайте (не волнуйтесь, те, что на снимке экрана, — ненастоящие)

Чтобы выдать пользователю IAM какие-то права, вы должны связать его учетную запись с одной или несколькими политиками IAM. Политика IAM — это документ в формате JSON, который определяет, что пользователю позволено, а что — нет. Вы можете создавать свои собственные политики или обойтись уже готовыми, которые называются управляемыми политиками27.

Для выполнения примеров из этой книги вам нужно назначить своему пользователю IAM следующие управляемые политики (рис. 2.3).

•AmazonEC2FullAccess — требуется для этой главы.

• AmazonS3FullAccess — требуется для главы 3.

• AmazonDynamoDBFullAccess — требуется для главы 3.

• AmazonRDSFullAccess — требуется для главы 3.

• CloudWatchFullAccess — требуется для главы 5.

• IAMFullAccess — требуется для главы 5.

Рис. 2.3. Назначение нескольких управляемых политик IAM вашему новому пользователю IAM


Замечание о виртуальных частных облаках по умолчанию

Если вы используете существующую учетную запись AWS, у нее уже должно быть облако VPC по умолчанию. VPC (Virtual Private Cloud — виртуальное частное облако) — это изолированная область вашей учетной записи AWS с собственными виртуальной сетью и пространством IP-адресов. Практически любой ресурс AWS развертывается в VPC. Если не указать VPC явно, ресурс будет развернут в VPC по умолчанию, которое является частью всех новых учетных записей AWS. VPC по умолчанию применяется во всех примерах в этой книге, поэтому, если по какой-то причине вы его удалили, переключитесь на другой регион (у каждого региона свое облако VPC по умолчанию) или создайте новое в веб-консоли AWS (https://amzn.to/31lVUWW). В противном случае вам придется обновить почти все примеры, добавив в них параметр vpc_id или subnet_id, который указывает на пользовательское VPC.


Установка Terraform

Вы можете загрузить Terraform на домашней странице проекта по адресу https://www.terraform.io. Щелкните на ссылке для загрузки, выберите подходящий пакет для своей операционной системы, сохраните ZIP-архив и распакуйте его в папку, в которую хотите установить Terraform. Архив содержит единственный двоичный файл под названием terraform, который следует добавить в переменную среды PATH. Как вариант, попробуйте поискать Terraform в диспетчере пакетов своей ОС; например, в OS X можно выполнить brewinstallterraform.

Чтобы убедиться, что все работает, запустите команду terraform. Вы должны увидеть инструкции по применению:

$ terraform

Usage: terraform [-version] [-help] [args]

Common commands:

    apply              Builds or changes infrastructure

    console            Interactive console for Terraform interpolations

    destroy            Destroy Terraform-managed infrastructure

    env                Workspace management

    fmt                Rewrites config files to canonical format

    (...)

Чтобы система Terraform могла вносить изменения в вашу учетную запись AWS, нужно прописать в переменных среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY учетные данные для пользователя IAM, которого вы создали ранее. Например, вот как это можно сделать в терминале Unix/Linux/macOS:

$ export AWS_ACCESS_KEY_ID=(your access key id)

$ export AWS_SECRET_ACCESS_KEY=(your secret access key)

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


Способы аутентификации

Помимо переменных среды, Terraform поддерживает те же механизмы аутентификации, что и все утилиты командной строки и SDK для AWS. Таким образом, вы сможете использовать файл $HOME/.aws/credentials, который автоматически генерируется, если запустить AWS CLI с командой configure, или роли IAM, которые можно назначить почти любому ресурсу в AWS. Подробнее об этом — в статье A Comprehensive Guide to Authenticating to AWS on the Command Line по адресу http://bit.ly/2M11muR.


Развертывание одного сервера

Код Terraform пишется на языке конфигурации HashiCorp (HashiCorp Configuration Language, или HCL) и хранится в файлах с расширением .tf28. Это декларативный язык, поэтому ваша задача — описать нужную вам инфраструктуру, а Terraform разберется с тем, как ее создать. Terraform умеет создавать инфраструктуру на разнообразных платформах (или провайдерах в терминологии проекта), включая AWS, Azure, Google Cloud, DigitalOcean и многие другие.

Код Terraform можно писать в практически любом текстовом редакторе. Если поискать, можно найти подсветку синтаксиса Terraform для большинства редакторов (обратите внимание, что вам, возможно, нужно искать по слову HCL, а не Terraform), включая vim, emacs, Sublime Text, Atom, Visual Studio Code и IntelliJ (у последнего даже есть поддержка рефакторинга, поиска вхождений и перехода к объявлению).

Первым делом при использовании Terraform обычно следует выбрать провайдера (одного или несколько), с которым вы хотите работать. Создайте пустую папку и поместите в нее файл с именем main.tf и следующим содержанием:

provider "aws" {

  region = "us-east-2"

}

Это говорит Terraform о том, что в качестве провайдера вы собираетесь использовать AWS и хотите развертывать свою инфраструктуру в регионе us-east-2. Вычислительные центры AWS разбросаны по всему миру и сгруппированы по регионам. Регионы AWS — это отдельные географические области, такие как us-east-2 (Огайо), eu-west-1 (Ирландия) и ap-southeast-2 (Сидней). Внутри каждой области находится несколько изолированных вычислительных центров, известных как зоны доступности: например, us-east-2a, us-east-2b и т. д.

Каждый тип провайдеров поддерживает создание разного вида ресурсов, таких как серверы, базы данных и балансировщики нагрузки. Обобщенный синтаксис создания ресурса в Terraform выглядит так:

resource "_" "" {

   [CONFIG ...]

}

PROVIDER — имя провайдера (предположим, aws), TYPE — тип ресурса, создаваемого в этом провайдере (вроде instance), NAME — идентификатор, с помощью которого вы хотите ссылаться на ресурс в коде Terraform (скажем, my_instance), а CONFIG содержит один или несколько аргументов, предусмотренных специально для этого ресурса.

Например, чтобы развернуть в AWS один (виртуальный) сервер (экземпляр EC2), укажите в файле main.tf ресурс aws_instance:

resource "aws_instance" "example" {

  ami           = "ami-0c55b159cbfafe1f0"

  instance_type = "t2.micro"

}

Ресурс aws_instance поддерживает много разных аргументов, но пока что вам нужны только два из них, которые являются обязательными.

•ami. Образ Amazon Machine Image (AMI), который будет запущен на сервере EC2. В AWS Marketplace (https://aws.amazon.com/marketplace/) можно найти платные и бесплатные образы. Вы также можете создать собственный экземпляр AMI, применяя такие инструменты, как Packer (обсуждение образов и шаблонизации серверов ищите в подразделе «Средства шаблонизации серверов» на с. 31). Код, представленный выше, назначает параметру ami идентификатор AMI Ubuntu 18.04 в us-east-2. Этот образ можно использовать бесплатно.