Гид по технологиям

Создать RDS MySQL через Terraform на AWS

• 5 min read • AWS • Обновлено 22 Nov 2025
Создать RDS MySQL через Terraform на AWS
Создать RDS MySQL через Terraform на AWS

Диаграмма развертывания RDS MySQL в AWS

Из этой статьи вы узнаете, как создать экземпляр RDS MySQL в AWS с помощью Terraform. Предполагается базовое знание Terraform и сервиса AWS RDS. Если вы предпочитаете графический интерфейс, поищите руководство «How to setup an RDS MySql instance on AWS» в консоли AWS.

Коротко о задаче

Мы подготовим конфигурацию Terraform, запустим создание инстанса RDS MySQL, проверим его в консоли AWS и покажем, как безопасно удалить созданные ресурсы.

Предварительные требования

  • Базовые знания Terraform.
  • Установленный Terraform на вашей машине.
  • Учётная запись AWS.
  • Пара ключей access_key и secret_key для IAM-пользователя с правами создания ресурсов RDS/VPC/EC2.

Важно: храните секреты в безопасном хранилище переменных окружения или в секретных менеджерах. Не выкладывайте ключи в репозитории.

Что мы сделаем

  1. Подготовим файлы конфигурации Terraform: main.tf, variables.tf и terraform.tfvars.
  2. Запустим terraform init, plan и apply для создания RDS MySQL.
  3. При необходимости удалим всё с помощью terraform destroy.

Структура рабочей директории

Создайте отдельную папку для конфигураций и перейдите в неё:

mkdir terraform cd terraform

Можете использовать любой редактор (vim, VS Code, nano).

main.tf — описание ресурсов

Файл main.tf создаёт AWS RDS MySQL, группу подсетей, подсети и security group. Он читает значения из variables.tf и terraform.tfvars.

Создайте файл main.tf и вставьте следующий блок (содержимое оставлено без перевода, чтобы сохранить валидность Terraform):

provider "aws" {
      region     = "${var.region}"
      access_key = "${var.access_key}"
      secret_key = "${var.secret_key}"
}
resource "aws_db_instance" "default" {
  depends_on             = ["aws_security_group.default"]
  identifier             = "${var.identifier}"
  allocated_storage      = "${var.storage}"
  engine                 = "${var.engine}"
  engine_version         = "${lookup(var.engine_version, var.engine)}"
  instance_class         = "${var.instance_class}"
  name                   = "${var.db_name}"
  username               = "${var.username}"
  password               = "${var.password}"
  vpc_security_group_ids = ["${aws_security_group.default.id}"]
  db_subnet_group_name   = "${aws_db_subnet_group.default.id}"
  skip_final_snapshot = "true"
}

resource "aws_db_subnet_group" "default" {
  name        = "main_subnet_group"
  description = "Our main group of subnets"
  subnet_ids  = ["${aws_subnet.subnet_1.id}", "${aws_subnet.subnet_2.id}"]
}
resource "aws_subnet" "subnet_1" {
  vpc_id            = "${var.vpc_id}"
  cidr_block        = "${var.subnet_1_cidr}"
  availability_zone = "${var.az_1}"

  tags = {
    Name = "main_subnet1"
  }
}

resource "aws_subnet" "subnet_2" {
  vpc_id            = "${var.vpc_id}"
  cidr_block        = "${var.subnet_2_cidr}"
  availability_zone = "${var.az_2}"

  tags = {
    Name = "main_subnet2"
  }
}
resource "aws_security_group" "default" {
  name        = "main_rds_sg"
  description = "Allow all inbound traffic"
  vpc_id      = "${var.vpc_id}"

  ingress {
    from_port   = 0
    to_port     = 65535
    protocol    = "TCP"
    cidr_blocks = ["${var.cidr_blocks}"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "${var.sg_name}"
  }
}

Советы по main.tf:

  • Не используйте явные access_key/secret_key в коде репозитория. Лучше получать их из terraform.tfvars, переменных окружения или профильной конфигурации AWS CLI.
  • Параметр skip_final_snapshot = “true” означает, что при удалении инстанса снимок не сохраняется. Для продакшена лучше отключить (false) и настроить snapshots.

variables.tf — переменные конфигурации

Создайте variables.tf и вставьте следующий блок (он также оставлен для валидности Terraform):

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"
}
variable "identifier" {
  default     = "mydb-rds"
  description = "Identifier for your DB"
}

variable "storage" {
  default     = "10"
  description = "Storage size in GB"
}

variable "engine" {
  default     = "mysql"
  description = "Engine type, here it is mysql"
}

variable "engine_version" {
  description = "Engine version"

  default = {
    mysql    = "5.7.21"
  }
}

variable "instance_class" {
  default     = "db.t2.micro"
  description = "Instance class"
}

variable "db_name" {
  default     = "myfirstdb"
  description = "db name"
}

variable "username" {
  default     = "rahul"
  description = "User name"
}

