Ssoon

[T101-2주차] 03 테라폼 상태 관리하기 - (2) 상태파일공유 본문

Terraform 101 Study

[T101-2주차] 03 테라폼 상태 관리하기 - (2) 상태파일공유

구구달스 2022. 10. 28. 01:06
CloudNet@ 팀의 가시다님이 진행하는 Terraform 101 Study 2주차 정리입니다.

Terraform backend

  • 테라폼이 상태를 load 하고 store 하는 방법을 결정합니다.
  • 기본 backend 는 local backend 로서 local disk 에 상태 파일을 저장합니다.
  • Remote backend 를 사용하면 원격 공유 저장소에 저장할 수 있습니다.

원격 backend 을 사용하면 해결되는 문제

  • Manual error
    • terraform 은 plan 이나 apply 할 때마다 해당 backend 에서 상태 파일을 자동으로 load 합니다.
    • apply 시 상태 파일을 backend 에 자동 저장됩니다.
  • Locking
    • apply 실행하면 terraform 은 자동으로 잠금을 활성화되어 다른 사람이 apply 실행 중인 경우 이미 잠금이 활성화되어 잇어 잠금이 해제될 때까지 대기해야 합니다.
  • Secrets
    • 대부분의 원격 backend 는 기본적으로 데이터를 보내거나 상태 파일을 저장할 때 암호화하는 기능을 지원합니다. 

Amazon S3 을 원격 backend 로 사용합니다.

  • S3 Bucket 생성을 생성합니다.

 

backend.tf

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "soon_s3bucket" {
  bucket = "ssoon-t101study-tfstate"

  # 리소스 삭제 시 테라폼 오류와 함께 종료됨
  lifecycle {
    prevent_destroy = true
  }
}

# S3 버킷에서 버전 관리를 제어하기 위한 리소스를 제공합니다.
resource "aws_s3_bucket_versioning" "ssoon_s3bucket_versioning" {
  bucket = aws_s3_bucket.soon_s3bucket.id
  # 버킷이 파일을 업데이트 마다 새버전을 생성합니다.
  versioning_configuration {
    status = "Enabled"
  }
}

# S3 버킷에 기록된 모든 데이터에 서버 측 암호화을 설정합니다
resource "aws_s3_bucket_server_side_encryption_configuration" "soon_s3bucket_encryption" {
  bucket = aws_s3_bucket.soon_s3bucket.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

# S3 버킷 퍼블릭 액세스 차단 구성을 관리합니다.
resource "aws_s3_bucket_public_access_block" "soon_s3bucket_public_access" {
  bucket                  = aws_s3_bucket.soon_s3bucket.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

output "s3_bucket_arn" {
  value       = aws_s3_bucket.soon_s3bucket.arn
  description = "The ARN of the S3 bucket"
}
  • console 확인

잠금에 사용할 DynamoDB 테이블을 생성합니다.

  • DynamoDB
    • Amazon 의 key-value 저장소 입니다.
    • 분산 잠금 시스템에 필요한 강력한 읽기 일관성 및 조건부 쓰기를 지원합니다.

LockID 기본 key 가 있는 DynamoDB 테이블을 생성합니다.

  • backend.tf 에 추가합니다.
# DynamoDB 테이블 리소스를 제공합니다
resource "aws_dynamodb_table" "ssoon_dynamodbtable" {
  name         = "terraform-locks"
  billing_mode = "PAY_PER_REQUEST" 
  hash_key     = "LockID"

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

output "dynamodb_table_name" {
  value       = aws_dynamodb_table.ssoon_dynamodbtable.name
  description = "The name of the DynamoDB table"
}
  • console 확인

terraform 코드 내에 backend 구성을 설정합니다.

terraform
  backend "<BACKEND_NAME>" {
    [CONFIG...]
  }
}
  • backend.tf 에 추가합니다.
terraform {
  backend "s3" {
    # 이전에 생성한 버킷 이름
    bucket         = "ssoon-t101study-tfstate"
    key            = "dev/terraform.tfstate"
    region         = "ap-northeast-2"
    
    # 이전에 생성한 다이나모db 이름
    dynamodb_table = "terraform-locks"
    # encrypt        = true
  }
}
  • encrypt 을 ture 로 설정하면 terraform 상태가 S3 디스크에 저장될 때 암호화됩니다.
  • 앞서 만들어본 ec2.tf 에 backend 설정을 추가하여 terraform init 을 실행합니다.

https://github.com/kschoi728/T101/tree/master/02_Weeks

 

GitHub - kschoi728/T101: Terraform 101 Study

Terraform 101 Study. Contribute to kschoi728/T101 development by creating an account on GitHub.

github.com

기존 상태를 새 백엔드에 복사하시겠습니까?

백엔드 "s3"을 성공적으로 구성했습니다!

백엔드 구성이 변경되지 않는 한 Terraform은 이 백엔드를 자동으로 사용합니다.

  • console 확인

앞서 생성한 ec2.tf 의 tag을 변경하고 terraform apply 을 실행합니다.

DynanoDB 에서 상태파일에 대한 lock 상태를 확인합니다.

S3 에서 version 을 확인합니다.

상태파일을 삭제합니다.

ec2.tf 의 tag을 변경하고 terraform apply 을 실행하여도 상태파일이 원격에 있기 때문에 정상적으로 실행됩니다.

stg 폴더를 생성 후 vpc.tf / sg.tf / ec2.tf / backend.tf 을 생성 합니다.

backend.tf

terraform {
  backend "s3" {
    bucket         = "ssoon-t101study-tfstate"
    key            = "stg/terraform.tfstate"
    region         = "ap-northeast-2"
    dynamodb_table = "terraform-locks"
    # encrypt        = true
  }
}

DynanoDB 에서 상태파일에 대한 lock 상태를 확인합니다.

S3에서 생성된 stg 을 확인합니다.

 

 
Comments