Настроить инфраструктуры или сервисы на Amazon Web Services (AWS) с помощью веб-интерфейса действительно просто и удобно. Нам, как инженерам, действительно помог веб-интерфейс, который информативен и позволяет выполнить настройку всего несколькими щелчками мыши.

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

Чтобы решить эту проблему, существует метод, который можно использовать, когда мы хотим настроить или предоставить услуги на AWS. Этот метод называется «Инфраструктура как код» (IaC).

С помощью IaC мы можем настроить, создав строку кодов, которые позже будут переведены системой, чтобы она могла предоставлять услуги на AWS. Но IaC не только для предоставления сервисов AWS. Его также можно использовать для предоставления услуг другим поставщикам общедоступного облака или когда мы хотим настроить локальную инфраструктуру. Его также можно использовать для подготовки контейнерных инфраструктур, таких как Docker или Kubernetes.

Ниже приведены некоторые ключевые выводы о IaC:

  • Конфигурация с использованием строки кодов, понятных человеку
  • Мы можем применить культуру DevOps. С помощью IaC коды можно сохранять или выгружать в систему управления версиями или в систему управления исходным кодом, такую ​​как репозиторий git. Благодаря этому команда может легко сотрудничать.
  • Настроить код декларативным методом
  • Поскольку код объявляет с использованием декларативного метода, он может ускорить процесс подготовки. Это также может минимизировать человеческий фактор.

Одним из широко используемых в настоящее время инструментов «Инфраструктура как код» является Terraform. Terraform разработан Hashicorp.

В этой статье я хочу объяснить, как настроить или подготовить сервис AWS с помощью Terraform. Сценарий, который я использую: я хочу подготовить Amazon EC2 с AMI Ubuntu 20.04. Пара ключей уже создана или использует существующую пару ключей. EC2 будет работать в регионе ap-southeast-1 (Сингапур). VPC и группа безопасности по умолчанию. Terraform использует интерфейс командной строки Terraform, установленный на ноутбуке. Ниже приводится краткое описание топологии:

Предпосылки

Перед началом настройки необходимо подготовить несколько компонентов, таких как:

  • Установленный интерфейс командной строки Terraform. Для установки, пожалуйста, обратитесь: https://learn.hashicorp.com/tutorials/terraform/install-cli
  • Ключ доступа AWS, секретный ключ доступа, профиль (может быть профилем по умолчанию или именованным профилем), который был настроен через интерфейс командной строки AWS. Обратитесь к этому руководству для справки: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

Настроить код Terraform

Первоначальную настройку можно запустить, написав коды терраформирования.

В этой статье я создаю 1 папку с именем ec2, в которой содержатся 3 кода терраформ (файл с расширением .tf). Это файлы main.tf, variables.tf и outputs.tf.

Ниже представлена ​​структура каталогов / папок:

terraform-template-aws
|_ec2
  |_main.tf
  |_outputs.tf
  |_variables.tf
  1. Начнем с объяснения main.tf

В файле terraform должен быть provider. Провайдер действует как плагин terraform для запуска API в отношении сервисов предоставления, таких как AWS.

Конфигурацию можно запустить с помощью блока настроек configure terraform, который ссылается на поставщика AWS и его версию. Провайдер будет извлечен из реестра terraform. Пожалуйста, обратитесь к этому URL-адресу для Terraform AWS Provider: https://registry.terraform.io/providers/hashicorp/aws/latest/docs

# Setup terraform aws provider and version
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 3.49.0" # Please change version that will be used here
    }
  }
}

2. Затем настройте регион и учетные данные. Метод учетных данных, который я использую в этой статье, использует файл общих учетных данных, который ссылается на файл .aws / credential. Файл и профиль будут ссылаться на переменные, определенные в variables.tf.

# Setup aws region and credentials
provider "aws" {
  region                  = "ap-southeast-1"
  shared_credentials_file = var.aws_credential_file
  profile                 = var.aws_credential_profile
}

3. Затем соберите последний идентификатор AMI Ubuntu 20.04, полученный из общедоступного хранилища параметров AWS. См. Этот URL-адрес для общедоступного хранилища параметров AWS: https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html

# Get latest public ubuntu AMI ID from Parameter Store in chosen region
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

4. Следующим шагом является определение ресурса EC2. AMI ID будет получен из источника данных, который был определен на предыдущем шаге. Тогда пара ключей будет относиться к исходящей паре ключей, созданной на AWS.

Например, тип экземпляра и размер тома корневого блочного устройства EBS, который используется EC2, будет получен из переменных, определенных в variables.tf. Помимо этого, в коде я свяжу общедоступный IP-адрес с EC2 и создам новый тег с именем ключа.

# Setup EC2 instance using ubuntu AMI
resource "aws_instance" "your_ec2_instance_name" {
  ami                         = data.aws_ami.ubuntu.id
  instance_type               = var.ec2_instance_type
  associate_public_ip_address = true
  key_name                    = "your_key_pair_name"

  root_block_device {
    volume_size = var.ec2_volume_size
  }

  tags = {
    Name = "your_tag" # Please change name tag here
  }
}

5. Затем перейдите в variables.tf. В этом файле я определю переменные, которые будут использоваться в качестве ссылок в main.tf.

В этой статье я определяю переменную aws_credential_file для пути, когда находится .aws / credentials. Затем я определяю переменную aws_credential_profile, которая будет ссылаться на именованный профиль в .aws / credentials. Переменная ec2_instance_type будет определять тип экземпляра, который будет использоваться, в этой статье я выбрал t2.micro. Наконец, я определяю переменную ec2_volume_size, которая будет определять размер тома корневого блочного устройства EBS, который будет интегрирован в EC2, в этой статье я настроил 10 (ГБ).

