[Terragrunt] local backend(tfstate 파일) 설정

Jisun-Rea·2022년 5월 21일
0
post-thumbnail

기본 tfstate 파일 생성에 있어 terraform과 terragrunt의 차이

Terraform은 backend에 대한 추가적인 설정이 없다면 기본적으로 실행 디렉토리 내에 terraform.tfstate 파일을 생성한다.
그러나, Terragruntbackend를 따로 설정해주지 않으면 local에 tfstate파일을 생성해주지 않는다.

If Terraform has no explicit backend configuration, it creates terraform.tfstate in live directory by default. However, Terragrunt doesn't.

tfstate 파일이 없으면 생기는 일

사실 tfstate 파일이 없어도 terragrunt apply로 리소스 생성이 가능하고, terragrunt destroy로 리소스 삭제가 가능하다.

그럼 무엇이 문제냐,
apply 명령으로 리소스를 생성하다 중간에 실패하였을 때, 문제 수정 후 다시 apply 명령으로 리소스를 생성하면 중간에 생성 실패한 리소스부터 다시 생성을 시도하는 것이 아닌, 처음부터 이미 생성한 리소스부터 다시 생성하게 된다.

이는, terraform으로 만든 리소스에 대한 상태를 저장한 파일이 없기 때문에, terraform 입장에선 리소스가 존재하지 않는 것처럼 여겨지기 때문이다. (이것이 tfstate 파일의 존재의 이유이다.)

보통 production 환경에선 remote state 설정을 통해 tfstate 파일을 원격의 안전한 저장소(ex.s3 bucket)에 저장하도록 설정하는 것이 일반적이다. 그러나 이는 terragrunt docs에도 잘 나와있고, 여기선 해당 파일을 local에 저장시킬 수 있는 방법을 소개하겠다.

The thing is even though tfstate file does not exist, we can create/destroy resources using apply/destroy command.

But let's say we failed to run apply command in the middle of creating resources. For example, terraform succeed to create ec2 instance, but failed in security group.
After fixing it and run apply command again, we expect it to create resource from where it failed to create. This case, from security group.
But, terraform will create resource from the first again, from ec2 instance.
Why? Because tfstate file stores the 'state' of resources created by terraform, without it, resources does not exist in the stance of terrform. This is why state file is so important to terraform.

Terragrunt local backend 설정

terragrunt 실행 디렉토리 내에 tfstate 파일을 생성해보겠다. 실습 terragrunt 디렉토리 구조는 다음과 같다.

# config
dev
  │  common.yaml
  │  terragrunt.hcl
  │
  └─ec2
      ├─bastion
      │      terragrunt.hcl
      │
      └─tomcat
              terragrunt.hcl
# template
aws
  └─ec2
         ec2.tf
         iam.tf
         main.tf
         output.tf
         security_group.tf
         variables.tf

root terragrunt.hcl인 dev/terragrunt.hcl 에 아래 내용을 추가한다.

remote_state {
  backend = "local"
  config = {
    path = "${get_terragrunt_dir()}/terraform.tfstate"
  }
}

참고: https://terragrunt.gruntwork.io/docs/reference/built-in-functions/#get_terragrunt_dir

그리고 실제로 리소스를 만드는 template의 모듈별 main.tf에 아래 내용을 추가하면 끝이다.

terraform {
  backend "local" {}
}

terragrunt plan - terragrunt apply 후에 다음과 같이 tfstate 파일이 생성되는 것을 확인할 수 있다. 각자의 상황에 맞춰 path를 바꿔주면 된다.

끝!

profile
호기심 많고 걱정도 많은 사람👻 @DevOps @Cloud

0개의 댓글