Dev/DevOps, Infra

[(IaC)Terraform] Terraform Backend 활용하기

HJChung 2021. 5. 9. 21:52

[AWS][Network][(IaC)Terraform] AWS Network의 구성 요소와 생성처럼 terraform apply를 하는 경우, 리소스가 생성된 후 terraform.tfstate 파일이 생성된다. 이 파일의 내용(terraform metadata; terraform knows what infrastructure it controls)이 terraform state이다. 

즉, 내가 실행한 apply의 결과를 저장해놓은 상태이다. (여기서 상태란 terraform apply를 했을 시점의 상태이지, 현재 인프라의 상태를 반영해주는 것은 아니다. )

이 state는 backend에도 저장 될 수 있다. backend가 뭐지?? 그리고 이는 어떻게 활용되고 왜 사용될까? 어떻게 쓰는걸까?

1. terraform Backend란

terraform.tfstate는 locally 하게 저장된 것이지만 Terraform Backend 는 Terraform의 state file을 어디에 저장을 하고, 가져올지에 대한 설정이다. 

 

2. terraform Backend는 어떻게 활용되고 왜 사용될까?

큰 infrastructure 구축 작업 즉 terraform 코드를 함께 작성한다고 하자. 이런 경우 Backend를 통해 state의 원격저장소를 사용하면, 여러 사람이 동시에 같은 state를 건드려서 의도치 않은 인프라 변경을 방지할 수 있다. 예를 들어 A가 terraform apply를 하고 B가 2초 뒤 terraform apply를 하면, B의 동작은 A의 동작이 완전히 다 마무리 된 후에 진행된다. 즉 A와 B의 의도가 overriding되는 것을 막을 수 있다. (Locking)

그리고 원격저장소에 terraform state를 저장해둠으로써 state 파일의 유실을 방지할 수 있다. (Backup)

마치 github 쓰는 것과 비슷한 효과 인 듯 하게 느껴진다. 

 

3. 어떻게 쓰는걸까?

for remote state, we can have it store it into 

- S3 bucket in AWS

Azure storage

- terraform Enterprise..

여러가지 방법이 있지만 여기선 S3 bucket in AWS에 저장하는 방법으로 진행하였다.  

Store our state in AWS S3 

s3 저장소를 생성하고, AWS에서 제공하는 NoSQL Key/Value 저장소인 DynamoDB에 state가 저장된 s3의 경로와 lock을 할 수 있는 파일들이 저장된다. 

terraform에서는 이를 확인하고 현재 이 파일이 사용되고 있는지, 아닌지를 판단한다. 

provider "aws" {
  region = "ap-northeast-2" # Please use the default region ID
  version = "~> 2.49.0" # Please choose any version or delete this line if you want the latest version
}

# S3 bucket for backend
resource "aws_s3_bucket" "tfstate" {
  bucket = "tfstate_bucket"

  versioning {
    enabled = true # Prevent from deleting tfstate file
  }
}

# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
  name           = "terraform-lock"
  hash_key       = "LockID"
  billing_mode   = "PAY_PER_REQUEST"

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

2) backend 설정

# backend.tf

terraform {
    backend "s3" { # terraform backend type이 s3라고 명시
      bucket         = "tfstate_bucket" # s3 bucket 이름
      key            = "terraform/own-your-path/terraform.tfstate" # s3 내에서 저장되는 경로를 의미합니다.
      region         = "ap-northeast-2"  
      encrypt        = true
      dynamodb_table = "terraform-lock" # DynamoDB 이름
    }
}

 

 

reference

www.youtube.com/watch?v=RBW253A4SvY

BACKEND 활용하기