Cloud/Terraform

[Cloud AWS] Terraform AWS S3에 terraform.tfstate 저장하기 (Remote State Storage)

ch4njun 2020. 9. 15. 23:50
반응형

테라폼을 수행할 때 마다 최상위 경로에 state파일을 생성해 인프라의 모든 정보를 저장해 놓는다. 이 파일은 JSON형식으로 실제 환경의 리소스와 대응되는 정보들이 저장되어 있다.

 

개인 프로젝트가 아니라 팀 프로젝트라면 다음 요구사항들이 지켜져야 한다.

1. 상태 파일의 공유 스토리지

2. 상태 파일의 잠금

3. 상태 파일의 분리

 

Git과 같은 버전관리도구를 통해 상태 파일을 사용하는 것은 옳지 못한 방법이다. 왜냐하면 최신 변경 사항을 업데이트 하지 않거나 변경된 사항을 가져오지 않는 실수를 할 여지가 있고, 상태파일이 일반 텍스트로 저장되기 때문에 보안상 문제가 발생할 가능성이 있다.

 

때문에 테라폼에서 내장으로 제공하는 Remote State Storage를 사용하는 것이 좋다.

 

1. AWS S3 Bucket 생성하기

resource "aws_s3_bucket" "terraform_state" {
    bucket = "ch4njun-up-and-running-state"

    versioning {
        enabled = true
    }

    lifecycle {
        prevent_destroy = true
    }
}

resource "aws_dynamodb_table" "terraform_lock" {
	name = "ch4njun-up-and-running-lock"
    hash_key = "LockID"
    read_capacity = 2
    write_capacity = 2
    
    attribute {
    	name = "LockID"
        type = "S"
    }
}

 


2. aws-provider.tf 에 backend "s3"에 대한 내용 추가

provider "aws" {
    access_key = "[에세스키]"
    secret_key = "[시크릿키]"
    region = "us-east-1"
}


terraform {
    backend "s3" {
        bucket = "ch4njun-up-and-running-state"
        key = "terraform.tfstate"
        region = "us-east-1"
        access_key = "[에세스키]"
        secret_key = "[시크릿키]"
        encrypt = true
        dynamodb_table = "ch4njun-up-and-running-lock"
    }
}

 

 


3. 다시 terraform init 명령어 수행

 

정상적으로 AWS S3에 terraform.tfstate가 저장된 것을 확인할 수 있고, DynamoDB의 대쉬보드를 통해 잠금이 수행되고 있다는 것을 확인할 수 잇다. DynamoDB를 통해 잠금이 수행되기 때문에 다른 요소로부터 정보가 훼손되지 않는다.

 

한 마디로 여러군데에서 동시에 사용하려 할 때 경쟁상태가 발생하는 것을 막아준다.

 

 

 

 


이렇게 AWS S3 Bucket에 저장한 Terraform 설정파일에 대한 내용을 사용하고 싶다면 어떻게할까? 예를 들어 RDS (MySQL)에 대한 설정파일을 AWS S3 Bucket에 저장해두었다고 가정해보고, Web Clustor의 main.tf에서 이 설정파일을 가져와서 한번에 "terraform apply" 한다고 하자.

 

data "terraform_remote_state" "db" {
	backend = "s3"
    
    config {
    	bucket = "ch4njun-....(버킷이름)"
        key = "2/terraform.tfstat" // 실제 위치
        region = "us-east-1"
    }
}

terraform_remote_state는 읽기전용으로 데이터를 반환한다는 것을 인지해야 한다.

 

이후 이렇게 가져온 것을 아래와 같이 사용할 수 있다.

"${data.terraform_remote_state.db.address}"
"${data.terraform_remote_state.db.port}"

 

반응형