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.name5. 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.tfplan7. 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