Створення Production-Ready мультисередовищної AWS інфраструктури з Terraform

Мультисередовищна AWS інфраструктура з Terraform

Виклик мультисередовищної інфраструктури

Управління кількома AWS середовищами—розробка, тестування, production—створює фундаментальну дилему: дублювати все і потроїти витрати, або ділити ресурси і ризикувати зв'язаністю середовищ. Ручні AWS розгортання ускладнюють проблему через дрейф конфігурації, повільне провіжнінг (години замість хвилин) та документацію, яка ніколи не відповідає реальності.

Infrastructure as Code з Terraform вирішує ці проблеми, але патерни реалізації мають значення. Ця стаття документує протестовані в production підходи для мультисередовищної AWS інфраструктури, демонструючи як збалансувати економічну ефективність, операційну простоту та швидкість команди.

Ключові результати:

  • 40% оптимізація ресурсів через стратегічне спільне використання інфраструктури
  • 88% скорочення часу розгортання (120 хвилин → 15 хвилин)
  • Спільна інфраструктура масштабується на ~40% на середовище (vs 100% дублювання)
  • Повне провіжнінг середовища за хвилини через terraform apply

Deployment Time Comparison

Архітектура: спільний фундамент, ізольовані сервіси

Основний патерн: ділити інфраструктуру з незначним ризиком ізоляції (VPC, RDS, ECR), дублювати ресурси, що вимагають незалежності (ECS, CloudFront, S3).

CloudFront CDNS3 Static AssetsApplication LoadBalancerECS Container1ECS Container2ECS Container3PostgreSQLRDSS3 Data StorageSQS QueuesLambdaFunctionsInternetAWS CloudContent DeliveryApplication LayerData LayerAsync Processing

Стек сервісів:

  • Обчислення: ECS на EC2 (на 40% дешевше ніж Fargate з прийнятною складністю)
  • База даних: Єдиний RDS PostgreSQL з ізоляцією на рівні схем
  • Зберігання: S3 + CloudFront для кожного середовища (запобігає забрудненню кешу між staging/prod)
  • Serverless: Lambda для обробки зображень, AI генерації контенту (AWS Bedrock)
  • Черги: SQS для фонових завдань з dead-letter чергами

Структура мультисередовищ

Production

Тестування

Розробка

Спільна інфраструктура

VPC & Мережа

10.0.0.0/16

RDS PostgreSQL

Multi-AZ, Ізоляція схем

ECR Container Registry

Версіонування за тегами

ECS Cluster

t3.small

CloudFront

dev.domain.com

S3 Buckets

ECS Cluster

t3.medium

CloudFront

staging.domain.com

S3 Buckets

ECS Cluster

t3.large

CloudFront

domain.com

S3 Buckets

Оптимізація ресурсів:

  • Єдиний RDS vs 3 інстанси: 65% зниження витрат
  • Спільний VPC усуває дублювання мережевих витрат
  • ECR з тегами (dev-v1.0.0, prod-v1.0.0) vs окремі реєстри
  • Загалом: 40% оптимізація ресурсів

Реалізація: структура директорій

Реалізація організовує Terraform конфігурацію в два окремі шари з чітким розділенням відповідальності.

Організація директорій

terraform/
├── shared/              # Розгорнути один раз, обслуговує всі середовища
│   ├── main.tf         # Remote state backend
│   ├── vpc.tf          # VPC, subnets, NAT
│   ├── rds.tf          # PostgreSQL Multi-AZ
│   ├── ecr.tf          # Container registry
│   ├── security.tf     # Security groups
│   └── outputs.tf      # Export IDs
│
├── environments/        # Змінні для кожного середовища
│   ├── dev.tfvars      # Конфігурація розробки
│   ├── staging.tfvars  # Конфігурація тестування
│   └── prod.tfvars     # Конфігурація production
│
├── main.tf             # Remote state references
├── ecs.tf              # Task definitions
├── lb.tf               # Load balancers
├── cloudfront.tf       # CDN distributions
├── s3.tf               # Storage buckets
├── ssm.tf              # Credentials
└── sqs.tf              # Async queues

Поля спільної інфраструктури

Конфігурація VPC (shared/vpc.tf):

  • Розподіл CIDR блоків (зазвичай /16)
  • Публічні підмережі через зони доступності
  • Приватні підмережі для бази даних та контейнерів
  • NAT інстанси (не NAT Gateway для оптимізації витрат)
  • Таблиці маршрутизації та асоціації

