Как запустить инстансы AWS EC2 с помощью Terraform
Автоматизация может сэкономить ваше время, деньги и уменьшить количество ошибок. Одним из популярных инструментов, призванных помочь в достижении этой цели, является Terraform. Terraform предназначен для управления версиями инфраструктуры посредством конфигурации в виде кода. Еще одна распространенная практика — перенос локальных рабочих нагрузок в облако, и одна из самых популярных — Amazon Web Services (AWS). Наряду с надежным сервисом виртуальных машин (ВМ) под названием Amazon Elastic Compute Cloud (EC2) у вас есть возможность автоматизировать развертывание экземпляров EC2 через Terraform.
В этой статье мы рассмотрим практический пример развертывания экземпляра EC2 с помощью инструмента Terraform в AWS.
Терраформ
Чтобы автоматизировать вашу инфраструктуру, инструмент, который может создавать, изменять и версионировать эту конфигурацию, имеет решающее значение для успеха, в чем Terraform преуспевает. Существует четыре шага для создания и развертывания экземпляра EC2:
- Установите и инициализируйте Terraform
- Определите учетные данные и создайте конфигурацию Terraform
- Спланируйте конфигурацию Terraform (т. е. проверьте)
- Применить конфигурацию Terraform
Настройка Терраформ
Прежде чем делать что-либо еще, вам нужно загрузить Terraform и поместить его в папку, которая находится в переменной окружения пути вашей системы (или изменить путь, чтобы включить двоичную папку Terraform). К счастью, Terraform распространяется в виде одного бинарного файла, что также упрощает его обновление!
Реквизиты для входа
Во-первых, вам нужно определить наши учетные данные или то, как Terraform будет фактически получать доступ к вашей среде AWS. Существует несколько вариантов хранения ваших учетных данных, но настоятельно рекомендуется не записывать свои учетные данные жестко в файл конфигурации. Существуют более безопасные способы, которые мы рассмотрим, и они не позволяют вам управлять версиями.
Есть два возможных варианта: определить ключи доступа в переменных окружения или в файле секретов на диске. Оба хранятся вне вашего контроля версий. Давайте посмотрим на определение ваших учетных данных с помощью переменных среды.
$ export AWS_ACCESS_KEY_ID="AWSAccessKey"
$ export AWS_SECRET_ACCESS_KEY="AWSSecretKey"
$ export AWS_DEFAULT_REGION="us-west-2"
Чтобы использовать вышеуказанные учетные данные в файле конфигурации, вы фактически должны определить поставщика aws
без каких-либо параметров. Преимущество использования переменных среды заключается в том, что учетные данные не хранятся на диске. Terraform знает, что нужно искать эти имена окружения, когда он работает для поставщика aws
. Недостатком является то, что учетные данные доступны только до тех пор, пока выполняется сеанс.
provider "aws" {}
Чаще всего учетные данные хранятся на диске в расположении по умолчанию. В Linux это расположение ~/.aws/credentials
. Чтобы создать файл самостоятельно, вы должны следовать следующему формату:
[default]
aws_access_key_id=AWSAccessKey
aws_secret_access_key=AWSSecretKey
Если у вас установлен интерфейс командной строки AWS, вы можете запустить aws configure
, и он создаст для вас этот файл. Как видите, мы определяем регион в поставщике aws
и профиле default
, который соответствует тому, что мы определили в нашем файле credentials
. Кроме того, нам также необходимо определить регион, чтобы Terraform знал, где создавать ресурсы.
provider "aws" {
region = "us-west-2"
profile = "default"
}
Инициализация Терраформ
Далее вам нужно инициализировать Terraform. Если вы этого не сделали, создайте файл [provision.tf](http://provision.tf)
в своем рабочем каталоге. Внутри файла поместите информацию provider
, созданную выше, используя любой метод, который вам больше подходит.
Запустите команду terraform init
в том же месте, где вы определили свою конфигурацию. Terraform устанавливает некоторые локальные файлы и конфигурацию, чтобы обеспечить правильную работу. Теперь вы можете перейти к определению ваших учетных данных и конфигурации. Это установит поставщиков, а именно AWS, но только если у вас есть файл .tf
, содержащий базовый поставщик в каталоге, с которым вы работаете.
Определение вашей конфигурации
Теперь, когда вы настроили свои учетные данные, вы готовы определить свой экземпляр EC2. Вы собираетесь создать довольно простой экземпляр t2.micro
с последним образом Ubuntu. Несколько замечаний по следующей конфигурации. Во-первых, это раздел data
, где вы загружаете AMI, который хотите использовать. При запуске Terraform будет использовать эту информацию для фактического поиска в каталоге AWS AMI, поиска AMI и возврата идентификатора для использования в переменной data.aws_ami.ubuntu.id
.
Чтобы разбить поиск, который вы выполняете в разделе данных, выполните следующие действия:
- Используя
most_recent=true
, возвращайте самый новый результат, только если возвращаются несколько AMI - Отфильтруйте
имя
AMI, чтобы оно соответствовалоubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*
- Наконец убедитесь, что
владельцы
принадлежат самой AMI, в данном случае099720109477
data «aws_ami» «ubuntu» { most_recent=truefilter { name=«name» values=[ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*] }owners=[099720109477]
Теперь, когда вы получили AMI для использования, определите экземпляр EC2, который вы собираетесь создать. Используя очень простую конфигурацию, вы используете идентификатор, который был определен в вашем разделе data
, используете instance_type
t2.micro
и помечаете экземпляр LinuxVM
. Это все, что нужно для очень простого развертывания экземпляра.
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags = {
Name = "LinuxVM"
}
}
Во многих примерах показано $ {data.aws_ami.ubuntu.id}
, но в последних версиях, если у вас есть значение только интерполяции (то есть только какое-то значение, заключенное в $ { }
— это значение), то вы можете опустить $ {}
обертку и не ставить кавычки.
Планирование вашей конфигурации
Теперь, когда ваши разделы данных и ресурсов определены, вам нужно посмотреть, каков план для этого изменения конфигурации. Выполнив команду план терраформирования
, вы можете проверить, как на самом деле будет выглядеть результат. Вывод усекается для удобочитаемости.
user@computer# ./terraform plan
Refreshing Terraform state in-memory prior to plan...
...
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.web will be created
+ resource "aws_instance" "web" {
+ ami = "data.aws_ami.ubuntu.id"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
...
Plan: 1 to add, 0 to change, 0 to destroy.
Применение вашей конфигурации
Если все вышеперечисленное выглядит хорошо, продолжайте и примените изменения конфигурации и подготовьте свой экземпляр EC2 с помощью команды terraform apply
. Как видно из следующего вывода, Terraform показывает, какие действия происходят и какие ошибки возникают. Вывод усекается для удобочитаемости.
user@computer:~/work# ./terraform apply
data.aws_ami.ubuntu: Refreshing state...
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.web will be created
+ resource "aws_instance" "web" {
+ ami = "ami-0a7d051a1c4b54f65"
...
+ instance_type = "t2.micro"
...
+ tags = {
+ "Name" = "LinuxVM"
}
...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_instance.web: Creating...
aws_instance.web: Still creating... [10s elapsed]
aws_instance.web: Still creating... [20s elapsed]
aws_instance.web: Still creating... [30s elapsed]
aws_instance.web: Creation complete after 35s [id=i-0b1758ce816b4d346]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Терраформ и AWS
Перенос конфигурации ресурсов AWS в Terraform позволяет отслеживать изменения с помощью контроля версий и создавать повторяемые конфигурации для упрощения развертывания ресурсов. У поставщика AWS доступно множество ресурсов и источников данных. Еще более полезной является возможность определить всю вашу инфраструктуру, AWS или другую, с помощью конфигурации Terraform. Благодаря такой гибкости вы обнаружите, что Terraform сэкономит вам много времени и усилий в будущем!