Установка Terraform и создание VPC в AWS на Ubuntu

Зачем это нужно
Terraform — инструмент Infrastructure as Code (IaC). Он позволяет описывать инфраструктуру в виде человеко-читаемых конфигураций и применять эти описания последовательно и повторимо. Terraform хранит состояние (state) — это источник истины для ресурсов. Правильное использование Terraform упрощает воспроизводимость, аудит и автоматизацию развертываний в облаках (AWS, GCP, Azure и др.).
Предварительные требования
- Аккаунт AWS (создайте, если нет).
- EC2-инстанс для работы (если вы будете запускать команды с удалённого сервера).
- root-доступ или права sudo на машине Ubuntu.
- Учётные данные AWS: access_key и secret_key (рекомендуется не хранить их в открытых файлах, см. раздел безопасности).
Важно: никогда не публикуйте реальные секретные ключи в репозитории.
Что мы сделаем
- Установим Terraform на Ubuntu.
- Напишем Terraform-конфигурацию для VPC в AWS.
- Применим конфигурацию и проверим VPC в консоли AWS.
- Удалим созданные ресурсы.
Установка Terraform на Ubuntu
Установка простая: скачиваем архив с релизом HashiCorp, распаковываем бинарь и помещаем в /usr/local/bin.
Перед загрузкой установите wget и unzip (если они ещё не установлены):
apt-get update -y
apt-get install wget unzip -y

Создадим рабочую директорию под загрузку:
cd /opt/
mkdir terraform
cd terraform/
Скачиваем и распаковываем конкретную версию (пример):
wget https://releases.hashicorp.com/terraform/0.12.18/terraform_0.12.18_linux_amd64.zip
unzip terraform_0.12.18_linux_amd64.zip
ls -lt
После распаковки в каталоге появится бинарный файл terraform. Перенесём его в /usr/local/bin и проверим версию:
mv terraform /usr/local/bin/
terraform -v

Примечание: при необходимости используйте более новую версию Terraform; документация HashiCorp подскажет совместимость провайдеров.
Написание конфигураций Terraform
Создайте отдельный каталог для конфигураций и откройте его в удобном редакторе:
mkdir terraform
cd terraform/
В примере ниже создаются файлы variables.tf, terraform.tfvars и main.tf. main.tf отвечает за создание VPC, интернет-шлюза, маршрутов, подсетей и группы безопасности. Файлы переменных отделяют секреты и параметры окружения.
vim main.tf
provider "aws" {
region = "${var.region}"
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
}
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
}
resource "aws_internet_gateway" "gateway" {
vpc_id = "${aws_vpc.vpc.id}"
}
resource "aws_route" "route" {
route_table_id = "${aws_vpc.vpc.main_route_table_id}"
destination_cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.gateway.id}"
}
data "aws_availability_zones" "available" {}
resource "aws_subnet" "main" {
count = "${length(data.aws_availability_zones.available.names)}"
vpc_id = "${aws_vpc.vpc.id}"
cidr_block = "10.0.${count.index}.0/24"
map_public_ip_on_launch = true
availability_zone = "${element(data.aws_availability_zones.available.names, count.index)}"
}
resource "aws_security_group" "default" {
name = "http-https-allow"
description = "Allow incoming HTTP and HTTPS and Connections"
vpc_id = "${aws_vpc.vpc.id}"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}Создайте файл переменных variables.tf:
vim variables.tf
variable "access_key" {
description = "Access key to AWS console"
}
variable "secret_key" {
description = "Secret key to AWS console"
}
variable "region" {
description = "Region of AWS VPC"
}Внимание по безопасности: в примерах часто используют terraform.tfvars, но хранить реальные ключи в файлах небезопасно. Лучше использовать переменные окружения, профиль AWS CLI или секретные хранилища.
Создайте terraform.tfvars — в примере ниже значения заменены на заглушки. Замените на свои параметры безопасным способом.
vim terraform.tfvars
region = "eu-west-3"
access_key = "REPLACE_WITH_YOUR_AWS_ACCESS_KEY"
secret_key = "REPLACE_WITH_YOUR_AWS_SECRET_KEY"Теперь в директории должны быть три файла: variables.tf, terraform.tfvars и main.tf.
Применение конфигурации и создание VPC
- Инициализация провайдера и плагинов:
terraform init
Это скачает нужный провайдер aws и подготовит рабочую директорию.

- Просмотр плана изменений (без внесения изменений):
terraform plan
Команда покажет, какие ресурсы будут созданы, изменены или удалены.

