Terraform의 상태를 원격으로 관리

CloudFormation에서는 스택 상태(state)가 AWS 측에서 관리되지만 Terraform의 경우 기본적으로 관리되지 않습니다.

상태 관리를 설정하지 않고 terraform apply 명령을 실행하면 로컬 터미널에 상태 관리 파일이 생성됩니다. ( terraform.tfstate라는 이름으로 만들어집니다.)

상태 관리의 이점



이점은 다음과 같습니다.
  • 원격으로 상태를 저장하고 상태를 잠글 수 있으므로 상태 손상을 방지 할 수 있습니다
  • 원격으로 상태를 저장하면 여러 사람이 동일한 상태를 공유 할 수 있습니다.

    로컬로 관리하는 경우 PC가 손상되어 인프라를 관리할 수 없게 되거나 상태 관리 파일을 분실할 위험이 없습니다.

    구현해보기



    상태 관리를 위한 스택 준비



    Terraform에서는 상태 관리에 S3 및 DynamoDB를 사용할 수 있습니다.

    S3에 상태 관리 파일을 저장하여 DynamoDB에서 충돌을 방지하는 구성으로 되어 있습니다.

    또, 상태 관리용 스택에 대해서 공식에서는 이하와 같이 관리하는 것을 추천하고 있으므로, 별도 관리하는 것이 좋을 것 같습니다.

    아래 인용 :

    Terraform is an administrative tool that manages your infrastructure, and so ideally the infrastructure that is used by Terraform should exist outside of the infrastructure that Terraform manages.

    인용 : 공식 사이트 - Multi-account AWS Architecture

    여기에서는, 귀찮기 때문에 이하의 스택을 실행해 구축합니다.

    테이블에는 LockID 라는 이름의 기본 키가 있어야 하므로 그 설정만 넣으십시오.
    /**
     * state管理用のS3 & DynamoDB 作成用スタック
     * stack ディレクトリ内のtf実行前にこちらを先に実行する
    */
    
    terraform {
      required_version = "0.12.5"
    }
    
    provider "aws" {
      region = "ap-northeast-1"
    }
    
    resource "aws_s3_bucket" "terraform_state" {
      // ダメだったら別の名前にする
      bucket = "terraform-state-kento75"
      versioning {
        enabled = true
      }
    }
    
    resource "aws_dynamodb_table" "terraform_state_lock" {
      name           = "terraform_state_lock"
      read_capacity  = 1
      write_capacity = 1
      hash_key       = "LockID"
    
      attribute {
       // 必須
        name = "LockID"
        type = "S"
      }
    }
    
    

    간단한 스택 만들기


    backend 를 설정하여 방금 작성한 S3 및 DynamoDB에 의한 상태 관리를 구현할 수 있습니다.
    terraform {
      required_version = "0.12.5"
    
      // state lock 設定
      // state管理用 S3, DynamoDB は別管理
      backend "s3" {
        bucket         = "terraform-state-kento75" # state管理用バケット
        region         = "ap-northeast-1"
        key            = "terraform.tfstate"
        encrypt        = true
        dynamodb_table = "terraform_state_lock"
      }
    }
    
    

    그 밖에 구현한 스택은 여기
    terraform init 명령을 실행하면 backend가 S3이 되는지 확인할 수 있습니다.
    $ terraform init
    
    Initializing the backend...
    
    Successfully configured the backend "s3"! Terraform will automatically
    use this backend unless the backend configuration changes.
    
    Initializing provider plugins...
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    

    스택을 작성해 봅니다.
    $ terraform apply
    

    실행이 성공하면 S3 버킷에 terraform.tfstate가 생성됩니다.


    DynamoDB에도 추가됩니다.



    정말 잠겨 있는지 시도



    다른 세션에서 동시에 terraform plan를 실행할 때 어떤 동작을 수행하는지 확인하십시오.

    먼저 실행한 쪽은 정상적으로 동작했습니다만, 나중에 실행한 쪽은 이하와 같이 에러가 됩니다.
    $ terraform plan
    
    Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed
            status code: 400, request id: 86SS1900A1DIKG5ORN24PRLDG3VV4KQNSO5AEMVJF66Q9ASUAAJG
    Lock Info:
      ID:        aff55b1a-0cbf-d759-7e3b-e778a391925a
      Path:      terraform-state-kento75/terraform.tfstate
      Operation: OperationTypePlan
      Who:       [email protected]
      Version:   0.12.5
      Created:   2020-02-29 10:46:17.720234 +0000 UTC
      Info:      
    
    
    Terraform acquires a state lock to protect the state from being written
    by multiple users at the same time. Please resolve the issue above and try
    again. For most commands, you can disable locking with the "-lock=false"
    flag, but this is not recommended.
    
    

    요약



    Terraform의 backend 주위의 실장을 실시하는 것으로, 복수인으로의 운용시의 사고를 막을 수 있게 되므로, 가능한 한 실장하는 것이 좋다고 생각합니다.
  • 좋은 웹페이지 즐겨찾기