Backend 활용하기

Chori·2024년 12월 24일
0
post-thumbnail

처음 시작하는 Infrastructure as Code: AWS & 테라폼을 수강하며 정리한 내용입니다.


Terraform state

  • terraform.tfstate라는 파일명을 가짐
  • apply의 결과를 저장해놓은 상태
  • 현재 인프라의 상태를 의미하는 것은 아니며 apply로 적용한 시점의 상태
  • state는 원격 저장소인 Backend에도 저장될 수 있음

Terraform Backend

개념

  • Terraform의 state file을 어디에 저장하고, 어디서 가져올지에 대한 설정
  • 기본적으로 로컬 스토리지에 저장
  • 설정에 따라서 S3, Consul, ETCD 등 다양한 Backend type을 사용할 수 있음

사용 이유

  • Locking: 원격 저장소를 사용하면 동시에 같은 state에 접근하는 것을 막을 수 있음
  • Backup: 원격 저장소를 사용함으로써 state 파일의 유실 방지

S3 bucket as Backend

  • 테라폼의 상태를 저장하기 위한 S3 버킷 생성
  • state 파일이 S3에 저장됨

DynamoDB Table for Lock

  • DynamoDB는 AWS에서 제공하는 NoSQL Key-Value Store
  • S3 파일의 경로와 Lock을 할 수 있는 파일들이 DynamoDB에 저장
  • 동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB에 작업에 대한 Lock을 생성

실습

  • iam 관련 state 파일을 Backend로 옮기기

저장소 생성

  • init.tf 파일을 다음과 같이 작성
provider "aws" {
  region = "ap-northeast-2"
}

# S3 Bucket for Backend
resource "aws_s3_bucket" "tfstate" {
  bucket = "tf101-chori-apne2-tfstate"
} 

resource "aws_s3_bucket_versioning" "versioning_tfstate" {
  bucket = aws_s3_bucket.tfstate.id
  
  versioning_configuration {
    status = "Enabled" # 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"
  }
}
  • terraform init 명령어 실행

  • terraform plan을 입력하면 두 가지의 리소스가 만들어질 것이라고 안내됨
  • 문제가 없으면 'terraform apply'로 리소스 생성
  • AWS 콘솔에서 S3가 만들어진 것을 확인

Backend 설정

  • iam 디렉토리에 backend.tf 파일을 생성하고 아래와 같이 작성
terraform {
  backend "s3" {
    bucket = "tf101-chori-apne2-tfstate"
    key = "workspace/iam/terraform.tfstate"
    region = "ap-northeast-2"
    encrypt = true
    dynamodb_table = "terraform-lock"
  }
}
  • backend: Backend의 타입을 s3로 지정
  • bucket: s3 버킷 이름
  • key: s3 내에서 저장되는 경로, 실제 경로와 같으면 좋음
  • region: s3의 region
  • encrypt: 암호화 여부
  • dynamodb_table: DynamoDB 테이블 지정
  • 설정이 끝났으면 terraform init 명령어 실행
  • 기존의 state를 새로운 Backend로 copy할 것인지(로컬에 있는 파일을 Backend로 옮길 것인지) 물어보면 yes 입력

  • AWS 콘솔에서 s3 버킷에 파일이 업로드된 것을 확인

  • 그러면 이제 로컬에 있던 state 파일은 쓸모가 없어짐
  • 로컬에 state 파일이 없어도 동작하는데 문제가 없음
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글