Terragrunt๋?
๐ฅ ๋ค์ด๊ฐ๋ฉฐ
์ต๊ทผ ํ์ฌ์์ Terraform์ผ๋ก ๊ด๋ฆฌํ๋ ์ธํ๋ผ ๊ตฌ์ฑ์ Terragrunt ๊ธฐ๋ฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ค.
๊ธฐ์กด์๋ Terraform๋ง์ผ๋ก๋ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์์์ง๋ง, ์๋น์ค๊ฐ ํ์ฅ๋๋ฉด์ ํ ๋์๋ณ๋ก ์ํ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ณตํต ์ค์ ์ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ํ์ํด์ก๋ค. ํนํ ์ฌ๋ฌ ํ ๋์๊ฐ ๊ฐ์ ํํ์ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ๊ฐ์์ ์ํ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋ค.
๋ํ VPC, subnet, route table ๊ฐ์ ๊ธฐ๋ณธ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ ์ฌ๋ฌ ํ
๋์๊ฐ ํจ๊ป ์ฌ์ฉํ๋ ๊ธฐ๋ฐ ๋ฆฌ์์ค์ ๊ฐ๊น์ ๋ค. ๊ทธ๋์ ์ด๋ฐ ๊ณตํต ์ธํ๋ผ๋ core ์์ญ์์ ๋จผ์ ๊ด๋ฆฌํ๊ณ , ๊ฐ ํ
๋์๋ core์์ ๋ง๋ค์ด์ง ๋คํธ์ํฌ ์ ๋ณด๋ฅผ ์ฐธ์กฐํด์ ์์ ์ ๋ฆฌ์์ค๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ๋ฅผ ์ก์๋ค.
์ด๋ฒ ๊ธ์์๋ Terragrunt๊ฐ ๋ฌด์์ธ์ง, Terraform๋ง ์ฌ์ฉํ ๋ ์ด๋ค ๋ถํธํจ์ด ์์๋์ง, ๊ทธ๋ฆฌ๊ณ Terragrunt๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ๋ฐฉ์์ผ๋ก ํ ๋์๋ณ ์ํ ๊ด๋ฆฌ์ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋์ง ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๐ Terragrunt๋?
Terragrunt๋ Terraform์ ๋ ํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ์์ ๋ํผ ๋๊ตฌ๋ค.
Terraform์ ๋์ฒดํ๋ ๋๊ตฌ๊ฐ ์๋๋ผ, Terraform ์์์ ๋์ํ๋ฉด์ ๋ฐ๋ณต๋๋ ์ค์ ์ ์ค์ด๊ณ ์ฌ๋ฌ ํ๊ฒฝ์ ์ธํ๋ผ ์ฝ๋๋ฅผ ๋ ๊ตฌ์กฐ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ค๋ค.
Terraform์ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์ ์ธํ๊ณ , plan, apply๋ฅผ ํตํด ์ค์ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋ค. ํ์ง๋ง ์ค์ ์ด์ ํ๊ฒฝ์์๋ ๋จ์ํ ๋ฆฌ์์ค๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ณ ๋ฏผ์ด ํ์ํ๋ค.
- dev, stage, prod ๊ฐ์ ํ๊ฒฝ์ ์ด๋ป๊ฒ ๋๋์ง
- ๊ฐ ํ๊ฒฝ์ state๋ฅผ ์ด๋์ ์ ์ฅํ ์ง
- ๊ณตํต module์ ์ด๋ป๊ฒ ์ฌ์ฌ์ฉํ ์ง
- ํ ๋์๋ณ ์ค์ ์ ์ด๋ป๊ฒ ๋ถ๋ฆฌํ ์ง
- ํ๊ฒฝ์ด ๋์ด๋ ๋ ์ค๋ณต ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ค์ผ์ง
Terragrunt๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Terraform ์ค์ ๋ฐ๊นฅ์์ ๊ณตํต ์ค์ , remote state, module source, dependency ๋ฑ์ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
Terraform๋ง ์ฌ์ฉํ ๋์ ๋ถํธํจ
Terraform๋ง ์ฌ์ฉํด๋ module์ ํ์ฉํ๋ฉด ์ด๋ ์ ๋ ์ค๋ณต์ ์ค์ผ ์ ์๋ค.
ํ์ง๋ง ํ๊ฒฝ์ด๋ ํ ๋์๊ฐ ๋์ด๋๋ฉด ๋น์ทํ ์ค์ ์ด ์ฌ๋ฌ ๊ณณ์ ๋ฐ๋ณต๋๊ธฐ ์ฝ๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ module์ ์ฌ์ฉํ์ง๋ง tenant-a, tenant-b, tenant-c์ฒ๋ผ ํ ๋์๋ณ๋ก ๋ณ์๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ Terraform ์ฝ๋๊ฐ ์๋์ฒ๋ผ ๋ฐ๋ณต๋ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
terraform/
โโโ prod
โ โโโ tenant-a
โ โ โโโ main.tf
โ โ โโโ backend.tf
โ โ โโโ variables.tf
โ โโโ tenant-b
โ โ โโโ main.tf
โ โ โโโ backend.tf
โ โ โโโ variables.tf
โ โโโ tenant-c
โ โโโ main.tf
โ โโโ backend.tf
โ โโโ variables.tf
โโโ modules
โโโ tenant
๋ฌผ๋ก ๋์์ ํ์ง๋ง ํ ๋์๊ฐ ์ถ๊ฐ๋ ์๋ก ๊ด๋ฆฌํด์ผ ํ๋ ํ์ผ์ด ๋ง์์ง๋ค. ํนํ backend ์ค์ ์ด๋ provider ์ค์ ์ฒ๋ผ ๊ฑฐ์ ๋์ผํ ๋ด์ฉ์ด ์ฌ๋ฌ ๋๋ ํฐ๋ฆฌ์ ๋ฐ๋ณต๋๋ค.
์ด๋ฐ ๊ตฌ์กฐ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
- ํ ๋์๋ณ backend ์ค์ ์ด ๋ฐ๋ณต๋๋ค.
- ๊ณตํต ์ค์ ์ด ๋ณ๊ฒฝ๋ ๋ ์ฌ๋ฌ ํ์ผ์ ์์ ํด์ผ ํ๋ค.
- ์ค์ ๋๋ฝ์ด๋ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๋ค.
- ์ ๊ท ํ ๋์ ์ถ๊ฐ ์ ์ฐจ๊ฐ ๋ฒ๊ฑฐ๋ก์์ง๋ค.
- state๋ฅผ ์ด๋ค ๋จ์๋ก ๋ถ๋ฆฌํ๋์ง ํ๋์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค.
์ ํ ๋์๋ณ state ๋ถ๋ฆฌ๊ฐ ํ์ํ ๊น?
Terraform์ state ํ์ผ์ ํตํด ํ์ฌ ์ธํ๋ผ ์ํ๋ฅผ ์ถ์ ํ๋ค.
state์๋ Terraform์ด ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ state๋ฅผ ์ด๋ป๊ฒ ๋๋์ง๋ ์ธํ๋ผ ์ด์์์ ์ค์ํ ์ค๊ณ ํฌ์ธํธ๋ค.
๋ฉํฐ ํ ๋์ ํ๊ฒฝ์์๋ ํ ๋์๋ณ๋ก state๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ๋ฆฌํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์๋ฅผ ๋ค์ด tenant-a์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๋ ์์ ์ด tenant-b์ state์ ์์ฌ ์๋ค๋ฉด ๋ณ๊ฒฝ ์ํฅ ๋ฒ์๊ฐ ์ปค์ง๋ค. ๋ฐ๋๋ก ํ ๋์๋ณ๋ก state๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด ํน์ ํ ๋์์ ๋ณ๊ฒฝ์ ํด๋น ํ ๋์์ state ์์์๋ง ๊ด๋ฆฌ๋๋ค.
ํ ๋์๋ณ state ๋ถ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ํน์ ํ ๋์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ํ ๋์์ ์ํฅ์ ์ฃผ๋ ์ํ์ ์ค์ผ ์ ์๋ค.
- ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ํฅ ๋ฒ์๋ฅผ ์ขํ์ ํ์ธํ ์ ์๋ค.
- ํ ๋์๋ณ plan, apply ์์ ์ด ๋ช ํํด์ง๋ค.
- ์ ๊ท ํ ๋์๋ฅผ ์ถ๊ฐํ ๋ ๊ธฐ์กด ํ ๋์์ state๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์๋ ๋๋ค.
- ์ด์ ์ค ๋กค๋ฐฑ์ด๋ ์ฌ์ ์ฉ ๋ฒ์๋ฅผ ์ ํํ๊ธฐ ์ฝ๋ค.
ํ์ฌ์์๋ ์ด๋ฒ ๋ง์ด๊ทธ๋ ์ด์ ์ ํต์ฌ์ Terraform ์ฝ๋๋ฅผ ๋จ์ํ Terragrunt๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ, ํ ๋์๋ณ๋ก state๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด์๋ค.
Terragrunt๋ฅผ ์ฌ์ฉํ ๊ตฌ์กฐ
Terragrunt๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๋๋ ํฐ๋ฆฌ์ ๊ณตํต ์ค์ ์ ๋๊ณ , ํ์ ๋๋ ํฐ๋ฆฌ์์๋ ๊ฐ ํ๊ฒฝ์ด๋ ํ ๋์์ ํ์ํ ๊ฐ๋ง ์ ์ํ ์ ์๋ค.
์ด๋ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด live์ modules๋ฅผ ๋๋๋ ๊ตฌ์กฐ๋ค.
live: ์ค์ ํ๊ฒฝ๋ณ Terragrunt ์ค์ modules: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ Terraform module
modules์๋ VPC, tenant ๋ฆฌ์์ค์ฒ๋ผ ์ฌ์ฌ์ฉํ Terraform ์ฝ๋๊ฐ ๋ค์ด๊ฐ๊ณ , live์๋ prod, stage ๊ฐ์ ์ค์ ํ๊ฒฝ์์ ์ด๋ค module์ ์ด๋ค ๊ฐ์ผ๋ก ์คํํ ์ง ์ ์ํ๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
infra/
โโโ live
โ โโโ terragrunt.hcl
โ โโโ prod
โ โ โโโ core
โ โ โ โโโ network
โ โ โ โโโ terragrunt.hcl
โ โ โโโ tenants
โ โ โโโ tenant-a
โ โ โ โโโ terragrunt.hcl
โ โ โโโ tenant-b
โ โ โโโ terragrunt.hcl
โ โโโ stage
โ โโโ core
โ โ โโโ network
โ โ โโโ terragrunt.hcl
โ โโโ tenants
โ โโโ tenant-a
โ โโโ terragrunt.hcl
โโโ modules
โโโ network
โโโ tenant
live/terragrunt.hcl์๋ ๊ณตํต remote state ์ค์ ์ด๋ ๊ณตํต input์ ๋ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
remote_state {
backend = "s3"
config = {
bucket = "my-terraform-state"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
์ฌ๊ธฐ์ path_relative_to_include()๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ Terragrunt ์ค์ ํ์ผ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก state key๋ฅผ ๋ง๋ค ์ ์๋ค.
์๋ฅผ ๋ค์ด live/prod/tenants/tenant-a์์ ์คํํ๋ฉด ์๋์ ๊ฐ์ key๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1
prod/tenants/tenant-a/terraform.tfstate
live/prod/tenants/tenant-b์์ ์คํํ๋ฉด state key๋ ๋ฌ๋ผ์ง๋ค.
1
prod/tenants/tenant-b/terraform.tfstate
์ฆ, ๊ณตํต remote state ์ค์ ์ ์ฌ์ฌ์ฉํ๋ฉด์๋ ์ค์ state ํ์ผ์ ํ ๋์๋ณ๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
core์ tenant ๋ถ๋ฆฌ
์ด๋ฒ ๊ตฌ์กฐ์์ ์ค์ํ ๋ถ๋ถ์ core์ tenant๋ฅผ ๋ถ๋ฆฌํ ๊ฒ์ด๋ค.
core๋ ์ฌ๋ฌ ํ
๋์๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๊ธฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ๋ ์์ญ์ด๋ค. ์๋ฅผ ๋ค๋ฉด VPC, subnet, route table, security group์ฒ๋ผ ํ
๋์๋ณ๋ก ๋งค๋ฒ ์๋ก ๋ง๋ค๊ธฐ๋ณด๋ค ๊ณตํต ๊ธฐ๋ฐ์ผ๋ก ๋๊ณ ํจ๊ป ์ฌ์ฉํ๋ ๋ฆฌ์์ค๊ฐ ์ฌ๊ธฐ์ ๋ค์ด๊ฐ ์ ์๋ค.
๋ฐ๋ฉด tenant ์์ญ์ ๊ฐ ํ
๋์์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ค. ์ด๋ ํ
๋์ ๋ฆฌ์์ค๋ ๋คํธ์ํฌ๋ฅผ ์ง์ ์๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, core์์ ๋ง๋ค์ด๋ ๋คํธ์ํฌ ์ ๋ณด๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ๋๋๋ฉด ์ฑ ์์ด ๋ช ํํด์ง๋ค.
core: ๊ณตํต ๋คํธ์ํฌ์ ๊ธฐ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌtenant: ํ ๋์๋ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค ๊ด๋ฆฌmodules: ์ค์ Terraform module ์ ์
์๋ฅผ ๋ค์ด core/network์์๋ VPC์ subnet์ ๋ง๋ค๊ณ output์ผ๋ก ํ์ํ ๊ฐ์ ๋ด๋ณด๋ผ ์ ์๋ค.
1
2
3
4
5
6
7
output "vpc_id" {
value = aws_vpc.main.id
}
output "private_subnet_ids" {
value = aws_subnet.private[*].id
}
๊ทธ๋ฆฌ๊ณ ํ
๋์ ์ชฝ Terragrunt ์ค์ ์์๋ dependency๋ฅผ ์ฌ์ฉํด core/network์ output์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
dependency "network" {
config_path = "../../core/network"
}
inputs = {
environment = "prod"
tenant_name = "tenant-a"
vpc_id = dependency.network.outputs.vpc_id
private_subnet_ids = dependency.network.outputs.private_subnet_ids
}
์ด ๊ตฌ์กฐ์์๋ ํ ๋์๊ฐ ๋์ด๋๋ VPC๋ subnet ๊ฐ์ ๊ธฐ๋ณธ ๋คํธ์ํฌ๋ฅผ ๊ณ์ ๋ณต์ฌํด์ ๋ง๋ค ํ์๊ฐ ์๋ค. ๊ฐ ํ ๋์๋ ๊ณตํต ๋คํธ์ํฌ ์์์ ํ์ํ ๋ฆฌ์์ค๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
๋ํ core์ tenant์ state๊ฐ ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๊ณตํต ๋คํธ์ํฌ๋ฅผ ๋ณ๊ฒฝํ๋ ์์
๊ณผ ํน์ ํ
๋์ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๋ ์์
์ ๊ตฌ๋ถํ ์ ์๋ค. ๊ณตํต ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋๋ ๋ ์ ์คํ๊ฒ ๋ฆฌ๋ทฐํ๊ณ , ํ
๋์๋ณ ๋ณ๊ฒฝ์ ์๋์ ์ผ๋ก ์ข์ ๋ฒ์์์ ์ ์ฉํ ์ ์๋ค.
ํ ๋์๋ณ terragrunt.hcl ์์
๊ฐ ํ
๋์ ๋๋ ํฐ๋ฆฌ์ terragrunt.hcl์์๋ ๊ณตํต ์ค์ ์ includeํ๊ณ , ์ฌ์ฉํ Terraform module๊ณผ ์
๋ ฅ๊ฐ๋ง ์ ์ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include {
path = find_in_parent_folders()
}
terraform {
source = "../../../../modules/tenant"
}
dependency "network" {
config_path = "../../core/network"
}
inputs = {
environment = "prod"
tenant_name = "tenant-a"
vpc_id = dependency.network.outputs.vpc_id
private_subnet_ids = dependency.network.outputs.private_subnet_ids
}
include๋ ์์ ๋๋ ํฐ๋ฆฌ์ terragrunt.hcl์ ๊ฐ์ ธ์ค๋ ์ค์ ์ด๋ค.
find_in_parent_folders()๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋๋ ํฐ๋ฆฌ์์๋ถํฐ ์์ ๋๋ ํฐ๋ฆฌ๋ก ์ฌ๋ผ๊ฐ๋ฉฐ terragrunt.hcl์ ์ฐพ๋๋ค. ๊ทธ๋์ ํ์ ํ
๋์ ์ค์ ์์๋ remote state ๊ฐ์ ๊ณตํต ์ค์ ์ ๋ฐ๋ณตํด์ ์์ฑํ์ง ์์๋ ๋๋ค.
terraform.source์๋ ์ค์ ์ฌ์ฉํ Terraform module ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
dependency๋ ๋ค๋ฅธ Terragrunt module์ output์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ค. ์ ์์์์๋ core/network์์ ์์ฑํ VPC ID์ private subnet ID๋ฅผ ๊ฐ์ ธ์ ํ
๋์ module์ input์ผ๋ก ๋๊ธฐ๊ณ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ ๋์๋ณ ๋๋ ํฐ๋ฆฌ์์๋ ์๋ ๋ด์ฉ๋ง ๊ด๋ฆฌํ๋ฉด ๋๋ค.
- ์ด๋ค module์ ์ฌ์ฉํ ์ง
- ์ด๋ค ํ๊ฒฝ์ธ์ง
- ์ด๋ค ํ ๋์์ธ์ง
- ์ด๋ค core ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ์ง
- ํ ๋์๋ณ๋ก ๋ฌ๋ผ์ง๋ ์ ๋ ฅ๊ฐ์ ๋ฌด์์ธ์ง
Terragrunt๋ก ๊ฐ์ ๋ ์
์ด๋ฒ ๋ง์ด๊ทธ๋ ์ด์ ์ ํตํด ๊ฐ์ฅ ํฌ๊ฒ ๊ฐ์ ๋ ๋ถ๋ถ์ ์ค๋ณต ์ ๊ฑฐ์ ํ์ฅ์ฑ์ด๋ค.
๊ธฐ์กด์๋ ์๋ก์ด ํ ๋์๋ฅผ ์ถ๊ฐํ ๋ ๋น์ทํ Terraform ์ค์ ์ ๋ณต์ฌํ๊ณ , backend ์ค์ ์ด๋ ๋ณ์ ํ์ผ์ ์ง์ ์์ ํด์ผ ํ๋ค. ์ด ๊ณผ์ ์์ ์ค์ ์ด ๋๋ฝ๋๊ฑฐ๋ ๊ธฐ์กด ํ ๋์์ ๋ค๋ฅด๊ฒ ์์ฑ๋ ๊ฐ๋ฅ์ฑ์ด ์์๋ค.
Terragrunt๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต ์ค์ ์ ์์ ํ์ผ์์ ๊ด๋ฆฌํ๊ณ , ํ ๋์๋ณ ์ค์ ์ ํ์ํ ์ ๋ ฅ๊ฐ๋ง ์์ฑํ๋ฉด ๋๋ค.
์ ๊ท ํ
๋์๋ฅผ ์ถ๊ฐํ ๋๋ ์ ์ฒด Terraform ์ฝ๋๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์๋ค. ์๋ก์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ terragrunt.hcl์ ํ
๋์๋ณ input๋ง ์ ์ํ๋ฉด ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
live/
โโโ prod/
โโโ core/
โ โโโ network/
โ โโโ terragrunt.hcl
โโโ tenants/
โโโ tenant-a/
โ โโโ terragrunt.hcl
โโโ tenant-b/
โ โโโ terragrunt.hcl
โโโ tenant-c/
โโโ terragrunt.hcl
์ด ๊ตฌ์กฐ์์๋ ํ
๋์๊ฐ ๋์ด๋๋ ๊ธฐ์กด module๊ณผ ๊ณตํต ์ค์ ์ ์ฌ์ฌ์ฉํ ์ ์๋ค. ๊ณตํต ๋คํธ์ํฌ๋ core์์ ํ ๋ฒ ๊ด๋ฆฌํ๊ณ , ๊ฐ ํ
๋์๋ ๊ทธ output์ ์ฐธ์กฐํด์ ํ์ํ ๋ฆฌ์์ค๋ง ์์ฑํ๋ค. ๋์์ state๋ core์ ํ
๋์๋ณ๋ก ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ์ํฅ ๋ฒ์๋ ๋ช
ํํด์ง๋ค.
Terragrunt๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
Terragrunt๊ฐ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ ์๋๋ค.
Terraform ์์ ํ ๊ณ์ธต์ด ๋ ์๊ธฐ๋ ๋งํผ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ์ ์ค์ ๊ท์น์ ๋ช ํํ ์ ํด์ผ ํ๋ค. ๊ตฌ์กฐ๊ฐ ์ ๋งคํ๋ฉด Terraform๋ง ์ฌ์ฉํ ๋๋ณด๋ค ์คํ๋ ค ๋ณต์กํด์ง ์ ์๋ค.
ํนํ ์๋ ๋ด์ฉ์ ์ด๊ธฐ์ ์ ์ ํ๋ ๊ฒ์ด ์ข๋ค.
- state๋ฅผ ์ด๋ค ๋จ์๋ก ๋ถ๋ฆฌํ ์ง
- ํ๊ฒฝ๊ณผ ํ ๋์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ๊ฐ์ง
- ๊ณตํต ์ค์ ๊ณผ ๊ฐ๋ณ ์ค์ ์ ๊ฒฝ๊ณ๋ฅผ ์ด๋์ ๋์ง
- core ๋ฆฌ์์ค์ tenant ๋ฆฌ์์ค์ ์ฑ ์์ ์ด๋๊น์ง ๋๋์ง
- module ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ์ง
- ๋ฆฌ์์ค ๊ฐ dependency๋ฅผ Terragrunt๋ก ๊ด๋ฆฌํ ์ง
- ์ ๊ท ํ ๋์ ์ถ๊ฐ ์ ์ฐจ๋ฅผ ์ด๋ป๊ฒ ํ์คํํ ์ง
Terragrunt ๋์ ์ ํต์ฌ์ ๋๊ตฌ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ, ์ธํ๋ผ ์ฝ๋์ ๊ฒฝ๊ณ์ ์ฑ ์์ ๋ค์ ์ค๊ณํ๋ ๊ฒ์ ๊ฐ๊น๋ค.
๋ง๋ฌด๋ฆฌ
Terragrunt๋ Terraform์ ๋์ฒดํ๋ ๋๊ตฌ๊ฐ ์๋๋ผ Terraform์ ๋ ๊ตฌ์กฐ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋๊ตฌ๋ค.
Terraform๋ง์ผ๋ก๋ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์์ง๋ง, ์ฌ๋ฌ ํ๊ฒฝ๊ณผ ์ฌ๋ฌ ํ ๋์๋ฅผ ์ด์ํด์ผ ํ๋ ์ํฉ์์๋ ๊ณตํต ์ค์ ๊ณผ state ๊ด๋ฆฌ๊ฐ ์ ์ ๋ณต์กํด์ง๋ค.
์ด๋ฒ ๋ง์ด๊ทธ๋ ์ด์
์์๋ Terragrunt๋ฅผ ์ฌ์ฉํด ๊ณตํต ์ค์ ์ ์ฌ์ฌ์ฉํ๊ณ , ํ
๋์๋ณ๋ก state๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋ค. ํนํ ๊ธฐ๋ณธ ๋คํธ์ํฌ ๊ฐ์ ๊ณตํต ๋ฆฌ์์ค๋ core์์ ๊ด๋ฆฌํ๊ณ , ๊ฐ ํ
๋์๋ core์ output์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ค. ์ด๋ฅผ ํตํด ์ ๊ท ํ
๋์๋ฅผ ์ถ๊ฐํ ๋์ ์์
๋์ ์ค์ด๊ณ , ๋ณ๊ฒฝ ์ํฅ ๋ฒ์๋ฅผ ๋ ๋ช
ํํ๊ฒ ๊ด๋ฆฌํ ์ ์์๋ค.
๊ฒฐ๊ตญ ์ค์ํ ๊ฒ์ Terragrunt ์์ฒด๋ณด๋ค๋ state๋ฅผ ์ด๋ค ๋จ์๋ก ๋๋๊ณ , ์ด๋ค ์ค์ ์ ๊ณตํตํํ๋ฉฐ, ์ด๋ค ๊ฐ์ ํ ๋์๋ณ๋ก ๋ถ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ ์ค๊ณ๋ค.
Terragrunt๋ ๊ทธ ์ค๊ณ๋ฅผ ์ฝ๋๋ก ์ ์งํ๊ธฐ ์ฝ๊ฒ ๋์์ฃผ๋ ๋๊ตฌ๋ผ๊ณ ๋ณผ ์ ์๋ค.
