a teraz coś z zupełnie innej beczki…

przez | 21 marca 2021

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
}