# Define path to aws credentials file
variable "aws_credential_file" {
  type        = string
  description = "Path to aws credentials file"
  default     = "~/.aws/credentials"
}

# Define aws profile
variable "aws_credential_profile" {
  type        = string
  description = "AWS profile used for provision services"
  default     = "ludes-terraform-admin"
}

# Define EC2 instance type
variable "ec2_instance_type" {
  type        = string
  description = "Amazon EC2 instance type"
  default     = "t2.micro" # Please change ec2 instance type here
}

# Define EC2 instance volume size
variable "ec2_volume_size" {
  type        = number
  description = "Amazon EC2 instance volume size"
  default     = 10 # Please change ec2 root volume size here
}

6. Последний созданный мной файл terraform - outputs.tf. Этот файл упорядочит terraform для отображения вывода, который является общедоступным IP-адресом, используемым EC2. Этот вывод будет показан после завершения применения терраформирования или после завершения предоставления услуги терраформирования.

# Define EC2 instance volume size
variable "ec2_volume_size" {
  type        = number
  description = "Amazon EC2 instance volume size"
  default     = 10 # Please change ec2 root volume size here
}

Запуск Terraform

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

Вот шаги:

  1. Мы можем начать с проверки того, что terraform установлен.
terraform version

2. Мы можем продолжить форматирование файлов terraform. Этот процесс предназначен для того, чтобы код terraform соответствовал передовой практике или формату, одобренному terraform.

terraform fmt

3. Затем инициализируйте terraform. В этом процессе terraform установит провайдера, который был определен в коде.

terraform init

4. Затем запустите план терраформирования. В этом процессе terraform будет проверять все определенные коды terraform, а также планировать и рассчитывать, сколько и какие услуги должны быть предоставлены. При этом никакого фактического предоставления на AWS не началось.

terraform plan

5. Затем запустите terraform apply. В этом процессе terraform начнет предоставлять фактические услуги на AWS.

terraform apply

6. Если появится какое-либо подтверждающее сообщение, введите «да».

7. Существует также альтернатива, если вы не хотите, чтобы появлялось какое-либо подтверждающее сообщение, если вы уже уверены в том, что будете развертывать. Пожалуйста, введите эту команду:

terraform apply -auto-approve

8. Следующий terraform начнет предоставлять сервис AWS. Как я уже упоминал выше, в этой статье я создал код, который будет отображать вывод, который является общедоступным IP-адресом EC2. Этот вывод будет отображаться после завершения применения терраформирования.

9. Затем мы можем проверить, работает ли EC2 или нет. Перейдите в веб-консоль AWS, затем перейдите в меню экземпляра EC2. На веб-консоли мы найдем 1 EC2 с таким же именем, как мы определили в нашем коде. В статусе также упоминается, что EC2 работает. Общедоступный IP-адрес также отображает тот же IP-адрес, что и в предыдущем выводе.

11. Затем убедитесь, что мы можем подключиться к EC2 по ssh. SSH с использованием той же пары ключей, которая упоминается или определена в нашем коде terraform.

12. Убедитесь, что соединение SSH с экземпляром EC2 прошло успешно.

12. Убедитесь, что операционная система также соответствует идентификатору AMI ID, указанному в коде. Также проверьте размер тома корневого блочного устройства.

13. По умолчанию при запуске terraform apply, terraform создает 1 файл с именем terraform.tfstate. В этом файле будут отображаться все ресурсы, предоставленные terraform.

14. Мы также можем проверить, какие ресурсы создаются терраформом или какие ресурсы отслеживаются терраформом. Пожалуйста, введите эту команду:

terraform state list

15. Затем, если мы хотим удалить ресурс или услугу, которые больше не использовались. Мы также можем удалить его с помощью terraform. Ресурс или служба, которая будет удалена, - это служба, отслеживаемая по состоянию терраформ, в противном случае терраформ не удалит ее.

terraform destroy

16. То же, что и для terraform apply, terraform destroy также попросит вашего подтверждения. Введите да, чтобы продолжить.

17. В качестве альтернативы, если вы уже уверены в том, что уничтожите, вы можете ввести эту команду:

terraform destroy -auto-approve

18. Подождите, пока завершится уничтожение терраформ.

19. Затем мы также можем вернуться в веб-консоль AWS, чтобы убедиться, что экземпляр EC2 успешно завершен.

20. По умолчанию terraform создаст еще 1 файл с именем terraform.tfstate.backup. Этот файл будет отображать всю информацию о ресурсах, которые запускаются до уничтожения терраформа.

Из-за конфиденциальной информации, содержащейся в terraform.tfstate и terraform.tfstate.backup, рекомендуется хранить этот файл в безопасном хранилище, например AWS S3. Он также может действовать как резервный файл. А также не передавайте эти файлы неавторизованному персоналу вашей учетной записи AWS.

Заключение

В этой статье мы обсудили основы инфраструктуры как кода (IaC), в которой мы используем Terraform. Мы также обсудили, как выглядят файлы кода терраформирования и как их настраивать. Мы также обсудили, какие действия или задачи мы должны выполнить для предоставления сервиса AWS на основе наших кодов terraform.

Я также загрузил примеры кодов терраформирования, которые использовались в этой статье, на моем GitHub. Пожалуйста, проверьте этот URL: https://github.com/lanandra/terraform-template-aws

Надеюсь, эта статья расскажет о пользе. Благодарю вас!

Больше контента на plainenglish.io