DBAtlas · Veritabanı operasyon atlası

Terraform ile veritabanı provisioning (IaC)

Belirti

Amaç: Veritabanı altyapısını (instance, parametre grubu, ağ) Terraform ile kod olarak (Infrastructure as Code) tanımla; plan/apply akışı, uzak state ve drift yönetimini kur.

1. Provider'ı seç ve yapılandır (aws / google / azurerm)

Hangi bulutta çalıştığına göre provider'ı tanımla ve sürümünü sabitle. AWS için hashicorp/aws, GCP için hashicorp/google, Azure için hashicorp/azurerm provider'ını required_providers bloğunda kilitle. Sürüm kilidi, ekip arasında tutarlı davranış sağlar.

PostgreSQL

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

provider "aws" {
  region = "eu-central-1"
}

2. Uzak state ve kilidi (remote state) kur

State dosyasını yerelde bırakma; ekip çalışması ve güvenlik için uzak backend kullan. AWS'de S3 backend + DynamoDB kilit tablosu, GCP'de gcs backend, Azure'da azurerm backend (Storage Account) yaygındır. Uzak state eşzamanlı apply'ları kilitle önler ve state'i tek doğru kaynak yapar. State içinde parolalar düz metin durabileceği için backend'i şifreli ve erişimi kısıtlı tut.

PostgreSQL

terraform {
  backend "s3" {
    bucket         = "sirket-tfstate"
    key            = "db/terraform.tfstate"
    region         = "eu-central-1"
    dynamodb_table = "tf-lock"
    encrypt        = true
  }
}

3. Veritabanı kaynağını tanımla

Motor ve buluta göre ana kaynağı yaz: AWS'de aws_db_instance (veya Aurora için aws_rds_cluster), GCP'de google_sql_database_instance, Azure'da azurerm_mssql_database (SQL Server için, altında azurerm_mssql_server ile). Engine, sürüm, sınıf, depolama ve yedek penceresini burada belirt.

PostgreSQL

resource "aws_db_instance" "pg" {
  identifier        = "uygulama-db"
  engine            = "postgres"
  engine_version    = "16"
  instance_class    = "db.t3.medium"
  allocated_storage = 50
  db_name           = "uygulama"
  username          = "pgadmin"
  password          = var.db_password
  backup_retention_period = 7
}

SQL Server

resource "azurerm_mssql_database" "db" {
  name      = "uygulama"
  server_id = azurerm_mssql_server.srv.id
  sku_name  = "S1"
}

4. Parametre grubunu kod olarak yaz

Veritabanı ayarlarını (max_connections, work_mem, karakter seti) konsoldan elle değil, parametre kaynağıyla tanımla. AWS'de aws_db_parameter_group, GCP'de google_sql_database_instance içindeki settings.database_flags, Azure'da server yapılandırma kaynağı kullanılır. Böylece ayarlar sürümlenir ve tekrar üretilebilir.

PostgreSQL

resource "aws_db_parameter_group" "pg" {
  name   = "uygulama-pg16"
  family = "postgres16"

  parameter {
    name  = "max_connections"
    value = "200"
  }
}
# aws_db_instance içinde:
# parameter_group_name = aws_db_parameter_group.pg.name

5. Sırları değişken ve secret yöneticisiyle ver

Parolayı .tf dosyasına düz yazma; hassas değişken (variable ... sensitive = true) olarak tanımla ve değeri TF_VAR_ ortam değişkeni, secret yöneticisi (AWS Secrets Manager, Vault) veya CI secret'ından ver. Unutma: değer state dosyasına yazılır, bu yüzden uzak state şifreli olmalı. En temizi parolayı Terraform'a hiç girmeyip secret manager kaynağından okumaktır.

PostgreSQL

variable "db_password" {
  type      = string
  sensitive = true
}

# CI/kabuk:
export TF_VAR_db_password="$(vault kv get -field=pw secret/db)"

6. plan ve apply akışını çalıştır

Önce terraform init ile provider/backend'i hazırla, terraform plan ile ne değişeceğini gör, onayla ve terraform apply ile uygula. Plan çıktısını gözden geçirmeden apply etme; CI'da 'plan'ı PR'a yorum olarak koyup insan onayından sonra apply etmek güvenli akıştır. Yıkıcı değişiklikleri (örneğin instance yeniden oluşturma) plan çıktısında -/+ işaretinden yakala.

PostgreSQL

terraform init
terraform plan -out=plan.tfplan
terraform apply plan.tfplan

7. Drift'i tespit et ve düzelt

Biri konsoldan elle değişiklik yaparsa gerçek altyapı ile state uyuşmaz (drift). terraform plan çalıştırıp 'değişiklik yokken' çıkan farklar drift'i gösterir; terraform refresh/plan ile fark okunur. Ya değişikliği koda geri yansıt ya da apply ile altyapıyı koda geri çek. Elle değişikliği kural olarak yasakla, tek doğru kaynak kod olsun.

PostgreSQL

# drift kontrolü (değişiklik beklemiyorken):
terraform plan
# 'No changes' bekle; fark çıkarsa drift var
# import ile mevcut kaynağı state'e al:
terraform import aws_db_instance.pg uygulama-db
DBAtlas'ta aç →