728x90

Terraform Backend

Terraform Backend는 Terraform State 파일의 저장하는 위치를 정의합니다.
State는 Terraform에서 프로비저닝 결과를 추적하고 이후 프로비저닝 수행 시 비교하는 과정에 사용되므로, Terraform 사용 빈도와 대상의 규모가 커질수록 계획적인 관리가 요구 됩니다.

Backend 구성 목적

State Backend는 관리 / 공유 / 격리의 목적으로 사용됩니다

목적 내용
관리 State는 local 구성이 기본으로 현재 State인 terraform.tfstate와 이전 상태인 terraform.tfstate.backup만이 보관되므로 지속적인 State 백업을 위해서 Remote 저장소 필요 Remote 저장소에 state 파일을 관리하는 경우, 여러 사용자가 동시에 state 파일을 변경하는 경우 문제가 발생할 수 있으므로 동시에 같은 state 파일을 접근하는 것을 막아 의도치 않는 변경을 방지
공유 다수의 작업자가 동일한 State로 접근하여 프로비저닝하기 위한 공유 스토리지 필요
격리 State 파일에 저장될 수 있는 민감 데이터에 접근 권한을 환경별로 접근권한을 격리

사용 가능한 Backend

기본적으로 Terraform은 local상태를 디스크에 local 파일로 저장하는 Backend를 사용합니다.
AWS 리소스를 프로비저닝하는 경우 S3, Google Cloud의 경우 GCS가 적합 할 수 있습니다. HashiCorp는 Terraform Cloud를 통해 State 백엔드 기능을 제공합니다.

(기타)

  • Consul
  • Postgres Database (pg)

Terraform Workspace

Terraform Workspace는 State를 관리하는 단위입니다. 기본적으로 default Workspace가 생성됩니다.
terraform plan 을 새로운 Workspace에서 수행하면, Terraform은 다른 Workspace에 있는 리소스에 접근하지 않습니다.
기존에 있던 리소스를 관리하려면 Workspace를 전환한 후에 변경해야 합니다.

Terraform Backend 구현(AWS)

Terraform을 사용하여 인프라스트럭처를 관리할 때, Terraform의 상태 파일(backend)을 보관하는 AWS 계정과 실제 리소스가 프로비저닝되는 AWS 계정을 분리하는 것은 일반적인 보안 및 관리 방법입니다.
이러한 접근 방식은 Terraform 상태 파일의 보안을 강화하고, 팀 간의 접근 권한을 분리 하며, 여러 프로젝트 또는 환경 간의 충돌을 방지하는 데 도움이 됩니다.

AWS 인프라 관리 시, Multi-Account 관리를 통해 독립적인 환경을 구현하고 보안 및 관리 용이성을 가질 수 있도록 권고되고 있습니다.
Terraform Backend 환경은 공유 자원을 관리하는 Shared AWS Account에 관리 되며, 각 환경 및 Workspace별로 state를 저장 관리합니다.

+------------------+----------------+
| AWS Account Name | AWS Account ID |
+------------------+----------------+
| Shared           |  111111111111  |
| Dev              |  222222222222  |
| Qa               |  333333333333  |
| Prod             |  444444444444  |
| Test             |  555555555555  |
+------------------+----------------+

S3, DynamoDB 생성

상태를 Amazon S3의 버킷에 저장하고, Dynamo DB를 활용하여 Apply 시 State Locking을 통해 State의 일관성을 확보합니다.
실수로 삭제하거나 사람의 실수가 발생한 경우 상태를 복구할 수 있도록 버킷(Bucket)의 버전 관리를 활성화 합니다.

# Create S3 Bucket for Terraform State
resource "aws_s3_bucket" "terraform_state" {

    bucket = "tf-state-bucket" 


    tags = {
        Name        = "tf-state-bucket"
        Environment = ""    # Global, Shared, Dev, QA, Prod??
    }
}

# Provides a resource for controlling versioning on an S3 bucket
resource "aws_s3_bucket_versioning" "this" {
    bucket = aws_s3_bucket.terraform_state.id
    versioning_configuration {
      status = "Enabled"
    }
}


# Provides a S3 bucket server-side encryption.
resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
  bucket = aws_s3_bucket.terraform_state.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm     = "AES256"      # (SSE-S3)
    }
  }
}


# Provision DynamoDB Table for state locking
resource "aws_dynamodb_table" "this" {
    name = "terraform-state-lock"
    hash_key = "LockID"
    billing_mode = "PAY_PER_REQUEST"

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

State Configuration

State는 <workspace_key_prefix>/<workspace_name>/<key> 형식으로 저장됩니다.
Terraform Backend 환경은 공유 자원을 관리하는 shared-layer 에 관리되며, 각 환경 및 Workspace별로 state를 저장 관리합니다.

Terraform Backend Configuration S3 Backend Configuration

terraform{
    backend "s3" {
            bucket               = {S3 Bucket Name}                    # S3 Bucket Name
            key                  = "terraform.tfstate"                 # Path to tfstate in S3 Bucket (workspace/terraform.tfstate)
            region               = "ap-northeast-2"                    # Region Name
            dynamodb_table       = {DynamoDB Table Name}               # DynamoDB Table for state locking
            encrypt              = true                                # Enable Encyrtion state file
            workspace_key_prefix = {layer 이름}                         # default(env:)
            profile              = {backend-account-profile}           # backend가 위치한 AWS Profile
        }
}

# Configure the AWS Provider
provider "aws" {
    region = "ap-northeast-2"
    profile = {resource-account-profile}                               # 환경(Dev/Qa/Prod/Test)의 AWS Account Profile
}

Backend를 변경하고, terraform init 으로 초기화합니다.

yes 를 입력하면 local의 state가 지워지고, S3 로 Backend가 변경 되었음을 확인 할 수 있습니다.

728x90
반응형

+ Recent posts