devops

Terraform Backend, Variables 알아보기 본문

DevOps/Terraform

Terraform Backend, Variables 알아보기

vata500 2022. 6. 29. 15:57
반응형

Terraform Backend

https://medium.com/clarusway/how-to-use-s3-backend-with-a-locking-feature-in-terraform-to-collaborate-more-efficiently-fa0ea70cf359

Terraform의 State 파일을 저장하는 위치와 어디서 가져올지에 대한 설정이다. 대체로 로컬에 저장하지만 설정에 따라서 s3, consul 등 다양한 backend type을 사용할 수 있다.

Backend를 사용하는 이유

1) 대체로 Terraform 코드는 혼자 작성하지 않는다. 인프라를 변경하는 것은 민감하기 때문에 원격 저장소를 활용해서 같은 state를 사용하는 것을 막을 수 있다.

2) 로컬 스토리지에 저장하면 유실의 위험이 있다. 그래서 S3와 같은 원격 저장소를 활용하기도 한다.

*주로 s3를 많이 사용한다.

terraform {
    backend "s3" {  
      bucket         = "terraform-s3-bucket" # s3 bucket 이름
      key            = "terraform/own-your-path/terraform.tfstate" # s3 내에서 저장되는 경로를 의미
      region         = "ap-northeast-2"  
      encrypt        = true
      dynamodb_table = "terraform-lock"
    }
}

S3를 먼저 생성한다. 그리고 Terraform의 init.tf 파일을 작성하여 Backend 설정을 위한 s3와 DynamoDB를 생성한다.
DynamoDB는 복수의 사람이 동시에 state에 접근하여 사용하지 않도록 lock하는 역할을 한다.

provider "aws" {
  region = "ap-northeast-2"
  version = "~> 2.49.0" 
}

# backend를 위한 s3
resource "aws_s3_bucket" "tfstate" {
  bucket = "bucket-tfstate"

  versioning {
    enabled = true # tfstate file를 삭제하는 것을 예방
  }
}

# terraform state를 잠금할 DynamoDB
resource "aws_dynamodb_table" "terraform_state_lock" {
  name           = "terraform-lock"
  hash_key       = "LockID"
  billing_mode   = "PAY_PER_REQUEST"

  attribute {
    name = "LockID"
    type = "S"
  }
}

Terraform Variables

테라폼은 HCL 언어를 사용한다. 이 언어의 특성을 통해서 변수를 정의하고 주입해서 활용할 수 있다.

  • Variable type : String, Number, Bool
  • Complex variable types : list(), set(), map(), object({..}), tuple([...])

변수 정의를 위해서 variable.tf를 생성한다. 그리고 안에 원하는 변수를 정의한다.

variable "image_id" {
  type = string
}

variable "availability_zone_names" {
  type    = list(string)
  default = ["us-west-1a"]
}

variable "ami_id_maps" {
  type = map
  default = {}
}

정의한 변수에 값을 주입하기 위해서 terraform.tfvars 파일을 생성한다. Variable = Value 형태로 정의한다.

image_id = "ami-064c81ce3a290fde1"
availability_zone_names = ["us-west-1a","us-west-1b","us-west-1c"]
ami_id_maps = {
    ap-northeast-2 = {
      amazon_linux2 = "ami-010bf43fe22f847ed"
      ubuntu_18_04  = "ami-061b0ee20654981ab"
    }

    us-east-1 = {
      amazon_linux2 = "ami-0d29b48622869dfd9"
      ubuntu_18_04  = "ami-0d324124b7b7eec66"
    }
}
반응형
Comments