Поиск по сайту:

Как запустить инстансы 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.

Чтобы разбить поиск, который вы выполняете в разделе данных, выполните следующие действия:

  1. Используя most_recent=true , возвращайте самый новый результат, только если возвращаются несколько AMI
  2. Отфильтруйте имя AMI, чтобы оно соответствовало ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*
  3. Наконец убедитесь, что владельцы принадлежат самой AMI, в данном случае 099720109477data «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 сэкономит вам много времени и усилий в будущем!