🏠 Домашнее задание 7: S3-бакет через Terraform

📁 Тема: Terraform IaC + AWS S3 🏁 Финальное ДЗ курса

⚡ Суть задания

Создать три файла Terraform-конфигурации (main.tf, providers.tf, variables.tf), развернуть S3-бакет с тегами, затем удалить его через terraform destroy. Сдать скриншот apply и файл destroy-output.txt.

  • Имя бакета — через переменную bucket_name с default group-name-bucket
  • Регион — Frankfurt (eu-central-1)
  • Теги — name и environment
  • Сохранить вывод destroy: terraform destroy | Tee-Object -FilePath destroy-output.txt

Задание из LMS

Создание S3 бакета с использованием Terraform в аккаунте AWS_lab

1. Создайте три файла:

  • main.tf — для описания ресурса (S3 бакет)
  • providers.tf — для настройки провайдера AWS (регион Frankfurt)
  • variables.tf — для объявления переменной, которая задаёт имя S3 бакета с использованием значения по умолчанию

2. Имя бакета и теги:

  • Имя бакета должно задаваться через переменную bucket_name
  • Задайте значение по умолчанию для переменной bucket_name в файле variables.tf, например, "group-bucket-name", где group — ваша группа, а name — ваше имя
  • Присвойте теги для вашего бакета: name и environment

3. Используйте Terraform:

  • Выполните инициализацию, планирование и развёртывание с помощью команд terraform init, terraform plan и terraform apply

4. Удалите созданные ресурсы:

  • После успешного создания ресурса выполните команду terraform destroy для удаления S3 бакета
  • Сохраните вывод команды terraform destroy в файл destroy-output.txt

5. Загрузите как результат выполнения ДЗ:

  • Файл destroy-output.txt, содержащий вывод команды terraform destroy, который подтверждает удаление S3 бакета
  • Скриншот вывода команды terraform apply, чтобы показать, что бакет был успешно создан перед удалением, либо ссылку на GitHub-репозиторий с Terraform-кодом

Подготовка окружения

Шаг 0.1 — Установка Terraform

Проверьте, установлен ли Terraform:

# PowerShell
terraform --version

Если нет — установка через Winget (Windows 10/11):

# PowerShell (запустить как Администратор)
winget install HashiCorp.Terraform

# Перезапустить PowerShell, затем проверить
terraform --version
# Ожидаемый вывод: Terraform v1.x.x

Шаг 0.2 — Проверка AWS CLI и credentials

Terraform использует те же credentials, что и AWS CLI:

# PowerShell
# Проверить, что AWS CLI настроен
aws sts get-caller-identity

# Ожидаемый вывод — JSON с вашим Account ID и UserId:
# {
#     "UserId": "AIPAIOSFODNN7EXAMPLE",
#     "Account": "123456789012",
#     "Arn": "arn:aws:iam::123456789012:user/student"
# }

# Если нет — настроить (ключи берём из AWS Systems Manager Parameter Store)
aws configure
# AWS Access Key ID: [вставьте ключ из Parameter Store]
# AWS Secret Access Key: [вставьте секретный ключ]
# Default region name: eu-central-1
# Default output format: json

Шаг 0.3 — Создание рабочей директории

# PowerShell
mkdir hw07-terraform
cd hw07-terraform

Пошаговое решение

Связь с теорией: концепция ресурсов — в Теории (блок resource); полный пример — в Примерах (Пример 1: S3-бакет).

Шаг 1: Создайте файл providers.tf

Файл настраивает провайдер AWS с регионом Frankfurt и фиксирует версию провайдера.

# providers.tf
terraform {
  required_version = ">= 1.5.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "eu-central-1"   # Frankfurt — регион, указанный в задании
  # Credentials берутся автоматически из ~/.aws/credentials
}

Шаг 2: Создайте файл variables.tf

Файл объявляет переменную bucket_name с значением по умолчанию. Замените group на вашу группу (напр. pd2025) и name на ваше имя.

# variables.tf
variable "bucket_name" {
  description = "Глобально уникальное имя S3-бакета"
  type        = string
  default     = "pd2025-myname-bucket"   # замените group и name!
}

variable "environment" {
  description = "Название окружения"
  type        = string
  default     = "dev"
}

Шаг 3: Создайте файл main.tf

Файл описывает ресурс S3-бакета с тегами name и environment.

# main.tf
resource "aws_s3_bucket" "hw_bucket" {
  bucket = var.bucket_name

  tags = {
    name        = var.bucket_name
    environment = var.environment
  }
}
Почему именно такая структура: var.bucket_name ссылается на переменную из variables.tf. Когда нужно создать несколько окружений (dev/prod) — меняем только terraform.tfvars, а не main.tf.