- Применение плана и создание ресурсов:
terraform apply
Вы увидите запрос подтверждения; после согласия Terraform создаст ресурсы согласно main.tf.

После создания зайдите в консоль AWS → VPC, чтобы убедиться, что VPC, подсети и шлюз созданы.

Удаление созданных ресурсов
Чтобы удалить все ресурсы, созданные Terraform, используйте:
terraform destroy
Команда покажет план удаления и попросит подтверждение. Это безопасный способ откатить изменения и удалить все ресурсы, которыми управляет текущее состояние Terraform.

Рекомендации по безопасности и управлению состоянием
Важно:
- Никогда не храните реальные access_key/secret_key в репозитории. Используйте переменные окружения (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY), AWS CLI профили или секретные менеджеры.
- Храните state-файл в удалённом бэкенде (например, S3 + DynamoDB для блокировки) для совместной работы команды.
- Ограничьте права IAM для аккаунта, используемого Terraform, принципом наименьших привилегий.
- Шифруйте резервные копии state-файлов.
Краткий checklist по безопасности:
- Настроить S3-бакет для backend и включить версионирование.
- Настроить блокировку с помощью DynamoDB (для S3 backend).
- Не коммитить terraform.tfvars в репозиторий.
- Использовать ротацию ключей и MFA для важных аккаунтов.
Отладка и распространённые ошибки
- Ошибка провайдера: убедитесь, что версия Terraform совместима с версией провайдера aws.
- Доступ запрещён: проверьте права IAM и регион.
- Конфликт состояний: используйте блокировку бэкенда (DynamoDB) и не редактируйте state вручную.
- Проблемы с доступом к Интернету для провайдера: проверьте прокси и сетевые правила.
Когда показанный plan не соответствует ожиданиям, выполните terraform refresh и повторно terraform plan, чтобы синхронизировать состояние с реальностью.
Мини-методология внедрения IaC с Terraform (шаги)
- Разделять конфигурации по окружениям (dev/prod) и проектам.
- Использовать модули для повторно используемых блоков (VPC, RDS, IAM).
- Настроить CI/CD: автоматическая проверка формата (terraform fmt), статический анализ (terraform validate/terraform plan) и ручной контроль перед apply.
- Хранить state в удалённом бэкенде с блокировкой.
- Ревью плана и контроль доступа — обязательны для production.
Чит-лист команд (быстрая справка)
- terraform init — инициализация рабочей директории.
- terraform plan — просмотр плана изменений.
- terraform apply — применение изменений (создание/изменение).
- terraform destroy — удаление ресурсов.
- terraform fmt — автоформатирование конфигураций.
- terraform validate — базовая валидация конфигурации.
- terraform state list — просмотр ресурсов в state.
Чек-листы по ролям
Для Cloud Engineer:
- Проверить версии Terraform и провайдера.
- Настроить backend для state (S3 + DynamoDB).
- Проверить IAM-права.
Для DevOps:
- Настроить CI-пайплайн для проверки plan.
- Настроить хранение секретов и ротацию.
Для Developer/QA:
- Запускать terraform plan в своём workspace.
- Не выполнять apply в production без одобрения.
Критерии приёмки
- Terraform init проходит без ошибок и загружает провайдер aws.
- terraform plan показывает создание ожидаемых ресурсов (VPC, подсети, IGW, SG).
- После terraform apply ресурсы видны в консоли AWS и соответствуют CIDR/зонам.
- terraform destroy удаляет все ресурсы, указанные в state.
Короткая инструкция по безопасной настройке учётных данных
- Установите AWS CLI и создайте профиль: aws configure –profile my-terraform.
- В Terraform используйте провайдер с profile или установите переменные окружения:
export AWS_PROFILE=my-terraform export AWS_DEFAULT_REGION=eu-west-3
- Не храните секреты в terraform.tfvars в публичных репозиториях.
Частые сценарии, когда этот подход не подходит
- Управление очень большим количеством ресурсов без модулей и структуры приведёт к путанице.
- Если нужен мгновенный откат к точке во времени, state может быть недостаточен без полноценных бэкапов.
Сводка
- Terraform даёт повторяемый, декларативный подход к управлению инфраструктурой.
- Простая конфигурация позволяет создать VPC, подсети, интернет-шлюз и группу безопасности в AWS.
- Ключевые практики — безопасное хранение ключей, использование удалённого state и CI-процесса для контроля изменений.
Важно: прежде чем запускать конфигурацию в production, протестируйте её в изолированном окружении и настройте процессы безопасности и ревью.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента