Terraform ile PostgreSQL Yönetimi

Zekiye AYDEMİR
5 min readSep 12, 2022

Terraform, AWS, Google Cloud ve Azure bulut ortamları başta olmak üzere birden çok bulut platformunda altyapıyı düzenlenmemizi ve otomatikleştirmemizi mümkün kılar. Terraform konfigürasyon otomasyonu ve güvenilir orkestrasyon sağlar. Bu özelliğiyle Terraform, veritabanı işlemlerinde de kullanılabilir.

PostgreSQL sağlayıcısı(provider), kaynakları bir PostgreSQL sunucusunda dağıtma ve yapılandırma imkanı verir. Terraform ile PostgreSQL veritabanına bağlanarak yeni veritabanı ve kullanıcılar oluşturabiliriz.

Bu yazımda, PostgreSQL veritabanı ve kullanıcıları oluştururken değişkenleri kullanarak Terraform konfigürasyonunu nasıl daha dinamik hale getireceğimizi öğreneceğiz.

Terraform kurulumunu anlattığım yazıma linkten ulaşabilirsiniz.

Terraformda en çok karşılaştığımız komutlar için hazırladığım Terraform Cheatsheet’e linkten ulaşabilirsiniz.

Terraform-PostgreSQL İşlemleri

Öncelikle, projemizin dizinlerini oluşturuyoruz:

mkdir pgterraform
cd pgterraform

Dosyaların yönetimi ve üzerinde değişiklik yapmamızı kolaylaştıracak şekilde ayrı .tf dosyaları oluşturacağız.

Tüm bu adımların sonunda aşağıdaki dizin yapısını elde edeceğiz:

Öncelikle, temel bir Terraform konfigürasyonu içeren main.tf dosyası üzerinde çalışacağız. main.tf dosyasını aşağıdaki gibi oluşturup içeriği ekliyoruz:

vim main.tfterraform {
required_providers {
postgresql = {
source = "cyrilgdn/postgresql"
version = "1.17.1"
}
}
}
provider "postgresql" {
host = var.db_host
port = 5432
username = "postgres"
sslmode = "disable"
connect_timeout = 30
}
resource "postgresql_role" "create_role" {
name = var.db_owner
login = true
password = var.db_owner_password
}
resource "postgresql_database" "create_tf_db" {
name = var.db_name
owner = postgresql_role.create_role.name
lc_collate = "C"
connection_limit = -1
allow_connections = true
}
resource "postgresql_role" "create_tf_dba" {
name = var.dba_name
login = true
password = var.dba_password
}
resource "postgresql_schema" "terraform_schema" {
name = var.schema_name
owner = "postgres"
database = postgresql_database.create_tf_db.name
}

Ardından değişkenleri tanımladığımız variables.tf dosyasını oluşturuyoruz;

vim variables.tfvariable "db_host" {
description = "The host of postgresql"
default = "127.0.0.1"
}
variable "db_owner" {
description = "the user of db owner"
default = "pgElephant"
}
variable "db_owner_password" {
description = " user password"
default = "pgElephant"
sensitive = true
}
variable "db_name" {
description = "new database name"
default = "tftestdb"
}
variable "dba_name" {
description = "dba name"
default = "pineapple"
}
variable "dba_password" {
description = "dba password"
default = "Lifeisbeautiful"
sensitive = true
}
variable "schema_name" {
description = "your schema name"
default = "fruit"
}

description: Değişkeni tanımlarken açıklama girebiliriz. Bu isteğe bağlıdır.
default: Değişkene varsayılan bir değer atamak için kullanılır. Bu isteğe bağlıdır.

sensitive: Değişkene atanan değerin terraform plan ve terraform apply komutlarının çıktısında açıkca görünmemesini sağlar. Parola gibi değişkenlerde kullanabiliriz.

