Ostatnio sprawy zawodowe kierują mnie w obszary chmury – nie tej, z której certyfikowałem się niegdyś (AWS), tylko w obszar konkurenta – GCP. Niebawem – 14 kwietnia 2021 Google udostępni klientom pierwszy region w PL – stąd okazja, by opisać moje pierwsze zawodowe doświadczenia z chmurą tego dostawcy.
Spróbowałem z usługą serwisu bazy czyli Cloud SQL. Do wyboru między silnikami mamy PostgreSQL (9.6,10,11,12 i 13), MySql (5.6,5.7 i 8.0) oraz MS SQL Server 2017 (wersje Express, Web, Standard i Enterprise),
Bazy Oracle brak. No trudno.
Ponieważ coraz bardziej stawiam na automatyzację – utworzyłem skrypty Terraform, aby sobie ułatwić tworzenie takiej bazy – stąd już kroczek do CI/CD.
To moje pierwsze kroki w terraform – stąd względna prostota – narzedzie mi się podoba i chyba zostanę z nim na dłużej – i pewnie będę udoskonalał moduł.
Skrypt tworzy bazę postgresql (lub inną, ja tworzyłem tylko takie) o zadanych parametrach – w pliku variables. To co musimy mieć wcześniej skonfigurowane to sieć i klucz KMS (zakładam bowiem że baza będzie szyfrowana kluczem wskazanym przez klienta).
variables.tf:
variable "project"{
description "Project name"
type = string
default = "Project1"
}
variable "region" {
description "Region name"
type = string
default = "europe-west1"
}
variable "zone" {
description "Zone"
type = string
default = "europe-west1-a"
}
variable "encryption_key" {
description "encryption key"
type = string
default = "projects/project1/locations/europe-west1/keyRings/.../cryptoKeys/..."
}
variable "instance_name" {
description "Name of SQL Instance"
type = string
default = "Instance1"
}
variable "instance_tier" {
description "SQL Instance tier"
type = string
default = "db-f1-micro" #1cpu/614MB ram
}
variable "backup_enabled" {
description "backup needed?"
type = bool
default = "true"
}
variable "backup_pitr" {
description "Backup enabled for point in time recovery"
type = bool
default = "true"
}
variable "backup_time" {
description "Backup scheduled time"
type = string
default = "22:00"
}
variable "database_name" {
description "Database name"
type = string
default = "db1"
}
variable "database_flags" {
description "Database flag list"
type = map
default = {
log_connections = "on"
log_disconnections = "on"
log_error_verbosity = "verbose"
log_statement = "mod"
log_lock_waits = "on"
}
}
variable "superuser" {
description "Superuser username"
type = string
default = "postgres"
}
variable "superpassword" {
description "Superuser password"
type = string
}
variable "database_version" {
description "Database type/version"
type = string
default = "POSTGRES_13"
}
variable "database_env_label" {
description "Environment label"
type = string
default = "For test purposes"
}
variable "enable_replica" {
description "Replica enabled true/false"
type = bool
default = "false"
}
variable "network" {
description "Network name"
type = string
}
main.tf
provider "google" {
version = "3.55.0"
project = var.projrct
region = var.region
zone = var.zone
}
resource "google_sql_database_instance" "instance" {
provider = google-beta
name = var.instance_name
database_version = var.database_version
project = var.project
region = var.region
encryption_key = var.encryption_key
settings {
tier = var.instance_tier
user_labels = {
"environment" = var.database_env_label
}
backup_configuration {
enabled = var.backup_enabled
point_in_time_recovery_enabled = var.backup_pitr
start_time = var.backup_time
}
dynamic "database_flags" {
iterator = flag
for_each = var.database_flags
content {
name = flag.key
value = flag.value
}
}
ip_configuration {
ipv4_enabled = false
private_network = var.network
}
}
}
resource "google_sql_user" "users" {
name = var.superuser
instance = google_sql_database_instance.instance_name
password = var.superpassword
}
resource "google_sql_database" "database" {
name = var.database_name
instance = var.google_sql_database_instance.instance_name
}
resource "google_sql_database_instance" "replica-db" {
count = var.enable_replica ? 1 : 0
provider = google-beta
name = "${var.instance_name}-replica01"
master_instance_name = var.instance_name
database_version = var.database_version
project = var.project
region = var.region
deletion_protection = false
settings {
tier = var.instance_tier
ip_configuration {
ipv4_enabled = false
private_network = var.network
}
}
depends_on = [
google_sql_database_instance.instance
]
}
Przydałby się jeszcze outputs.tf – aby pokazywał, co nam się nam udało utworzyć.
#
output "instance_name" {
value = var.instance_name
}
output "tier" {
value = var.instance_tier
}
output "zone" {
value = var.zone
}
output "database_version" {
value = var.database_version
}
output "database_name" {
value = database_name
}
output "superuser" {
value = var.superuser
}