๐กcloudNet@ ํ์ ๊ฐ์๋ค ๋์ด ์งํํ๋ Terraform 101 Study 4๊ธฐ 1์ฃผ์ฐจ ๋ด์ฉ์ผ๋ก,
[ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC] ๋์๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค..
1. ํ ๋ผํผ ๋ธ๋ก
ํ ๋ผํผ ๋ธ๋ก์ ํ ๋ผํผ์ ๊ตฌ์ฑ์ ๋ช ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค. ํ ๋ผํผ ๋ฒ์ ์ด๋ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ฐ์ ๊ฐ๋ค์ ์๋์ผ๋ก ์ค์ ๋์ง๋ง, ๋ค๋ฅธ ์ฌ๋๊ณผ ํจ๊ป ์์ ํ ๋๋ ๋ฒ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ณ ํ์ํ ์กฐ๊ฑด์ ์ ๋ ฅํ์ฌ ์คํ ์ค๋ฅ๋ฅผ ์ต์ํํด์ผํ๋ค.
(๋ํ ํ์ ์ ๊ด์ ์์ ๋ณด์์ ๋, ๋ค๋ฅธ ์ฌ๋์ด ์คํํ๋ ๊ฒฝ์ฐ์ ๋๋นํด ํ ๋ผํผ์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ๋ช ํํ ์ ์ํด์ผ ์ค๋ฅ ๋ฑ์ ๋ฐฉ์งํ ์ ์๋ค.)
terraform {
required_version = "~> 1.3.0" # ํ
๋ผํผ ๋ฒ์
required_providers { # ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ ๋์ด
random = {
version = ">= 3.0.0, < 3.1.0"
}
aws = {
version = "4.2.0"
}
}
cloud { # Cloud/Enterprise ๊ฐ์ ์๊ฒฉ ์คํ์ ์ํ ์ ๋ณด
organization = "<MY_ORG_NAME>"
workspaces {
name = "my-first-workspace"
}
}
backend "local" { # state๋ฅผ ๋ณด๊ดํ๋ ์์น๋ฅผ ์ง์
path = "relative/path/to/terraform.tfstate"
}
}
- ๋ช ์ฌํ ๊ฒ์, ์ธ์ ์คํํ๋์ง ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ด์ผ ํ๋ค!
๊ทธ๋ฆฌ๊ณ ์ ์ ๋ฒ์ ํ๊ธฐ์ ๋ํด ์ค๋ช ํ๊ฒ๋ค.
ํ ๋ผํผ ๋ด์์ ๋ฒ์ ์ด ๋ช ์๋๋ terraform, module์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฒ์ ์ ๋ํ ์ ์ฝ์ ๋ ์ผ๋ก ํ ๋ผํผ, ํ๋ก๋ฐ์ด๋, ๋ชจ๋์ด ํญ์ ์๋ํ ์ ์๋๋ก ์คํ๋๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
๋ฒ์ ์ฒด๊ณ๋ *์๋ฉํฑ ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.
- ์๋ฉํฑ ๋ฒ์ ๋์ด๋? : ๋ฒ์ ํํ ๋ฐฉ์ ์ค ํ๋๋ก, ์ซ์ 3์๋ฆฌ๋ก ๋ฒ์ ์ ํํํ๋ค. ex, 1.3.4
# version = Major.Minor.Patch
version = 1.3.4
์๋ฉํฑ ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ์์ ์ดํดํ๋ฉด ์ ๊ทธ๋ ์ด๋ ์ ์ํฅ๋๋ฅผ ์ถ์ธกํ ์ ์๋ค.
- Major ๋ฒ์ : ๋ด๋ถ ๋์์ API๊ฐ ๋ณ๊ฒฝ ๋๋ ์ญ์ ๋๊ฑฐ๋ ํ์ ํธํ์ด ๋์ง ์๋ ๋ฒ์
- Minor ๋ฒ์ : ์ ๊ท ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๊ฐ์ ๋๊ณ ํ์ ํธํ์ด ๊ฐ๋ฅํ ๋ฒ์
- Patch ๋ฒ์ : ๋ฒ๊ทธ ๋ฐ ์ผ๋ถ ๊ธฐ๋ฅ์ด ๊ฐ์ ๋ ํ์ ํธํ์ด ๊ฐ๋ฅํ ๋ฒ์
๋ฒ์ ์ ์ฝ ๊ตฌ๋ฌธ์ ๋ค๋ฆ ํ๋ก๊ทธ๋จ ์ธ์ด์์์ ์ข ์์ฑ ๊ด๋ฆฌ ์์คํ ๊ณผ ํก์ฌํ๋ค.
=
๋๋ ์ฐ์ฐ์ ์์ : ์ง์ ๋ ๋ฒ์ ๋ง์ ํ์ฉํ๊ณ ๋ค๋ฅธ ์กฐ๊ฑด๊ณผ ๋ณ๊ธฐํ ์ ์๋ค.!=
: ์ง์ ๋ ๋ฒ์ ์ ์ ์ธํ๋ค.>, >=, <, <=
: ์ง์ ๋ ๋ฒ์ ๊ณผ ๋น๊ตํด ์กฐ๊ฑด(๋ถ๋ฑํธ)์ ๋ง๋ ๊ฒฝ์ฐ ํ์ฉํ๋ค.~>
: ์ง์ ๋ ๋ฒ์ ์์ ๊ฐ์ฅ ์๋ฆฌ์๊ฐ ๋ฎ์ ๊ตฌ์ฑ์์๋ง ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ฉํ๋ค.~> x.y
์ธ ๊ฒฝ์ฐ y ๋ฒ์ ์ ๋ํด์๋ง,~> x.y.z
์ธ ๊ฒฝ์ฐ z ๋ฒ์ ์ ๋ํด์๋ง ๋ณด๋ค ํฐ ๋ฒ์ ์ ํ์ฉํ๋ค
- ํ ๋ผํผ ๋ฒ์ ๊ด๋ฆฌ๋ก ๋น์ ๋ ์ ์ธ ๋ฐฉ์์ ์๋ฏธ
์ ์ธ๋ ๋ฒ์ | ์๋ฏธ | ๊ณ ๋ ค ์ฌํญ |
---|---|---|
1.0.0 | ํ ๋ผํผ v1.0.0๋ง์ ํ์ฉํ๋ค | ํ ๋ผํผ์ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ ์ํด์๋ ์ ์ธ๋ ๋ฒ์ ์ ๋ณ๊ฒฝํด์ผ๋ง ํ๋ค |
>= 1.0.0 | ํ ๋ผํผ v1.0.0 ์ด์์ ๋ชจ๋ ๋ฒ์ ์ ํ์ฉํ๋ค | v1.0.0 ๋ฒ์ ์ ํฌํจํด ๊ทธ ์ด์์ ๋ชจ๋ ๋ฒ์ ์ ํ์ฉํด ์คํ๋๋ค |
~> 1.0.0. | ํ ๋ผํผ v1.0.0์ ํฌํจํ v1.0.x ๋ฒ์ ์ ํ์ฉํ๊ณ v1.x๋ ํ์ฉํ์ง ์๋๋ค | ๋ถ๋ฒ์ ์ ๋ํ ์ ๋ฐ์ดํธ๋ ๋ฌด์ค๋จ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค |
>= 1.0, < 2.0.0 | ํ ๋ผํผ v1.0.0 ์ด์ v2.0.0 ๋ฏธ๋ง์ธ ๋ฒ์ ์ ํ์ฉํ๋ค | ์ฃผ๋ฒ์ ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๋ค |
1.1 ํ ๋ผํผ ๋ฒ์
required_version ์ผ๋ก ์ ์๋๋ ํ ๋ผํผ ๋ฒ์ ์ ์ง์ ๋ ์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๊ณ ์ดํ ๋์์ ์ํํ์ง ์๋๋ค.
required_version์ผ๋ก ์ ์ด๋๋ ๋ฒ์ ์ ํ์ ํ์ธํด๋ณด๊ธฐ ์ํด main.tf์ terraform ๋ธ๋ก๊ณผ ๊ด๋ จ๋ ๊ฐ์ ์ถ๊ฐํด๋ณธ๋ค.
- ํ์ฌ ํ ๋ผํผ ๋ฒ์ ํ์ธ
- main.tf ์ฝ๋ํ์ผ์ ์์ ํ init ๋ช ๋ น ์คํ ๊ฒฐ๊ณผ
- ์คํ ํ๊ฒฝ ๋ฒ์ ์ ๋ํ ์กฐ๊ฑด์ ๋ณ๊ฒฝํ๊ณ ๋ค์ ์งํํ๋ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
1.2 ํ๋ก๋ฐ์ด๋ ๋ฒ์
ํ ๋ผํผ 0.13 ๋ฒ์ ์ด์ ์์๋ provider ๋ธ๋ก์ ํจ๊ป ๋ฒ์ ์ ๋ช ์ํ์ง๋ง, ํด๋น ๋ฒ์ ์ดํ ํ๋ก๋ฐ์ด๋์ ๋ฒ์ ์ terraform ๋ธ๋ก์์ reauired_providers์ ์ ์ํ๋ค.
ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ ๊ณต์ ํ์ด์ง์์ ์ํ๋ ํ๋ก๋ฐ์ด๋๋ฅผ ์ ํํ๋ฉด ํ ๋ผํผ ์ฝ๋์ ํด๋น ๋ฒ์ ์ ์ฌ์ฉํ๋ ์ํ ์ฝ๋๊ฐ ๋ํ๋๋ค.
ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ด ๋์ํ๋ ๊ฒ์ ํ์ธํด๋ณด๊ฒ ๋ค.
terraform ๋ธ๋ก์ required_providers ๊ฐ์ ์ถ๊ฐํด๋ณธ๋ค.
(์๋์ ์ผ๋ก ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ ์ ํํ๋ ํ ์คํธ๋ก, ํ์ฌ ์คํ๋๋ ๋ฒ์ ๋ณด๋ค ๋ง์ด ๋๊ฒ ์ค์ ํด๋ดค๋ค.)
terraform {
required_version = ">= 1.0.0"
required_providers {
local = {
source = "hashicorp/local"
version = ">=10000.0.0"
}
}
}
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
}
์ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ํด๋น ๋ฒ์ ์ ํ๋ก๋ฐ์ด๋๊ฐ ์์ด init ๋ช ๋ น์ด ์คํจํ๋ค.
์ ๋๋ก ์คํ์ํค๊ธฐ ์ํด version์ 2.0.0 ์ผ๋ก ์์ ํ์ฌ ์งํํด๋ณด๊ฒ ๋ค.
1.3 Cloud ๋ธ๋ก
Terraform Cloud, Terraform Enterprise๋ CLS, VCS, API ๊ธฐ๋ฐ์ ์คํ ๋ฐฉ์์ ์ง์ํ๊ณ cloud ๋ธ๋ก์ผ๋ก ์ ์ธํ๋ค.
- cloud ๋ธ๋ก์ 1.1 ๋ฒ์ ์ ์ถ๊ฐ๋์๊ณ , ๊ธฐ์กด์๋ State ์ ์ฅ์๋ฅผ ์๋ฏธํ๋ backend์ remote ํญ๋ชฉ์ผ๋ก ์ค์ ํ๋ค.
- hostname์ ๊ธฐ๋ณธ๊ฐ์ด app.terraform.io๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ํด๋น ์ฃผ์๋ ํ ๋ผํผ ํด๋ผ์ฐ๋์ URL์ด๋ค.
1.4 ๋ฐฑ์๋ ๋ธ๋ก State
๋ฐฑ์๋ ๋ธ๋ก์ ๊ตฌ์ฑ์ ํ ๋ผํผ ์คํ ์ ์ ์ฅ๋๋ State(์ํ ํ์ผ)์ ์ ์ฅ ์์น๋ฅผ ์ ์ธํ๋ค.
์ฃผ์ํ ์ ์, ํ๋์ ๋ฐฑ์๋๋ง ํ์ฉํ๋ค๋ ์ ์ด๋ค. ํ ๋ผํผ์ state์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ก ๊ด๋ จ๋ ๋ฆฌ์์ค๋ฅผ ํ์ํ๊ณ ์ถ์ ํ๋ค.
(์์ ์ ๊ฐ์ ํ์ ์ ๊ณ ๋ คํ๋ฉด, ์ธ๋ถ ๋ฐฑ์๋ ์ ์ฅ์๊ฐ ํ์ํ๋ค. ํ ๋ผํผ์ผ๋ก ์์ฑํ ๋ฆฌ์์ค์ ์ํ ์ ์ฅ ํ์ผ์ ๊ณต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.)
๊ทธ๋ฆฌ๊ณ state์๋ ์ธ๋ถ๋ก ๋ ธ์ถ๋๋ฉด ์๋๋ ํจ์ค์๋ ๋๋ ์ธ์ฆ์ ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ์ด ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์ state์ ์ ๊ทผ ์ ์ด๊ฐ ํ์ํ๋ค.
state ์ ๊ธ ๋์
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋๋ ๋ฐฑ์๋๋ local์ด๋ค. ์ํ๋ฅผ ์์ ์์ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ด ๋ฐ์ ๋ค๋ฅธ ๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋์์ ์ฌ๋ฌ ์์ ์๊ฐ ์ ๊ทผํด ์ฌ์ฉํ ์ ์๋๋ก ๊ณต์ ์คํ ๋ฆฌ์ง ๊ฐ์ ๊ฐ๋ ์ ๊ฐ๋๋ค. ๊ณต์ ๋๋ ๋ฐฑ์๋์ state๊ฐ ๊ด๋ฆฌ๋๋ฉด ํ ๋ผํผ์ด ์คํ๋๋ ๋์ .terraform.tfstate.lock.info ํ์ผ์ด ์์ฑ๋๋ฉฐ ํด๋น state๋ฅผ ๋์์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ ๊ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
ํ๋ฒ terraform apply๋ฅผ ์คํํ์ฌ ์ ๊ธ ํ์ผ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํด๋ณด๊ฒ ๋ค.
{"ID":"8b7f68ed-648c-7644-f15e-22d90636e368","Operation":"OperationTypeApply",
"Info":"","Who":"devcw@woos-dev-server","Version":"1.8.5","Created":"
2024-06-15T08:13:19.029830824Z","Path":"terraform.tfstate"}
- apply ๋์ ์ ์์ฑ๋๋ ์ ๊ธ ํ์ผ ๋ด์ฉ
์ฒซ ๋ฒ์งธ ํฐ๋ฏธ๋์์ apply๋ฅผ ์งํํ๊ณ ๋๊ธฐ์ค์ธ ์ํ์์, ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์ด์ด apply๋ฅผ ์คํ์์ผ ๋ณด๊ฒ ๋ค.
- ๋ ๋ฒ์งธ๋ก ์คํํ terraform apply ์์๋ ๋ค๋ฅธ ํ ๋ผํผ ์คํ์ผ๋ก state๊ฐ ์ ๊ฒผ๋ค๊ณ ๋ํ๋๋ค.
๋์์ ๋์ผํ state์ ์ ๊ทผ์ด ๋ฐ์ํ์ผ๋ฏ๋ก, ์ ๊ธ ํ์ผ์ ๋ด์ฉ์ด ํ๊ธฐ๋๋ฉฐ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
๋งค์ธ์ง์ ๋ํ๋ -lock=false ์ต์ ์ผ๋ก ์ ๊ธ์ ๋ฌด์ํ ์ ์์ผ๋, ์ฃผ์๊ฐ ํ์ํ๋ค.
๋ฐฑ์๋ ์ค์ ๋ณ๊ฒฝ
๋ฐฑ์๋๊ฐ ์ค์ ๋๋ฉด ๋ค์ init ๋ช ๋ น์ ํตํด state์ ์์น๋ฅผ ์ฌ์ค์ ํด์ผ ํ๋ค.
๋ฐฑ์๋ ๋ธ๋ก์ local๋ฅผ ์ ์ํ์ฌ init ๋ช ๋ น์ ์ํํ๋ค.
**terraform {
backend "local" {
path = "state/terraform.tfstate"
}
}**
resource "local_file" "abc" {
content = "123456!"
filename = "${path.module}/abc.txt"
}
2. ๋ฆฌ์์ค
๋ฆฌ์์ค๋ ํ ๋ผํผ์ด ํ๋ก๋น์ ๋ ๋๊ตฌ๋ผ๋ ์ธก๋ฉด์์ ๊ฐ์ฅ ์ค์ํ ์์๋ค. ๋ฆฌ์์ค ๋ธ๋ก์ ์ ์ธ๋ ํญ๋ชฉ์ ์์ฑํ๋ ๋์์ ์ํํ๋ค.
2.1 resoruce ๋ฆฌ์์ค ๊ตฌ์ฑ
๋ฆฌ์์ค ๋ธ๋ก์ resource๋ก ์์ํ๋ค. ์ดํ ๋ฆฌ์์ค ๋ธ๋ก์ด ์์ฑํ ๋ฆฌ์์ค ์ ํ์ ์ ์ํ๋ค.
- ๋ฆฌ์์ค ์ด๋ฆ์ ์๋ฏธ : ํ๋ก๋ฐ์ด๋์ด๋ฆ_ํ๋ก๋ฐ์ด๋์์ค์ ํ
- ๋ฆฌ์์ค ์ ํ์ด ์ ์ธ๋๋ฉด ๋ค์๋ ๊ณ ์ ํ ์ด๋ฆ์ ๋ถ์ธ๋ค. ์ด๋ฆ์ ๋์ผํ ์ ํ์ ๋ํด ์๋ณ์ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด๋ฆ ๋ค์๋ ๋ฆฌ์์ค ์ ํ์ ๋ํ ๊ตฌ์ฑ ์ธ์๋ค์ด ์ค๊ดํธ ๋ด์ ์ ์ธ๋๋ค.(์ ํ ์ธ์๊ฐ ํ์ํ์ง ์๋๋ผ๋ ์ค๊ดํธ๋ ์ ๋ ฅํ๋ค)
resource "<๋ฆฌ์์ค ์ ํ>" "<์ด๋ฆ>" {
<์ธ์> = <๊ฐ>
}
resource "local_file" "abc" {
content = "123"
filename = "${path.module}/abc.txt"
}
๋ฆฌ์์ค์์ ์ฌ์ฉ๋๋ ์ ํ๋ค์ ํ๋ก๋ฐ์ด๋์ ์ข ์์ฑ์ ๊ฐ๋๋ค. ํน์ ํ๋ก๋ฐ์ด๋์ ์ ํ๋ง ์ถ๊ฐํด๋ terraform init๋ฅผ ์ํํ๋ฉด ํด๋น ํ๋ก๋ฐ์ด๋๋ฅผ ์ค์นํ๋ค.
๊ธฐ์กด main.tf์ aws_instance ์ ํ์ ์ถ๊ฐํ๊ณ init์ ์ํํด๋ณด๊ฒ ๋ค.
# main.tf
resource "**local**_file" "abc" {
content = "123"
filename = "${path.module}/abc.txt"
}
resource "**aws**_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
AWS ํ๋ก๋ฐ์ด๋ ์ ์ธ ์์ด๋ ์ค์น๊ฐ ์งํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(๋ณดํต ํ๋ก๋ฐ์ด๋์ ๋ฐ๋ผ ์ ์ ์ ๋ณด๋ ํ์ ์ธ์๋ฅผ ์ ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, ์ผ๋ฐ์ ์ผ๋ก๋ ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.)
ํ๋ก๋ฐ์ด๋์ ๋ฆฌ์์ค ์ ํ์ ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ ํ์ด์ง์์ ํ์ธํ ์ ์๊ณ , ์ดํ ํฌ์คํ ํด๋ณด๊ฒ ๋ค.
- ๋ฆฌ์์ค ๋์ ๋ณด์กฐ ์ถ๊ฐ ๋ฉํ์ธ์๋ฅผ ์ ์ ํ ์ ์๋ค.
- depends_on : ์ข ์์ฑ์ ์ ์ธํ๋ฉฐ, ์ ์ธ๋ ๊ตฌ์ฑ์์์์ ์์ฑ ์์ ์ ๋ํด ์ ์
- count : ์ ์ธ๋ ๊ฐ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- for_each : map ๋๋ set ํ์ ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- provider : ๋์ผํ ํ๋ก๋ฐ์ด๋๊ฐ ๋ค์ ์ ์๋์ด ์๋ ๊ฒฝ์ฐ ์ง์
- lifecycle : ๋ฆฌ์์ค์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
- provisioner : ๋ฆฌ์์ค ์์ฑ ํ ์ถ๊ฐ ์์ ์ ์
- timeouts : ํ๋ก๋ฐ์ด๋์์ ์ ์ํ ์ผ๋ถ ๋ฆฌ์์ค ์ ํ์์๋ create, update, delete์ ๋ํ ํ์ฉ ์๊ฐ ์ ์ ๊ฐ๋ฅ
2.2 ์ข ์์ฑ
ํ ๋ผํผ์ ์ข ์์ฑ์ resource, module ์ ์ธ์ผ๋ก ํ๋ก๋น์ ๋ ๋๋ ๊ฐ ์์์ ์์ฑ ์์๋ฅผ ๊ตฌ๋ถ ์ง๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ฆฌ์์ค์์ ๊ฐ์ ์ฐธ์กฐํด ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ ์์ฑ ์ ํ ๊ด๊ณ์ ๋ฐ๋ผ ์์ ์๊ฐ ์๋ํ์ง ์์์ง๋ง ์๋์ผ๋ก ์ฐ๊ด ๊ด๊ณ๊ฐ ์ ์๋๋ ์์์ ์ข ์์ฑ์ ๊ฐ์ง๊ฒ ๋๊ณ , ๊ฐ์ ๋ก ๋ฆฌ์์ค ๊ฐ ๋ช ์์ ์ข ์์ฑ์ ๋ถ์ฌํ ๊ฒฝ์ฐ์๋ ๋ฉํ์ธ์์ธ depends_on์ ํ์ฉํ๋ค.
—> ์ฆ, ๋ฆฌ์์ค์ ์์ฑ ์์ ๋ฑ์ ์ง์ ํ ์ ์๊ณ , ์์ฑ ์ ์ ํ ๊ด๊ณ๊ฐ ๋ช ํํ ๊ฒฝ์ฐ ๋ฐ๋ก ์ง์ ํ์ง ์์๋ ์๋์ผ๋ก ์ ์๋์ด ์งํ๋๋ค๋ ๊ฒ ๊ฐ๋ค.
์ค์ต์ ์์, graph์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํ ํ ์ ์๋ graphviz๋ฅผ ์ค์นํ๋ค.
๊ธฐ์กด์ ์ ์ธ๋ ๋ด์ฉ์ ์ญ์ ํ๊ณ main.tf์ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ์์๋ฅผ ์ ์ธํ๋ค.
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "def" {
content = "456!"
filename = "${path.module}/def.txt"
}
๋ ๋ฆฌ์์ค ๊ตฌ์ฑ์์๋ ์๋ก ์ ํ ๊ด๊ณ๊ฐ ์๋ ๋์ผํ ์์ค์ด๋ฏ๋ก, ํ ๋ผํผ์ ๋ณ๋ ฌ ์คํ ๋ฐฉ์์ ๋ฐ๋ผ apply๋ฅผ ์คํํ๋ฉด ๋์์ ์ํ๋๋ค.
- ๋์์ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(์ง๊ธ graphviz๊ฐ ์๋จนํ์ ์ด๋ฏธ์ง๋ก ํ์ธํ ์ ์๋ค.. ์ถํ ํด๊ฒฐ๋๋ฉด ์์ ํ๋๋ก ํ๊ฒ ๋ค.)
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "def" {
content = local_file.abc.content # 123!
filename = "${path.module}/def.txt"
}
๋ค์์ ๋ฆฌ์์ค ์์ฑ์ ๋ค๋ฅธ ๋ฆฌ์์ค์ ์ฃผ์ ํ์ฌ ์ข ์์ฑ์ ๋ถ์ฌํด๋ณด๊ฒ ๋ค.
๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉด ํน์ ๋ฆฌ์์ค์ ์์ฑ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ํด๋น ๋ฆฌ์์ค๊ฐ ์ฐ์ ์ ์ผ๋ก ์์ฑ๋์ด์ผ ํ๋ฏ๋ก ์์ฑ์ ์์๊ฐ ๋ฐ์๋์๋ค.
๋ ๋ฆฌ์์ค ๊ตฌ์ฑ์ ์ข ์์ฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ํ๋ก๋ฐ์ด๋์ ๋ํ ์ข ์์ฑ๋ง์ด ์กด์ฌํ์ง๋ง ์ ์ฝ๋์์ local_file def๋ local_file abc ๊ฐ์ ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก ์์์ ๋ํ ์ข ์์ด ๋ฐ์ํจ์ ํ์ธํ ์ ์๋ค.
depends_on
ํ๋ก๋น์ ๋ ์ ๋ฆฌ์์ค์ ์์ฑ์ ์ฃผ์ ํ์ง ์์๋ ๋ฆฌ์์ค๊ฐ ์ข ์์ฑ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด ๊ฒฝ์ฐ depends_on ์ ์ธ์ผ๋ก ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
resource "local_file" "abc" {
content = "123!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "def" {
**depends_on = [
local_file.abc**
]
content = "456!"
filename = "${path.module}/def.txt"
}
2.3 ๋ฆฌ์์ค ์์ฑ ์ฐธ์กฐ
๋ฆฌ์์ค ๊ตฌ์ฑ์์ ์ฐธ์กฐ ๊ฐ๋ฅํ ๊ฐ์ ์ธ์์ ์์ฑ์ด๋ค
- ์ธ์ : ๋ฆฌ์์ค ์์ฑ ์ ์ฌ์ฉ์๊ฐ ์ ์ธํ๋ ๊ฐ
- ์์ฑ : ์ฌ์ฉ์๊ฐ ์ค์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๋ฆฌ์์ค ์์ฑ ์ดํ ํ๋ ๊ฐ๋ฅํ ๋ฆฌ์์ค ๊ณ ์ ๊ฐ
๋ฆฌ์์ค์ ์ธ์์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ ์ ์๋ค.
# Terraform Code
resource "<๋ฆฌ์์ค ์ ํ>" "<์ด๋ฆ>" {
<์ธ์> = <๊ฐ>
}
# ๋ฆฌ์์ค ์ฐธ์กฐ
<๋ฆฌ์์ค ์ ํ>.<์ด๋ฆ>.<์ธ์>
<๋ฆฌ์์ค ์ ํ>.<์ด๋ฆ>.<์์ฑ>
- ๋ฆฌ์์ค ์ธ์์ ์ ์ธ๊ณผ ์ฐธ์กฐ ๊ฐ๋ฅํ ์ธ์ ๋ฐ ์์ฑ ํจํด
์๋ ์ฝ๋๋ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ก๋ฐ์ด๋์ Namespace ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ์ดํ Secret์ ํด๋น Namespace์ ์์ฑํ๋ ์ข ์์ฑ์ ๋ฆฌ์์ค ์ธ์ ๊ฐ ๊ฐ์ผ๋ก ์์ฑํ๋ ์์ด๋ค. Namespace์ ์ด๋ฆ๋ง ๋ณ๊ฒฝํด๋, ํด๋น Namespace๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ ๋ฐ์ดํธ๋์ด ์ํฅ์ ๋ฐ๋๋ค.
resource "**kubernetes_namespace**" "**example**" {
**metadata** {
annotations = {
**name** = "example-annotation"
}
name = "terraform-example-namespace"
}
}
resource "**kubernetes_secret**" "example" {
metadata {
namespace = **kubernetes_namespace**.**example**.**metadata**.0.**name** # namespace ๋ฆฌ์์ค ์ธ์ ์ฐธ์กฐ
name = "terraform-example"
}
data = {
password = "P4ssw0rd"
}
}
- ๋ฆฌ์์ค๊ฐ ์์ฑ๋ ๋, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ‘์ธ์’๋ฅผ ๋ฐ์ ์ค์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ฉด ์ผ๋ถ ๋ฆฌ์์ค๋ ์๋์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ด๋ ์ถ๊ฐ๋๋ ‘์์ฑ’์ด ๋ถ์ฌ๋๋ค.
- ๊ฐ ๋ฆฌ์์ค๋ง๋ค ๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ฉด ์ธ์๋ Arguments๋ก ํํ๋์ด ์์ผ๋ฉฐ, ๋ฆฌ์์ค ์์ฑ ํ ์ถ๊ฐ๋๋ ์์ฑ ๊ฐ์ผ๋ก Attributes์ ์๋ด๋์ด ์๋ค
- ๋ฆฌ์์ค ์์ฑ์ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ฆฌ์์ค ๋๋ ๊ตฌ์ฑ์์์์๋ ์์ฑ ํ์ ์์ฑ ๊ฐ๋ค๋ ์ธ์๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
2.4 ์๋ช ์ฃผ๊ธฐ
- lifecycle์ ๋ฆฌ์์ค์ ๊ธฐ๋ณธ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์์
์๊ฐ ์๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฉํ์ธ์๋ค. ๋ฉํ์ธ์ ๋ด์๋ ์๋ ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
- create_before_destroy (bool): ๋ฆฌ์์ค ์์ ์ ์ ๊ท ๋ฆฌ์์ค๋ฅผ ์ฐ์ ์์ฑํ๊ณ ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ญ์
- prevent_destroy (bool): ํด๋น ๋ฆฌ์์ค๋ฅผ ์ญ์ Destroy ํ๋ ค ํ ๋ ๋ช ์์ ์ผ๋ก ๊ฑฐ๋ถ
- ignore_changes (list): ๋ฆฌ์์ค ์์์ ์ ์ธ๋ ์ธ์์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ๋ผํผ ์คํ ์ ๋ฌด์
- precondition: ๋ฆฌ์์ค ์์์ ์ ์ธํด ์ธ์์ ์กฐ๊ฑด์ ๊ฒ์ฆ
- postcondition: Plan๊ณผ Apply ์ดํ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ ๊ฐ์ผ๋ก ๊ฒ์ฆ
create_before_destroy
๋ฆฌ์์ค ์์ ์ ๋ฆฌ์์ค ํน์ฑ์ ๋ฐ๋ผ ๋์์ ์ญ์ ํ๊ณ ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๋ํ์ ์ผ๋ก ํด๋ผ์ฐ๋์ image๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์๋ ํด๋น VM์ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ์์ฑํ๋ค.
- ํ ๋ผํผ์ ๊ธฐ๋ณธ ์๋ช ์ฃผ๊ธฐ๋ ์ญ์ ํ ์์ฑ์ด๊ธฐ ๋๋ฌธ์ ์์ ์๊ฐ ์๋์ ์ผ๋ก ์์ ๋ ๋ฆฌ์์ค๋ฅผ ๋จผ์ ์์ฑํ๊ธฐ๋ฅผ ์ํ ์ ์๋ค.
์ด ๊ฒฝ์ฐ create_before_destroy๊ฐ true๋ก ์ ์ธ๋๋ฉด ์ง์ ํ ์์ฑ์ ์คํํ ํ ์ญ์ ๋ฅผ ๋์ํ๋ค.
์ฃผ์ !
ํ์ง๋ง ์์ฑ๋๋ ๋ฆฌ์์ค๊ฐ ๊ธฐ์กด ๋ฆฌ์์ค๋ก ์ธํด ์์ฑ์ด ์คํจ๋๊ฑฐ๋ ์ญ์ ์ ํจ๊ป ์ญ์ ๋ ์ ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค.
- ์๋ชป๋ ์ฌ๋ก 1 : ๋ฆฌ์์ค์ ๋ช ์์ ๊ตฌ๋ถ์ด ์ฌ์ฉ์๊ฐ ์ง์ ํ ํน์ ์ด๋ฆ์ด๋ ID์ธ ๊ฒฝ์ฐ ๊ธฐ์กด ๋ฆฌ์์ค์ ํ ๋น๋์ด ์๊ธฐ ๋๋ฌธ์ ์์ฑ ์คํจ
- ์๋ชป๋ ์ฌ๋ก 2 : ์์ฑ ํ ์ญ์ ์ ๋์ผํ ๋ฆฌ์์ค์ ๋ํ ์ญ์ ๋ช ๋ น์ด ์ํ๋์ด ๋ฆฌ์์ค๊ฐ ๋ชจ๋ ์ญ์
์ค์ต์ ํตํด ์๋ชป๋ ์ฌ๋ก๋ฅผ ํ์ธํด๋ณด๊ฒ ๋ค.
resource "local_file" "abc" {
content = "lifecycle - step 1"
filename = "${path.module}/abc.txt"
lifecycle {
create_before_destroy = false
}
}
- main.tf ํ์ผ
# ๋ชจ๋ํฐ๋ง
cd 03.lifecycle
watch -d 'ls -l;echo;cat abc.txt'
# apply
terraform init && terraform plan && terraform apply -auto-approve
terraform state list
# ํ์ผ ๋ด์ฉ ํ์ธ
cat abc.txt
# ํ์ผ ๋ด์ฉ
lifecycle - step 1
content ๋ด์ฉ์ ์์ ํ์ฌ ํ ์คํธํ๋ค.
resource "local_file" "abc" {
content = "lifecycle - step **1111111111111111**"
filename = "${path.module}/abc.txt"
lifecycle {
**create_before_destroy = false**
}
}
- create_before_destroy - flase ๋์์ด ํ์ธ๋๋ค.
prevent_destroy
์์ ์๊ฐ ์๋์ ์ผ๋ก ํน์ ๋ฆฌ์์ค์ ์ญ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
main.tf ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์๋ค.
resource "local_file" "abc" {
content = "lifecycle - step 3"
filename = "${path.module}/abc.txt"
lifecycle {
**prevent_destroy = true**
}
}
์ดํ apply๋ฅผ ์งํํ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
์์ธ์? : ๊ธฐ์กด์ steb2 content๋ฅผ ์ง์ ํ์ฌ ์์ฑ์ด ๋์ด์๋ ์ํฉ์ด๋ค. ํ ๋ผํผ์ ์ ์ธ์ ์ธ ํน์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ค๊ฐ ๋ค์ ์์ฑํ๋ ๊ฐ๋ ์ด๋ค. prevent_destory๋ฅผ ๋ช ์ํ์ฌ ์ญ์ ๋ฅผ ๋ฐฉ์งํ์๊ธฐ ๋๋ฌธ์, abc ํ์ผ์ด ์ญ์ ๋์ง ์์๊ฒ์ด๋ค. (ํ๋ ธ๋ค๋ฉด ์๋ ค์ฃผ์ธ์..)
- prevent_destory๋ฅผ ์์ ๊ณ ์งํํ๋ ์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
ignore_changes (list)
๋ฆฌ์์ค ์์์ ์ธ์๋ฅผ ์ง์ ํด ์์ ๊ณํ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋์ง ์๋๋ก ํ๋ค.
ํ ๋ผํผ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ฌ ํ์ธํด๋ณด๊ฒ ๋ค.
resource "local_file" "abc" {
content = "lifecycle - step 4"
filename = "${path.module}/abc.txt"
lifecycle {
**ignore_changes = []**
}
}
- ์ ๋ณ๊ฒฝ๋์๋ค. ๋ค์์ content๋ฅผ ์ถ๊ฐํ์ฌ ์งํํด๋ณด๊ฒ ๋ค.
resource "local_file" "abc" {
content = "lifecycle - step 5"
filename = "${path.module}/abc.txt"
lifecycle {
**ignore_changes = [
content**
]
}
}
๋ฆฌ์์ค ์์ฑ์ ๋ณ๊ฒฝ์ด ์์์ง๋ง, ignore_changes์ ๋์์ด๋ฏ๋ก ์คํ๊ณํ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋์ง ์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์์๋ค.
(๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฌด์ํ๊ณ ์ถ๋ค๋ฉด ignore_changes = all ๋ก ์ค์ ํ๋ฉด ๋๋ค.)
precondition
๋ฆฌ์์ค ์์ฑ ์ด์ ์ ์ ๋ ฅ๋ ์ธ์ ๊ฐ์ ๊ฒ์ฆํ๋ค.
ํ๋ก๋น์ ๋ ์ด์ ์ ๋ฏธ๋ฆฌ ์ฝ์๋ ๊ฐ ๋๋ ํ์๋ก ๋ช ์ํด์ผ ํ๋ ์ธ์ ๊ฐ์ ๊ฒ์ฆํ ์ ์๋ค.
- precondition ์กฐ๊ฑด์ ๋ง์ง ์์ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
precondition์ ํ๋ก๋น์ ๋ํด์ผ ํ๋ ํด๋ผ์ฐ๋ VM์ด๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒ์ฆ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋์ง, ์ํธํ ์ค์ ์ด ๋์ด ์๋์ง ๋ฑ ๊ตฌ์ฑ์ ๋ฏธ๋ฆฌ ํ์ธํ๊ณ ์๋ชป๋ ํ๋ก๋น์ ๋์ ์คํํ ์ ์๋๋ก ๊ตฌ์ฑํ ์ ์๋ค.
postcondition
ํ๋ก๋น์ ๋ ๋ณ๊ฒฝ ์ดํ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํจ๊ณผ ๋์์ ์์กด์ฑ์ ๊ฐ๋ ๋ค๋ฆ ๊ตฌ์ฑ์ ๋ณ๊ฒฝ์ ๋ง๋ ํจ๊ณผ๊ฐ ์๋ค.
- prostcondition ์กฐ๊ฑด์ ๋ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. (precondition์ ๋ฌ๋ฆฌ ํ๋ก๋น์ ๋ ์ดํ ์์ฑ๋๋ ์์ฑ ๊ฐ์ด ์์ดํ์ฌ ์ฐจ๋จ๋์๋ค.)
content์ ๊ฐ์ ์ถ๊ฐํ๋, ์ ์์ ์ผ๋ก ์คํ๋์๋ค.
์ข ์์ฑ์ ๊ฐ๋ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ๋ฆฌ์์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ๋ฆฌ์์ค ์์ฑ ์ ํ์ฉ๋ ๋ ์ํ๋ ์์ฑ์ด ์ ์๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
- ํนํ , ํ๋ก๋น์ ๋ ์ดํ ์์ฑ๋๋ ์์ฑ ๊ฐ์ด ์์ผ๋ฏ๋ก ์ํฅ์ ๋ฐ๋ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๊ธฐ ์ ์์๋์ง ์๋ ํ๋ก๋น์ ๋ ์์ ์ ๋ฐฉ์งํ ์ ์๋ค.
'IaC > Terraform_ํ ๋ผํผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Terraform] ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ#4 (local ์ง์ญ๊ฐ, ์ถ๋ ฅ output, ๋ฐ๋ณต๋ฌธ) (0) | 2024.06.21 |
---|---|
[Terraform] ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ #3 (๋ฐ์ดํฐ ์์ค, ์ ๋ ฅ ๋ณ์) (0) | 2024.06.18 |
[Terraform] ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ #1 (์ฃผ์ ์ปค๋งจ๋, HCL) (0) | 2024.06.15 |
[Terraform] ํ ๋ผํผ ๊ฐ๋จ ์ค์ต (EC2 ๋ฐฐํฌ, ์์ , ์ญ์ ) (0) | 2024.06.13 |
[Terraform] ํ ๋ผํผ ๊ฐ๋ ๋ฐ ์ฌ์ฉ ํ๊ฒฝ ๊ตฌ์ฑ (1) | 2024.06.13 |