Son olarak, main.tf ve variable.tf dosyası ile aynı klasörde terraform.tfvars adında yeni bir dosya oluşturuyoruz. Oluşturduğumuz değişkenlere terraform.tfvars dosyasında değer atayalım;

vim terraform.tfvars db_host           = "192.168.195.240"
db_owner = "zaydemir"
db_owner_password = "123"
db_name = "buket"
dba_name = "pgElephant"
dba_password = "papatya"
schema_name = "sepet"

Değişkenleri variable.tf dosyasında tanımlarken varsayılan bir değer belirlediğimizden, terraform.tfvars dosyasında değişkende bir değer ayarlamak isteğe bağlıdır.

terraform apply komutunu çalıştırıyoruz, çıktısı aşağıdaki gibi;

[zekiye@zaydemir pgterraform]$ terraform applyTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:# postgresql_database.create_tf_db will be created
+ resource "postgresql_database" "create_tf_db" {
+ allow_connections = true
+ connection_limit = -1
+ encoding = (known after apply)
+ id = (known after apply)
+ is_template = (known after apply)
+ lc_collate = "C"
+ lc_ctype = (known after apply)
+ name = "buket"
+ owner = "zaydemir"
+ tablespace_name = (known after apply)
+ template = (known after apply)
}
# postgresql_role.create_role will be created
+ resource "postgresql_role" "create_role" {
+ bypass_row_level_security = false
+ connection_limit = -1
+ create_database = false
+ create_role = false
+ encrypted_password = true
+ id = (known after apply)
+ inherit = true
+ login = true
+ name = "zaydemir"
+ password = (sensitive value)
+ replication = false
+ skip_drop_role = false
+ skip_reassign_owned = false
+ superuser = false
+ valid_until = "infinity"
}
# postgresql_role.create_tf_dba will be created
+ resource "postgresql_role" "create_tf_dba" {
+ bypass_row_level_security = false
+ connection_limit = -1
+ create_database = false
+ create_role = false
+ encrypted_password = true
+ id = (known after apply)
+ inherit = true
+ login = true
+ name = "pgElephant"
+ password = (sensitive value)
+ replication = false
+ skip_drop_role = false
+ skip_reassign_owned = false
+ superuser = false
+ valid_until = "infinity"
}
# postgresql_schema.terraform_schema will be created
+ resource "postgresql_schema" "terraform_schema" {
+ database = "buket"
+ drop_cascade = false
+ id = (known after apply)
+ if_not_exists = true
+ name = "sepet"
+ owner = "postgres"
+ policy {
+ create = (known after apply)
+ create_with_grant = (known after apply)
+ role = (known after apply)
+ usage = (known after apply)
+ usage_with_grant = (known after apply)
}
}
Plan: 4 to add, 0 to change, 0 to destroy.Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yespostgresql_role.create_tf_dba: Creating...
postgresql_role.create_role: Creating...
postgresql_role.create_tf_dba: Creation complete after 0s [id=pgElephant]
postgresql_role.create_role: Creation complete after 0s [id=zaydemir]
postgresql_database.create_tf_db: Creating...
postgresql_database.create_tf_db: Creation complete after 0s [id=buket]
postgresql_schema.terraform_schema: Creating...
postgresql_schema.terraform_schema: Creation complete after 0s [id=buket.sepet]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
[zekiye@zaydemir pgterraform]$

psql ile bağlanarak veritabanı ve kullanıcıları kontrol edebiliriz;

Terraform ile PostgreSQL’de yaptığımız tüm işlemleri terraform destroy komutu ile geri alabiliriz.

terraform destroy

Terraformda PostgreSQL sağlayıcı(provider) ile veritabanı ve kullanıcı oluşturma işlemlerinden kısaca bahsettim. Daha detaylı bilgiye terraformun kendi sayfasından ulaşabilirsiniz.

--

--

Zekiye AYDEMİR

PostgreSQL Certified DBA | MongoDB Certified DBA | AWS Certified Admin