Конфігурація RDS (shared/rds.tf):

  • Розмір класу інстансу (почати з db.t3.micro)
  • Multi-AZ розгортання для автоматичного failover
  • Збереження резервних копій (7-30 днів)
  • Версія движка (PostgreSQL 16+)
  • Групи підмереж посилаються на приватні підмережі VPC
  • Security groups обмежують доступ тільки для ECS
  • Захист lifecycle prevent_destroy

Конфігурація ECR (shared/ecr.tf):

  • Конвенція імен репозиторіїв
  • Налаштування мутабельності тегів образів
  • Політики життєвого циклу для очищення (нетеговані образи, старі релізи)
  • Конфігурація шифрування (AES256)

Поля для кожного середовища

ECS Task Definition (ecs.tf):

  • Іменування сімейства з суфіксом середовища
  • Розподіл CPU та пам'яті (змінюється за середовищем)
  • Визначення контейнерів через templatefile
  • Мережевий режим (awsvpc для сучасних конфігурацій)
  • IAM execution та task ролі
  • Змінні середовища та секрети з SSM

Конфігурація ECS Service:

  • Бажана кількість task (масштабується за середовищем)
  • Тип запуску (EC2 vs Fargate)
  • Мережева конфігурація посилається на спільний VPC
  • Приєднання load balancer до target groups
  • Політики автомасштабування на основі CPU/пам'яті

CloudFront Distribution (cloudfront.tf):

  • Конфігурація origin вказує на S3 buckets
  • Політики поведінки кешу
  • SSL сертифікати з ACM
  • Вибір класу ціни (всі edges vs регіональні)
  • Користувацькі відповіді на помилки для SPA маршрутизації

S3 Buckets (s3.tf):

  • Іменування bucket з суфіксом середовища
  • CORS конфігурація для завантаження assets
  • Політики bucket обмежують доступ до CloudFront
  • Конфігурація шифрування в спокої

Патерн управління станом

Remote State Backend (shared/main.tf):

  • S3 bucket для зберігання стану
  • DynamoDB таблиця для блокування стану
  • Увімкнене шифрування
  • Версіонування для можливості відкату

Remote State References (main.tf):

  • Джерела даних terraform_remote_state
  • Споживання виводів спільного шару (VPC ID, subnet IDs, security groups)
  • Управління залежностями між шарами

Ця структура дозволяє незалежне розгортання спільної інфраструктури, водночас дозволяючи кожному середовищу масштабувати та налаштовувати ресурси незалежно через файли змінних.

Результати та уроки

Ключові метрики

Виграш в ефективності:

  • Розгортання інфраструктури: 2 години → 15 хвилин (88% скорочення)
  • Витрати на ресурси: 40% оптимізація через стратегічне спільне використання
  • Характеристики масштабування: Додавання середовища = +40% вартості (не +100%)
  • Провіжнінг середовища: Хвилини через terraform apply vs дні ручної роботи

Scaling Cost Comparison

Операційний вплив:

  • Multi-AZ RDS: Автоматичний failover без ручного втручання
  • Інфраструктура як документація: Terraform файли визначають всі ресурси
  • Disaster recovery: Відновити всю платформу з коду
  • Швидкість команди: Розробники самообслуговують тестові середовища

Що спрацювало

Спільний RDS зі схемами: Надійно, економічно, операційно просто ✅ ECS на базі EC2: На 40% дешевше ніж Fargate з прийнятною складністю ✅ Remote state в S3: Дозволяє співпрацю команди з DynamoDB блокуванням ✅ Terraform як документація: Код завжди відповідає реальності

Підводних каменів уникати

Обробка state файлу: Вимагає ретельного управління та регулярних резервних копій ❌ Накопичення резервних копій RDS: Моніторити та очищати старі snapshot ❌ CloudFront invalidations: Використовувати версійовані імена файлів для уникнення зборів ❌ Зміни спільних ресурсів: Координувати ретельно—впливає на всі середовища

Висновок

Мультисередовищна Terraform інфраструктура забезпечує 40% оптимізацію витрат та 88% швидше розгортання при збереженні належної ізоляції. Патерн—спільні VPC/RDS/ECR, окремі ECS/CloudFront/S3 для середовищ—балансує ефективність з незалежністю.

Шлях реалізації:

  1. Розгорнути спільну інфраструктуру (VPC, RDS, ECR)
  2. Повністю налаштувати одне середовище
  3. Реплікувати патерн на додаткові середовища
  4. Використовувати remote state та state locking з першого дня

Коли це має сенс:

  • Управління 3+ середовищами
  • Команди більше 5 інженерів
  • Часті зміни інфраструктури
  • Потреба у відтворюваних розгортаннях

Ресурси: