๐ Notice
๋ณธ ๋ธ๋ก๊น ์ ์๋์
24๋จ๊ณ ์ค์ต์ผ๋ก ์ ๋ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค
์ฑ ์ ๊ธฐ์คํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.์ถ์ฒ - ํ๋น์ถํ๋คํธ์ํฌ
CloudNetaStudy
๊ทธ๋ฃน์์ ์คํฐ๋ํ ๋ด์ฉ์ ๋๋ค.
Hashicorp korea์ ํ์ฑ
๋๊ณผ ํจ๊ป ์คํฐ๋ ํ๊ณ ์์ต๋๋ค. ๐
์ ํ์ฑ
๋๊ณผ์ค์์จ
๋๊ป ๋ค์ํ๋ฒ ๐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
IaC์ ํ ๋ผํผ์ ์ดํดํ๊ณ ์คํฐ๋์ ํ์ํ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.
ํ ๋ผํผ ๊ธฐ๋ณธ ๋ช ๋ น ์ฌ์ฉ๋ฒ์ ์์๋ด ๋๋ค.
HCL์ ์ดํดํ๊ณ ๊ธฐ๋ณธ ํ์ฉ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
์ํ์ฝ๋ ์์ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ค์ตํฉ๋๋ค.
ํ ๋ผํผ์ Stateful ์ ํ๋ฆฌ์ผ์ด์ . ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ State๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ์ ํ์ฉ
๊ฐ์ธ 1์ธ : ๋ก์ปฌ ํ๊ฒฝ์ผ๋ก terraform.tfstate ํ์ผ์ JSON ํํ๋ก ์ ์ฅ
ํ์ด๋ ์กฐ์ง : ๊ณต๋ ๊ด๋ฆฌ๋ฅผ ์ํด ์๊ฒฉ ์ ์ฅ์์ ์ ์ฅํด ๊ณต์ - ๋งํฌ
State์๋ ์์ ์๊ฐ ์ ์ํ ์ฝ๋์ ์ค์ ๋ฐ์๋ ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ด ์ ๋ณด๋ฅผ ํ ๋๋ก ์ดํ์ ๋ฆฌ์์ค ์์ฑ, ์์ , ์ญ์ ์ ๋ํ ๋์ ํ๋จ ์์ ์ ์ํ
State ์ญํ
- State์๋ ํ ๋ผํผ ๊ตฌ์ฑ๊ณผ ์ค์ ๋ฅผ ๋๊ธฐํํ๊ณ ๊ฐ ๋ฆฌ์์ค์ ๊ณ ์ ํ ์์ด๋(๋ฆฌ์์ค ์ฃผ์)๋ก ๋งตํ
- ๋ฆฌ์์ค ์ข ์์ฑ๊ณผ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ์
- ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ ์ญํ ์ ์ํ
ํ ๋ผํผ์์๋ JSON ํํ๋ก ์์ฑ๋ State๋ฅผ ํตํด ์์ฑ๊ณผ ์ธ์๋ฅผ ์ฝ๊ณ ํ์ธํ ์ ์๋ค.
ํ ๋ผํผ์์๋ type๊ณผ name์ผ๋ก ๊ณ ์ ํ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฅํ๋ฉฐ, ํด๋น ๋ฆฌ์์ค์ ์์ฑ๊ณผ ์ธ์๋ฅผ ๊ตฌ์ฑ๊ณผ ๋น๊ตํด ๋์ ๋ฆฌ์์ค๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ๋ค.
State๋ ํ ๋ผํผ๋ง์ ์ํ API๋ก ์ ์ํ ์๋ ์๋ค. Plan์ ์คํํ๋ฉด ์๋ฌต์ ์ผ๋ก refresh ๋์์ ์ํํ๋ฉด์ ๋ฆฌ์์ค ์์ฑ์ ๋์(ํด๋ผ์ฐ๋ ๋ฑ)๊ณผ State๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์ด ์์ ์ ํ๋ก๋น์ ๋ ๋์์ ์๋ต ์๋์ ๊ธฐ์กด ์์ฑ๋ State์ ๋ฆฌ์์ค ์์ ๋ฐ๋ผ ์๋ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
๋๋์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ Plan ๋ช
๋ น์์ -refresh=false
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด State๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ ๊ณํ์ ์์ฑํ๊ณ , ์ด๋ฅผ ์คํ์ ํ์ฉํด ๋์ ํ๊ฒฝ๊ณผ์ ๋๊ธฐํ ๊ณผ์ ์ ์๋ตํ ์ ์๋ค.
# ์คํ ๊ณํ ์์ฑ ์ ์ ์ฅ๋์ด ์๋ State์ ์ค์ ํ์์ ๋น๊ตํ๋ ๊ธฐ๋ณธ ์คํ
time terraform plan
# ์คํ ๊ณํ ์์ฑ ์ ์ค์ ํ์๊ณผ ๋น๊ตํ์ง ์๊ณ ์คํ ๊ณํ์ ์์ฑํ๋ -refresh=false ์ต์
time terraform plan -refresh=false
ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ๊ธฐ์กด State์ ๊ตฌ์ฑ์ ๋น๊ตํด ์คํ ๊ณํ์์ ์์ฑ, ์์ , ์ญ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
ํ ๋ผํผ ๊ตฌ์ฑ๊ณผ State ํ๋ฆ : Plan ๊ณผ Apply ์ค ๊ฐ ๋ฆฌ์์ค์ ๋ฐ์ํ ์ ์๋ ๋ค ๊ฐ์ง ์ฌํญ, ์๋ ์คํ ๊ณํ ์ถ๋ ฅ ๊ธฐํธ์ ์๋ฏธ
๊ธฐํธ | ์๋ฏธ |
---|---|
+ | Create |
- | Destroy |
-/+ | Replace |
~ | Updated in-place |
Replace ๋์์ ๊ธฐ๋ณธ๊ฐ์ ์ญ์ ํ ์์ฑํ์ง๋ง lifecycle์ create_before_destroy
์ต์
์ ํตํด ์์ฑ ํ ์ญ์ ์ค์ ๊ฐ๋ฅ
State๋ฅผ ๊ด๋ฆฌํ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ์ ๊ณต๊ฐ์ ์ํฌ์คํ์ด์ค๋ผ๊ณ ํ๋ค.
ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ๋์ผํ์ง๋ง ์์ ์๋ ์๋ก ๋ค๋ฅธ State๋ฅผ ๊ฐ๋ ์ค์ ๋์์ ํ๋ก๋น์ ๋ํ ์ ์๋ค.
์ํฌ์คํ์ด์ค๋ ๊ธฐ๋ณธ default๋ก ์ ์๋๋ค.
๋ก์ปฌ ์์ ํ๊ฒฝ์ ์ํฌ์คํ์ด์ค ๊ด๋ฆฌ๋ฅผ ์ํ CLI ๋ช ๋ น์ด๋ก workspace๊ฐ ์๋ค.
terraform workspace list
* default
์ฅ์
- ํ๋์ ๋ฃจํธ ๋ชจ๋์์ ๋ค๋ฅธ ํ๊ฒฝ์ ์ํ ๋ฆฌ์์ค๋ฅผ ๋์ผํ ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ํ๋ก๋น์ ๋ํ๊ณ ๊ด๋ฆฌ
- ๊ธฐ์กด ํ๋ก๋น์ ๋๋ ํ๊ฒฝ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ณ๊ฒฝ ์ฌํญ ์คํ ๊ฐ๋ฅ
- ๊น์ ๋ธ๋์น ์ ๋ต์ฒ๋ผ ๋์ผํ ๊ตฌ์ฑ์์ ์๋ก ๋ค๋ฅธ ๋ฆฌ์์ค ๊ฒฐ๊ณผ ๊ด๋ฆฌ - [์ฐธ๊ณ : ํํด - Git ๋ธ๋์น ์ ๋ต ์๋ฆฝ์ ์ํ ์ ๋ฌธ๊ฐ์ ์กฐ์ธ๋ค]
๋จ์
- State๊ฐ ๋์ผํ ์ ์ฅ์(๋ก์ปฌ ๋๋ ๋ฐฑ์๋)์ ์ ์ฅ๋์ด State ์ ๊ทผ ๊ถํ ๊ด๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅ(์ด๋ ค์)
- ๋ชจ๋ ํ๊ฒฝ์ด ๋์ผํ ๋ฆฌ์์ค๋ฅผ ์๊ตฌํ์ง ์์ ์ ์์ผ๋ฏ๋ก ํ ๋ผํผ ๊ตฌ์ฑ์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ค์ ๋ฐ์ ๊ฐ๋ฅ
- ํ๋ก๋น์ ๋ ๋์์ ๋ํ ์ธ์ฆ ์์๋ฅผ ์๋ฒฝํ ๋ถ๋ฆฌํ๊ธฐ ์ด๋ ค์
โ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์๋ฒฝํ ๊ฒฉ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅ
โ ํด๊ฒฐ๋ฐฉ์ 1. ํด๊ฒฐํ๊ธฐ ์ํด ๋ฃจํธ ๋ชจ๋์ ๋ณ๋๋ก ๊ตฌ์ฑํ๋ ๋๋ ํฐ๋ฆฌ ๊ธฐ๋ฐ์ ๋ ์ด์์์ ์ฌ์ฉํ ์ ์๋ค.
โ ํด๊ฒฐ๋ฐฉ์ 2. Terraform Cloud ํ๊ฒฝ์ ์ํฌ์คํ์ด์ค๋ฅผ ํ์ฉ
ํ ๋ผํผ์ผ๋ก ์ธํ๋ผ์ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๋ฉด ์๊ฐ์ด ์ง๋ ์๋ก ๊ตฌ์ฑ์ด ๋ณต์กํด์ง๊ณ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๊ฐ ๋์ด๋๊ฒ ๋๋ค.
ํ ๋ผํผ์ ๊ตฌ์ฑ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ ๊ตฌ์ฑ์๋ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ๋จ์ผ ํ์ผ ๊ตฌ์กฐ์์์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ชจ๋์ ๋ฃจํธ ๋ชจ๋๊ณผ ์์ ๋ชจ๋๋ก ๊ตฌ๋ถ๋๋ค.
๋ชจ๋์ ํ ๋ผํผ ๊ตฌ์ฑ์ ์งํฉ์ด๋ค.
ํ ๋ผํผ์ผ๋ก ๊ด๋ฆฌํ๋ ๋์์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ๋ณต์กํด์ ธ ์๊ธด ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ณ ๊ด๋ฆฌ ์์ ์ ์์ํ๊ฒ ํ๊ธฐ ์ํ ๋ฐฉ์์ผ๋ก ํ์ฉ
- ๊ด๋ฆฌ์ฑ : ๋ชจ๋์ ์๋ก ์ฐ๊ด ์์ ๊ตฌ์ฑ์ ๋ฌถ์์ด๋ค. ์ํ๋ ๊ตฌ์ฑ์์๋ฅผ ๋จ์๋ณ๋ก ์ฝ๊ฒ ์ฐพ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ค. ๋ชจ๋์ ๋ค๋ฅธ ๊ตฌ์ฑ์์ ์ฝ๊ฒ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค. ๋ํ ๋ชจ๋์ด ์ ๋ฐ์ดํธ๋๋ฉด ์ด ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ์์ ์ผ๊ด๋ ๋ณ๊ฒฝ ์์ ์ ์งํํ ์ ์๋ค.
- ์บก์ํ : ํ ๋ผํผ ๊ตฌ์ฑ ๋ด์์ ๊ฐ ๋ชจ๋์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ฌ์ ธ ๋ ๋ฆฝ์ ์ผ๋ก ํ๋ก๋น์ ๋ ๋ฐ ๊ด๋ฆฌ๋๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ์๋์ฑ์ ๊ฐ์ถฐ ํ์ํ ํญ๋ชฉ๋ง์ ์ธ๋ถ์ ๋ ธ์ถ์ํจ๋ค.
- ์ฌ์ฌ์ฉ์ฑ : ๊ตฌ์ฑ์ ์ฒ์๋ถํฐ ์์ฑํ๋ ๊ฒ์๋ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์ํ๊ณ ์์ฑ ์ค๊ฐ์ ๋๋ฒ๊น ๊ณผ ์ค๋ฅ๋ฅผ ์์ ํ๋ ๋ฐ๋ณต ์์ ์ด ๋ฐ์ํ๋ค. ํ ๋ผํผ ๊ตฌ์ฑ์ ๋ชจ๋ํํ๋ฉด ์ดํ์ ๋น์ทํ ํ๋ก๋น์ ๋์ ์ด๋ฏธ ๊ฒ์ฆ๋ ๊ตฌ์ฑ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ์ผ๊ด์ฑ๊ณผ ํ์คํ : ํ ๋ผํผ ๊ตฌ์ฑ ์ ๋ชจ๋์ ํ์ฉํ๋ ์ํฌํ๋ก๋ ๊ตฌ์ฑ์ ์ผ๊ด์ฑ์ ์ ๊ณตํ๊ณ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ๊ณผ ํ๋ก์ ํธ์๋ ์ด๋ฏธ ๊ฒ์ฆํ ๋ชจ๋์ ์ ์ฉํด ๋ณต์กํ ๊ตฌ์ฑ๊ณผ ๋ณด์ ์ฌ๊ณ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
๊ธฐ๋ณธ ์์น : ๋ชจ๋์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฐ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจํค์ง์ ์ญํ ์ด ๋น์ทํ๋ค
์๋์ ๊ฐ์ ๊ธฐ๋ณธ ์์ฑ ์์น์ ์ ์ํจ
๋ชจ๋ ๋๋ ํฐ๋ฆฌ ํ์์
terraform-<ํ๋ก๋ฐ์ด๋ ์ด๋ฆ>-<๋ชจ๋ ์ด๋ฆ>
ํ์์ ์ ์ํ๋ค.์ด ํ์์ Terraform Cloud, Terraform Enterprise์์๋ ์ฌ์ฉ๋๋ ๋ฐฉ์์ผ๋ก
1) ๋๋ ํฐ๋ฆฌ ๋๋ ๋ ์ง์คํธ๋ฆฌ ์ด๋ฆ์ด ํ ๋ผํผ์ ์ํ ๊ฒ์ด๊ณ , 2) ์ด๋ค ํ๋ก๋ฐ์ด๋์ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, 3) ๋ถ์ฌ๋ ์ด๋ฆ์ด ๋ฌด์์ธ์ง ํ๋ณํ ์ ์๋๋ก ํ๋ค.
ํ ๋ผํผ ๊ตฌ์ฑ์ ๊ถ๊ทน์ ์ผ๋ก
๋ชจ๋ํ๊ฐ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ก ์์ฑํ ๊ฒ์ ์ ์ํ๋ค.
์ฒ์๋ถํฐ ๋ชจ๋ํ๋ฅผ ๊ฐ์ ํ๊ณ ๊ตฌ์ฑํ์ผ์ ์์ฑํ๋ฉด ๋จ์ผ ๋ฃจํธ ๋ชจ๋์ด๋ผ๋ ํ์ ๋ค๋ฅธ ๋ชจ๋์ด ํธ์ถํ ๊ฒ์ ์์ํ๊ณ ๊ตฌ์กฐํํ ์ ์๋ค. ๋ํ ์์ฑ์๋ ์๋ํ ๋ฆฌ์์ค ๋ฌถ์์ ๊ตฌ์ํ ๋๋ก ๋ ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ก ๊ทธ๋ฃนํํ ์ ์๋ค.๊ฐ๊ฐ์ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ๋ฅผ ์ ์ํ๋ค.
๋ฆฌ๋ชจํธ ๋ชจ๋์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ฒ์๋ถํฐ ๋ชจ๋ํ๊ฐ ์งํ๋ ๊ตฌ์ฑ๋ค์ ๋๋ก ๋ฃจํธ ๋ชจ๋์ ํ์ ํ์ผ ์์คํ ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํ์ ๋ชจ๋ ๋ํ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋์ด๋ฏ๋ก ๋ฃจํธ ๋ชจ๋ ํ์์ ๋๊ธฐ๋ณด๋ค๋ ๋์ผํ ํ์ผ ์์คํ ๋ ๋ฒจ์ ์์นํ๊ฑฐ๋ ๋ณ๋ ๋ชจ๋๋ง์ ์ํ ๊ณต๊ฐ์์ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด VCS๋ฅผ ํตํด ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์์ํ๋ค.๊ณต๊ฐ๋ ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ๋ชจ๋์ ์ฐธ๊ณ ํ๊ธฐ๋ฅผ ์ ์ํ๋ค.
๋๋ค์์ ํ ๋ผํผ ๋ชจ๋์ ๊ณต๊ฐ๋ ๋ชจ๋์ด ์กด์ฌํ๊ณ ๊ฑฐ์ ๋ชจ๋ ์ธ์์ ๋ํ ๋ณ์ ์ฒ๋ฆฌ, ๋ฐ๋ณต๋ฌธ ์ ์ฉ ๋ฆฌ์์ค, ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ฆฌ์์ค ํ์ฑ/๋นํ์ฑ ๋ฑ์ ๋ชจ๋ฒ ์ฌ๋ก๋ก ๊ณต๊ฐํด๋์๋ค. ๋ฌผ๋ก ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค๋ ํ๋ก๋น์ ๋ํ๋ ค๋ ์ํฉ์ ๋ง๊ฒ ์ฐธ๊ณ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.์์ฑ๋ ๋ชจ๋์ ๊ณต๊ฐ ๋๋ ๋น๊ณต๊ฐ๋ก ๊ฒ์ํด ํ ๋๋ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๊ธฐ๋ฅผ ์ ์ํ๋ค.
๋ชจ๋์ ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ํผ๋๋ฐฑ์ ํตํด ๋ ๋ฐ์ ๋ ๋ชจ๋์ ๊ตฌ์ฑํ ์ ์๋ ์๊ทน์ด ๋๋ค.
๋ชจ๋์ ๊ธฐ๋ณธ์ ๊ตฌ์กฐ๋ ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ์ ๋ ฅ ๋ณ์๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ๋ค.
โ๋ชจ๋ํโ๋ผ๋ ์ฉ์ด๋ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ ์์ ์ ๋งํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ฉ์ด๋ก ํ ๋ผํผ์ ์์ฑ๋ ๋ชจ๋์ ๋ค๋ฅธ ๋ฃจํธ ๋ชจ๋์์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ฉฐ ์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์คํ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
๊ธฐ์กด์ ์์ฑ๋ ๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฐธ์กฐํด ์ฌ์ฉํ ์ ์๋ค. ์ฌ์ฉ ๋ฐฉ์์ ๋ฆฌ์์ค(Resource)์ ๋น์ทํ๋ค.
๋ชจ๋์์ ํ์ํ ๊ฐ์ variable๋ก ์ ์ธํด ์ค์ ํ๊ณ , ๋ชจ๋์์ ์์ฑ๋ ๊ฐ ์ค ์ธ๋ถ ๋ชจ๋์์ ์ฐธ์กฐํ๊ณ ์ถ์ ๊ฐ์ output์ผ๋ก ์ค์ ํ๋ค. ๋ง์น ์๋ฐ ๊ฐ๋ฐ ์ getter, setter๋ก ์บก์ํ๋ ํด๋์ค๋ฅผ ํ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ ๊ด๋ จ ํ๋ก๋ฐ์ด๋์ ์ ์๊ฐ ํ์ํ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์๋ ํ๋ก๋ฐ์ด๋ ์ ์๋ฅผ ๋ชจ๋ ์ or ๋ฐ ๊ณ ๋ฏผ
์ ํ 1. ์์ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์
๋ชจ๋์์ ์ฌ์ฉํ๋ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ตฌ์ฑ ์์ธ๋ฅผ ์์ ๋ชจ๋์์ ๊ณ ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ตฌ์ฑ์ ๋ฏผ๊ฐํ๊ฑฐ๋, ๋ฃจํธ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์ ์์ด ์์ ๋ชจ๋์ด ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ์ผ ๋ ๊ณ ๋ คํ ๋ฐฉ๋ฒ์ด๋ค
ํ์ง๋ง ๋์ผํ ํ๋ก๋ฐ์ด๋๊ฐ ๋ฃจํธ์ ์์ ์์ชฝ์ ๋๋ ์๋ก ๋ค๋ฅธ ์์ ๋ชจ๋์ ๋ฒ์ ์กฐ๊ฑด ํฉ์๊ฐ ์ ๋๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ๋ชจ๋์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์์ผ๋ฏ๋ก ์ ์ฌ์ฉํ์ง ์๋๋ค.
์ ํ 2. ๋ฃจํธ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์(์ค์ต)
์์ ๋ชจ๋์ ๋ฃจํธ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ์ ์ข ์๋๋ ๋ฐฉ์์ด๋ค.๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ก๋ ๋ถ๋ฆฌ๋์ด ์์ง๋ง ํ ๋ผํผ ์คํ ๋จ๊ณ์์ ๋์ผ ๊ณ์ธต์ผ๋ก ํด์๋๋ฏ๋ก ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ตฌ์ฑ์ ๋ฃจํธ ๋ชจ๋์ ์ค์ ์ด ์ ์ฉ๋๋ค.
ํ๋ก๋ฐ์ด๋๋ฅผ ๋ชจ๋ ๋ด ๋ฆฌ์์ค์ ๋ฐ์ดํฐ ์์ค์ ์ผ๊ด ์ ์ฉํ๊ณ , ์์ ๋ชจ๋์ ๋ํ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ์ ์์ ๋ก์ด ๊ฒ์ด ์ฅ์ ์ด๋ค.
์์ ๋ชจ๋์ ํน์ ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ์ ์ข ์์ฑ์ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์์ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ์กฐ๊ฑด์ ๋ํด ๊ธฐ๋กํ๊ณ , ์์ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฃจํธ ๋ชจ๋์์ ์ ์ํ๋ ํ๋ก๋ฐ์ด๋์ ๋ง๊ฒ ์ ๋ฐ์ดํธ ํด์ผ ํ๋ค.
๋ชฉํ
- T101 1๊ธฐ ๋ ธ์ ๋ด์ฉ์ AWS DynamoDB/S3๋ฅผ ์๊ฒฉ ์ ์ฅ์๋ก ์ฌ์ฉํ๋ ์ค์ต์ ๋ฐ๋ผํด๋ณด์ธ์!
Backend ๊ตฌ์ฑ์ ํตํด Terraform์ดย stateย ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํ๋ ์์น๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
ํ ๋ผํผ์ tfstate๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ์ ์ธํ ๋ฆฌ์์ค๋ฅผ ์ถ์ ํฉ๋๋ค.
tfstate์๋ ์ค์ํ ์ ๋ณด๋ ํฌํจ๋๊ธฐ ๋๋ฌธ์, Github ๋๋ ์ธ๋ถ๋ก ๋ ธ์ถ๋์ด์๋ ์ฝ๋ ์ ์ฅ์์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก ์ฃผ์ํ์ฌ์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด aws ์๋น์ค์ธ S3์ DynamoDB๋ฅผ ์ด์ฉํด์ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ณ๋์ ์ํฌ์คํ์ด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐฑ์๋๋ฅผ ์ํ ๋ฆฌ์์ค๋ฅผ ๋ณ๋ก๋ ์์ฑํฉ๋๋ค.
# backend.tf
provider "aws" {
region = "ap-northeast-2" # Please use the default region ID
}
# S3 ๋ฒํท์ ์์ฑํฉ๋๋ค.
resource "aws_s3_bucket" "for_tfstate" {
bucket = "xgro-tfstate"
}
# S3 ๋ฒํท์ ๋ฒ์ ๋ ๊ธฐ๋ฅ ํ์ฑํ ์ ์ธํ๋ค.
resource "aws_s3_bucket_versioning" "tfstate" {
bucket = aws_s3_bucket.for_tfstate.bucket
versioning_configuration {
status = "Enabled"
}
}
# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "terraform-lock"
hash_key = "LockID"
billing_mode = "PAY_PER_REQUEST"
attribute {
name = "LockID"
type = "S"
}
}
์์์ ๋ฐฑ์๋๋ฅผ ์ํ S3, DynamoDB๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋์๋ค๋ฉด, ํ ์คํธ๋ฅผ ์ํ ํ ๋ผํผ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
# main.tf
# Required providers configuration
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.6.0"
}
}
backend "s3" {
bucket = "xgro-tfstate"
key = "terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-lock"
encrypt = true
}
required_version = ">= 1.0.11"
}
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
ํ ์คํธ๋ vpc ๋ชจ๋์ ์ด์ฉํด์ ๋ฆฌ์์ค์ ์ด๋ฆ ๋ฐ ์ค์ ์ ๋ณ๊ฒฝํ๋ฉฐ ์งํํ์์ต๋๋ค.
# vpc.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "final_mon1-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-2a", "ap-northeast-2b"]
private_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
public_subnets = ["10.0.1.0/24"]
enable_nat_gateway = false
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}
terraform.tfstate ํ์ผ์ด s3์ ์ ์ฅ๋๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํ ๋ผํผ์ผ๋ก ์์ฑ๋ vpc๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ชฉํ
- ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ๊ณต๊ฐ๋ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌํด๋ณด์ธ์!
VPC ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑํฉ๋๋ค.
module "vpc" { source = "terraform-aws-modules/vpc/aws" name = "t1013-xgro-vpc" cidr = "10.0.0.0/16" azs = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"] private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"] enable_nat_gateway = false enable_vpn_gateway = false tags = { Terraform = "true" Environment = "dev" } }
๊ฒฐ๊ณผ