Terraform Backend 활용

박도준·2021년 5월 22일
0

[IaC] Terraform

목록 보기
9/9
post-thumbnail


Terraform Backend란?

각 terraform configuration은 작업이 수행되는 위치와 방법, 상태 스냅샷이 저장되는 위치 등을 정의하는 백엔드를 지정할 수 있다. 기본적으로 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3,consul,etcd 등 다양한 Backend 타입을 사용할 수 있다.



Terraform Backend를 사용하는 이유

👉 Locking

혼자서 인프라 자원을 관리하는 경우는 큰 문제가 없지만, 여러명이서 협업하는 경우에는 이에 대한 관리가 필요하다.

예를 들어 공동으로 사용하는 서버에 state 파일을 관리하는 경우, 여러 사용자가 동시에 state 파일을 변경하는 경우 문제가 발생할 수 있다.

이처럼 원격 저장소를 사용함으로써 동시에 같은 state 파일을 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다

👉 Backup

로컬 스토리지에 저장한다는 것은 유실할 수 있다는 가능성을 내포한다. 때문에 S3와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지할 수 있다.



Terrform Backend 구현

테라폼의 상태를 저장하기 위한 S3 버킷과 동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB를 사용한다.

Terrform Backend 설정을 위한 s3 와 DynamoDB를 생성하는 코드를 작성한다.

  • init.tf
provider "aws"{
 reigon = "ap-northeast-2"
 version = "~> 2.49.0"
}


resource "aws_s3_bucket" "tfstate"{
 bucket = "202105-apnorthease2-tfstate"

 versioning {
  enabled = true
 }
}

resource "aws_dynamodb_table" "terraform_state_lock" {
 name= "TerraformStateLock"
 hash_key = "LockID"
 billing_mode = "PAY_PER_REQUEST"

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

s3_bucket을 생성할 때는 aws_s3_bucket 리소스를 사용한다.

dynamodb_table을 생성할 때는 aws_dynamodb_table 리소스를 사용하고, name hash_key attribute는 필수요소이다.

  • name은 데이터가 저장되는 테이블 이름으로 각 계정의 지역별로 고유한 값이여야 한다.

  • hash_key는 테이블의 각 항목을 나타내는 고유 식별자이다.

  • attribute는 잠금을 위한 속성을 나타낸다.
    type은 3가지로 "S"(String), "N"(Number), "B"(Binary)가 있다.


terraform init

terraform plan

terraform apply

s3 생성

DynamoDB 테이블 생성


IAM을 생성했을 때의 state 파일을 관리하기 위해 백엔드로 옮겨본다.

  • terraform.tf
terraform {
 backend "s3" {
  bucket = "202105-apnorthease2-tfstate"
  key = "terraform/IAM/terraform.tfstate"
  region = "ap-northeast-2"
  encrypt = true
  dynamodb_table = "TerraformStateLock"
  }
}

backend "s3"는 사용할 backend가 s3임을 의미한다.

  • bucket : 사용할 S3 버킷명
  • key : 테라폼 state 파일을 기록할 S3 버킷 내의 파일 경로
  • region : S3 버킷이 있는 지역
  • encrypt : 테라폼 state 파일 암호화 여부
  • dynamodb_table : 사용할 DynamoDB table명

terraform init

init을 하게되면 기존의 state 파일을 backend로 copy할건지 물어보면 yes로 답을 해준다.

그러면 이제 로컬에 있는 state 파일이 필요가 없게 된다. 왜냐하면 s3에 state 파일이 업로드 되었기 때문이다.

terraform plan

terraform apply

profile
Better late than never

0개의 댓글