IT/Terraform

[Terraform] Terragrunt 란? (Terragrunt 사용법과 활용방법)

반응형

Intro

terragrunt는 테라폼 소스코드를 DRY(Don't Repeat Yourself) 하게 만들어주는 툴 입니다.

DRY 란 프로그래밍을 할때 반복작업을 하지 않는 것을 말하는데요. 자세한 내용은 다음 링크를 참고 바랍니다.

( DRY원칙이란?: https://kim-dragon.tistory.com/256)

테라폼 소스코드의 레이아웃은 폴더 레벨로 구분되어 집니다. 레이아웃은 규모에 따라서 달라집니다만 그 얘기를 하면 너무 길어질거 같으니 DRY에 대한 얘기만 해보겠습니다. 아래 레이아웃을 보면 반복되어지는 파일 backend.tf provider.tf main.tf 을 볼 수 있는데요. 오늘 주인공 terrgrunt를 하용하여 반복되는 파일들을 생성 해보도록 하겠습니다.

├── README.md
│   ├── modules
│   │   ├── dev
│   │   │   ├── global
│   │   │   │   ├── iam
│   │   │   │   │   ├── backend.tf
│   │   │   │   │   ├── provider.tf
│   │   │   │   │   ├── main.tf
│   │   │   │   │   └── terragrunt.hcl
│   │   │   │   └── s3
│   │   │   │       ├── backend.tf
│   │   │   │       ├── provider.tf
│   │   │   │       ├── main.tf
│   │   │   │       └── terragrunt.hcl  <--- 자식 terragrunt.hcl
│   │   │   ├── terragrunt.hcl  <--- 부모 terragrunt.hcl (preset 설정이 들어가있음)

terragrunt 사용법

우선 terragrunt를 설치하고 brew install terragrunt terragrunt.hcl의 파일을 아래와 같이 위치시킵니다.

├── README.md
│   ├── modules
│   │   ├── dev
│   │   │   ├── global
│   │   │   │   ├── iam
│   │   │   │   │   ├── terragrunt.hcl
│   │   │   │   └── s3
│   │   │   │       └── terragrunt.hcl  <--- 자식 terragrunt.hcl
│   │   │   ├── terragrunt.hcl  <--- 부모 terragrunt.hcl (preset 설정이 들어가있음)

그리고 부모 부모 terragrunt.hcl 파일에 아래와 같이 입력합니다.

  • 부모 terragrunt.hcl
remote_state {
    backend = "s3"
    generate = {
        path = "backend.tf"
        if_exists = "overwrite_terragrunt"
    #if_exists = "skip"
    }

    config = {
    bucket = "terraform-state"
        key = "${path_relative_to_include()}/terraform.tfstate"
        region = "ap-northeast-2"
        encrypt = true
        dynamodb_table = "tf-state-lock-${replace(path_relative_to_include(),"/","-")}"
        }
    }

generate "provider" {
    path = "provider.tf"
    if_exists = "overwrite_terragrunt"
    #if_exists = "skip"
    contents = <<EOF
provider "aws" {
    region = var.region
    default_tags {
        tags = {
        TerraformPath = "${path_relative_to_include()}"
        }
    }
}
EOF
}

generate "main" {
    path = "main.tf"
    #if_exists = "overwrite_terragrunt"
    if_exists = "skip"
    contents = <<EOF
EOF
}
.........

참고로 ${path_relative_to_include()} 를 사용하면 부모 경로로부터 자식 경로의 폴더 path를 가져오게 됩니다. 이를 활용하여 위 예제와 같이 lock으로 사용한 ddb테이블 생성과 s3 backend폴더 경로를 자동으로 path에 맞게 설정할 수 있습니다. 자식 terragrunt.hcl 를 아래와 같이 입력합니다.

  • 자식 terragrunt.hcl
include "root" {
path = find_in_parent_folders()
}

terragrunt 실행 방법

  • 터미널창으로 자식 terragrunt.hcl 의 폴더 위치로 이동
  • terragrunt init 명령어 실행

주의 사항

terragrunt init 시에 부모 terragrunt.hcl 에 정의해놓은 overwrite되지 말아야하는것들은 if_exists 파라미터에서 skip 으로 설정하여 덮어쓰여지지 않도록 합니다.

반응형