Шаг 4: Инициализация

Terraform скачает провайдер AWS (~25 МБ) и создаст директорию .terraform/.

# PowerShell — в директории hw07-terraform
terraform init

# Ожидаемый вывод:
# Initializing the backend...
# Initializing provider plugins...
# - Finding hashicorp/aws versions matching "~> 5.0"...
# - Installing hashicorp/aws v5.x.x...
# Terraform has been successfully initialized!

Шаг 5: Просмотр плана

Убедитесь, что Terraform планирует создать именно то, что нужно.

# PowerShell
terraform plan

# Ожидаемый вывод:
# Terraform will perform the following actions:
#
#   # aws_s3_bucket.hw_bucket will be created
#   + resource "aws_s3_bucket" "hw_bucket" {
#       + bucket = "pd2025-myname-bucket"
#       + tags   = {
#           + "environment" = "dev"
#           + "name"        = "pd2025-myname-bucket"
#         }
#       ...
#     }
#
# Plan: 1 to add, 0 to change, 0 to destroy.
Важно: если terraform plan показывает ошибку BucketAlreadyExists в previewing — значит, имя бакета уже занято другим аккаунтом. Измените значение в variables.tf на уникальное.

Шаг 6: Создание ресурса (terraform apply)

# PowerShell
terraform apply

# Terraform снова покажет план и запросит подтверждение:
# 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    <-- введите "yes"

# Ожидаемый вывод после создания:
# aws_s3_bucket.hw_bucket: Creating...
# aws_s3_bucket.hw_bucket: Creation complete after 3s [id=pd2025-myname-bucket]
#
# Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Шаг 7: Проверка создания через AWS CLI

# PowerShell
aws s3 ls
# В списке должен появиться ваш бакет:
# 2025-06-10 12:00:00 pd2025-myname-bucket

Шаг 8: Удаление ресурса и сохранение вывода

Удалите бакет и сохраните вывод в файл destroy-output.txt:

# PowerShell — удалить ресурсы и сохранить вывод
terraform destroy | Tee-Object -FilePath destroy-output.txt

# Terraform запросит подтверждение:
# Enter a value: yes

# Ожидаемый вывод:
# aws_s3_bucket.hw_bucket: Destroying... [id=pd2025-myname-bucket]
# aws_s3_bucket.hw_bucket: Destruction complete after 1s
#
# Destroy complete! Resources: 0 destroyed.

# Проверить, что файл создан
Get-Content destroy-output.txt
Команда Tee-Object выводит текст одновременно в консоль и в файл. Это эквивалент Unix tee. Если вывод не попал в файл — повторите с более явным указанием:
# Альтернатива для PowerShell
terraform destroy 2>&1 | Tee-Object -FilePath destroy-output.txt

Проверка в VS Code

Расширение HashiCorp Terraform

Для удобной работы с .tf-файлами:

  1. Открыть VS Code Extensions: Ctrl+Shift+X
  2. Найти и установить HashiCorp Terraform (официальное расширение)
  3. Откройте папку hw07-terraform в VS Code: File → Open Folder

Расширение добавляет:

  • Подсветку синтаксиса HCL
  • Автодополнение ресурсов и аргументов
  • Подсказки при ошибках
  • Форматирование через terraform fmt

Терминал в VS Code

# Открыть терминал в VS Code: Ctrl+` (backtick)
# Все команды terraform выполняются здесь же

Что сдавать в LMS

  1. Файл destroy-output.txt с полным выводом terraform destroy
  2. Скриншот вывода terraform apply (видно сообщение «Apply complete! Resources: 1 added») ИЛИ ссылку на GitHub-репозиторий с тремя .tf файлами
Для GitHub-репозитория: убедитесь, что в .gitignore добавлены .terraform/ и *.tfstate* — эти файлы не нужно коммитить.

Связь с теорией и примерами


Поздравляем с завершением курса Docker & Cloud Tech!

За 7 уроков вы прошли путь от основ контейнеризации до Infrastructure as Code:

  • Docker: образы, контейнеры, Dockerfile, Docker Compose
  • Облачные вычисления: AWS Global Infrastructure, IAM, EC2, S3
  • AWS CLI и Boto3: управление инфраструктурой из кода
  • Terraform: декларативное описание инфраструктуры как кода

Вы готовы к работе с облачной инфраструктурой в реальных проектах!

🎓 К оглавлению курса Docker & Cloud Tech