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 으로 설정하여 덮어쓰여지지 않도록 합니다.
'IT > Terraform' 카테고리의 다른 글
[Terraform] 특정 파일을 zip으로 변환하기 (Lambda함수 배포) (0) | 2022.06.27 |
---|---|
[Terraform] 테라폼 Best practice 네이밍 편 (0) | 2022.06.18 |
[Terraform] EKS Cluster 삭제시 aws-auth 에러 해결하기 (0) | 2022.06.16 |
[Terraform] slice 사용하여 리스트의 startindex, endindex값 가져오기 (0) | 2022.06.16 |
[Terraform] terraform init Error 해결 (0) | 2022.05.09 |