Создать RDS MySQL через Terraform на 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.
Важно: храните секреты в безопасном хранилище переменных окружения или в секретных менеджерах. Не выкладывайте ключи в репозитории.
Что мы сделаем
- Подготовим файлы конфигурации Terraform: main.tf, variables.tf и terraform.tfvars.
- Запустим terraform init, plan и apply для создания RDS MySQL.
- При необходимости удалим всё с помощью 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.
Запуск и проверка
- Инициализация провайдера:
terraform init
Эта команда скачает провайдер AWS и подготовит директорию.
- Просмотр плана изменений:
terraform plan
- Применение плана и создание ресурсов:
terraform apply
Подтвердите применение (yes), если всё верно. По завершении вы увидите, какие ресурсы были созданы.
- Проверка в консоли 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
- Подготовка: создать VPC, приватные подсети и security group в отдельном шаге.
- Тестирование: развернуть в тестовом аккаунте с минимальными правами.
- Резервирование: включить automated backups и retention.
- Шифрование: активировать шифрование на уровне хранилища.
- Перемещение в прод: использовать 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. Обратите особое внимание на безопасность ключей и настройку бэкапов.
Важно: перед запуском в продакшене адаптируйте конфигурацию под требования безопасности, включая шифрование, ограничение доступа и хранение секретов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента