[Terraform] github codespaces에서 Terraform 사용하기 1편 | Linux에 terraform 설치 (tistory.com)
1편에서 볼 수 있었듯 github codespace 위에서 terraform을 실행할 수 있게 되었다. 근데 여기서 한가지 문제가 있다.
발생한 문제
바로 github codespaces에서 제공하는 서버는 계속 사용하는 서버가 아니라 코드를 돌릴 때 일시적으로 사용하고, 반납하게 되는 서버라는 점이다. 즉, 사용하지 않을 때는 반납했다가 코드만 불러와서 새로운 환경에서 사용하게 될 수도 있는 서버이다.
Terraform은 현재의 인프라 상태를 .tfstate라는 파일을 이용해 저장하고 있다. terraform apply를 할 경우 생성한 인프라에 맞춰서 마치 npm의 package.json 파일 마냥 현재의 상태를 문서화하게 된다.
근데 이 파일은 내 프로덕트의 모든 인프라 정보를 담고 있기에 public해질 경우 보안취약점이 되는 것이다.
그래서 github에 올릴 수 없는 파일인 문제가 있고, 추가적으로 만약에 2인 이상이 동 인프라에 대해 작업하게 될 경우 서로의 state 파일이 꼬이게 되는 (만약 pull을 제대로 하지 않는다면) 문제가 생기게 된다.
솔루션
그래서 실제로 사용할 때는 S3를 활용하여 state 파일을 저장하고 DynamoDB를 활용해줘서 lock을 제어함으로써 위의 문제를 해결할 수 있다고 한다.
Terraform으로 S3와 DynamoDB 세팅
먼저 backend.tf라는 파일을 만들고 아래 코드대로 S3와 DynamoDB를 설정한다.
// backend.tf
resource "aws_s3_bucket" "s3-bucket-tfstate" {
bucket = "s3-bucket-ddakzip-tfstate"
}
resource "aws_s3_bucket_versioning" "versioning" {
bucket = aws_s3_bucket.s3-bucket-tfstate.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "terraform-tfstate-lock"
hash_key = "LockID"
billing_mode = "PAY_PER_REQUEST"
attribute {
name = "LockID"
type = "S"
}
}
이때 versioning을 설정 함으로써 동일 버킷 내에 모든 객체를 보존할 수 있게 해준다.
aws_dynamodb_table의 경우 속성으로 "LockID"를 string 타입으로 넣어준다.(아래 참조)
aws_dynamodb_table | Resources | hashicorp/aws | Terraform | Terraform Registry
Provider 설정
사용할 AWS 폴더에가서 provider를 아래와 같이 설정해준다.
provider "aws" {}
terraform {
backend "s3" {
bucket = "s3-bucket-ddakzip-tfstate"
key = "test/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-tfstate-lock"
}
}
이때 key의 저장 위치를 조정하면서 해당 폴더의 tfstate 파일이 어디에 저장되게 할지 결정할 수 있다.
필자는 prod, stage, dev 폴더를 나눠서 각 state를 관리할 수 있었다.
아래의 공식문서에서 자세한 permission 등을 확인할 수 있다.
Backend Type: s3 | Terraform | HashiCorp Developer
이후 terraform init을 해주면 해당 폴더 내의 인프라가 어디에 상태 저장을 할지 자동으로 결정되고, 이 과정에서 DynamoDB가 lock을 해줘서 다수가 작업할 때도 crash 없이 작업할 수 있게 된다.