variable "password" {
  description = "password, provide through your ENV variables"
  default = "rahul1234"
}
variable "subnet_1_cidr" {
  default     = "172.31.48.0/20"
  description = "Your AZ"
}

variable "subnet_2_cidr" {
  default     = "172.31.64.0/20"
  description = "Your AZ"
}

variable "az_1" {
  default     = "eu-west-3c"
  description = "Your Az1, use AWS CLI to find your account specific"
}

variable "az_2" {
  default     = "eu-west-3a"
  description = "Your Az2, use AWS CLI to find your account specific"
}

variable "vpc_id" {
  description = "Your VPC ID"
  default = "vpc-be1010d7"
}
variable "cidr_blocks" {
  default     = "0.0.0.0/0"
  description = "CIDR for sg"
}

variable "sg_name" {
  default     = "my-rds-sg"
  description = "Tag Name for sg"
}

Важное: поправьте значения по умолчанию под вашу среду — особенно vpc_id, az_1, az_2, subnet CIDR и учетные ключи.

terraform.tfvars — значения переменных

В terraform.tfvars задайте region и ключи доступа. Пример (не используйте реальные ключи публично):

region = "eu-west-3"
access_key = "AKIAQ6GAIA5XFLXF6HOV"
secret_key = "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"

Где исправить: region, access_key и secret_key замените на ваши. Лучше передавать секреты через переменные окружения или HashiCorp Vault.

Запуск и проверка

  1. Инициализация провайдера:

terraform init

Эта команда скачает провайдер AWS и подготовит директорию.

  1. Просмотр плана изменений:

terraform plan

  1. Применение плана и создание ресурсов:

terraform apply

Подтвердите применение (yes), если всё верно. По завершении вы увидите, какие ресурсы были созданы.

  1. Проверка в консоли AWS:

Откройте AWS Management Console → RDS и найдите созданный инстанс.

Удаление ресурсов

Если ресурсы больше не нужны, выполните:

terraform destroy

Обратите внимание, что при skip_final_snapshot = “true” финальный снапш не будет создан. Для сохранения данных установите false и настройте retention.

Рекомендации по безопасности и эксплуатации

  • Не храните access_key и secret_key в публичных репозиториях.
  • Используйте IAM роли для EC2 или профиль AWS CLI вместо ключей в конфигурации.
  • Включите автоматические снепшоты и устанавливайте retention для резервных копий.
  • Шифруйте данные в покое (enable_storage_encryption) и на транспортном уровне (TLS).
  • Ограничьте ingress в security group до конкретных IP/сетей и портов (обычно 3306 для MySQL).
  • Используйте отдельные учетные записи для бэкапов и мониторинга.

Рекомендации по управлению секретами

  • Храните пароли и секреты в AWS Secrets Manager или HashiCorp Vault.
  • Подключайте секреты в приложениях через IAM-политику и роле-подстановку.
  • Периодически меняйте учетные пароли и ключи доступа.

Мини-методология: как безопасно развернуть RDS через Terraform

  1. Подготовка: создать VPC, приватные подсети и security group в отдельном шаге.
  2. Тестирование: развернуть в тестовом аккаунте с минимальными правами.
  3. Резервирование: включить automated backups и retention.
  4. Шифрование: активировать шифрование на уровне хранилища.
  5. Перемещение в прод: использовать CI/CD, проверенный план и код-ревью.

Чек-лист ролей

  • DevOps:
    • Подготовить Terraform state backend (S3 + DynamoDB для блокировок).
    • Настроить CI/CD pipeline для terraform plan/apply.
  • Security Engineer:
    • Проверить IAM-политику и ограничения доступа.
    • Настроить мониторинг подозрительной активности.
  • DBA:
    • Настроить параметры инстанса MySQL (parameter group).
    • Проверить retention и восстановление из снапшотов.

Критерии приёмки

  • Инстанс RDS доступен в консоли AWS и имеет статус “available”.
  • Настройки сети (subnet group, security group) соответствуют требованиям безопасности.
  • Резервные копии созданы и план восстановления описан.
  • Секреты не хранятся в открытом виде в репозитории.

Советы по миграции и совместимости

  • При переносе с локального MySQL используйте mysqldump или AWS DMS.
  • Проверьте версию MySQL и наборы кодировок (charset/collation).
  • Для минимизации простоев применяйте репликацию или DMS с CDC.

Краткий словарь

  • RDS: управляемый сервис баз данных AWS.
  • Terraform: инструмент инфраструктуры как кода.
  • Security group: виртуальный фаервол для EC2/RDS.
  • Subnet group: логическая группа подсетей для RDS.

Итог

В статье показаны шаги от подготовки конфигурации до создания и удаления экземпляра RDS MySQL с помощью Terraform. Обратите особое внимание на безопасность ключей и настройку бэкапов.

Важно: перед запуском в продакшене адаптируйте конфигурацию под требования безопасности, включая шифрование, ограничение доступа и хранение секретов.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро