..

T101) 환경별 상태관리를 위한 백엔드와 모듈 사용기

매번 스터디에서 aws로 테스트를 해봤었어서 중간과제 겸 gcp에서도 테스트 해보았다. 시작하기에 앞서, gcp에서 테라폼을 시작하기 위한 권한 인증이 필요하다. gcloud auth application-default login 혹은 서비스계정의 json파일을 통해 인증 가능하다. 🔗

구성

gcs를 remote저장소로 지정하고, 모듈에 리소스별 파일을 두어 각 환경별로 상태관리를 할 수 있는 구조로 테스트 해보았다.

1-1

백엔드 구성

aws의 경우 s3의 lock(상태잠금) 기능이 없어 dynamoDB와 함께 사용해야하지만, gcs의 경우 lock기능을 제공하기 때문에 단독으로 사용하면된다. lock기능은 기존에 업데이트 중인 상태파일이 완료 후에 다음 업데이트가 가능하도록 잠기는 기능을 말한다. 🔗


# 버킷명은 고유해야하기 때문에 랜덤한 값을 받음
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

# 위의 값을 받아 버킷 생성
# 상태 파일을 업데이트 하면서 기존 내역도 확인이 되어야하기 때문에 버전 관리 필요
resource "google_storage_bucket" "backend" {
  name          = "${random_id.bucket_prefix.hex}-bucket-tfstate"
  force_destroy = false
  location      = "asia-northeast3"
  storage_class = "STANDARD"
  versioning {
    enabled = true
  }
}


module

모듈은 작성해둔 파일에 변수 값들만 변경하여 쉽게 생성할 수 있도록 도와주는 환경이다. 이런 경우 여러 환경에서 동일한 구성으로 생성해야할 때 유용하게 사용될 수 있다.

예시로 modules/gce/main.tf 파일을 살펴보면, 환경별로 달라질 수 있는 이름이나 머신타입, 사용되는 네트워크 등은 변수로 받지만 그 외에는 고정해뒀다.


## modules/gce/main.tf ##
# default sa 정보를 가져옴
data "google_compute_default_service_account" "default" {
}

# 인스턴스 생성 시 각 변수를 받아서 생성
resource "google_compute_instance" "default" {
  name         = var.name
  machine_type = var.machine_type
  zone         = var.zone

  tags = var.tags

# 그 외의 값들은 고정
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = var.network
    access_config {
    }
    subnetwork = var.subnetwork
  }

  metadata_startup_script = <<-EOF
    #!/bin/bash
			sudo apt-get update -y
			sudo apt-get install default-mysql-client -y
			curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
			sudo chmod +x cloud_sql_proxy
			./cloud_sql_proxy -instances=proejctid:asia-northeast3:private-ip-sql-instance=tcp:3306 &
  EOF

  service_account {
    email  = data.google_compute_default_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

실제 환경에서 사용시 아래와 같이 사용할 수 있다. 이미 리소스들의 구성에 대해서는 위의 모듈에서 작성 되었기 때문에 이 곳에는 프로바이더와 저장소 지정, 모듈 호출만 해주면된다.


## env1/gce/main.tf ##
# 원격저장소에 프리픽스로 상태파일을 구분함
terraform {
 backend "gcs" {
   bucket  = "6c33b0b648439490-bucket-tfstate"
   prefix  = "terraform/state/env1/gce"
 }
}

# 프로바이더 지정은 모듈이 아닌 각 환경별로 작성하여 불러오게 함
provider "google" {
  project     = var.project_id
  region      = "asia-northeast3"
}

# 모듈 사용시 소스 위치를 지정함
module "gce" {
  source = "../../modules/gce"

  name = var.name
  network = var.network

}

모듈 사용 시 변경 값이 필요하거나 기본 값이 없는 변수들에 대한 값이 필요하다.


# cat env1/gce/variables.tf
variable "name" {}
variable "network" {}


# cat env1/gce/terraform.tfvars
name = "nyoung-test"
network = "nyoung-vpc"

위의 방법들을 사용하여 private cloud sql과 프록시 기능을 할 수 있는 인스턴스를 구성하는 파일을 작성하였다. 아직 작성하는 것이 익숙하지않아 리소스들이 연결되는 것에는 이상 없지만 파일에 꽤 많은 수정이 필요하다 생각된다.. 🔗


참고