- ๊ฐ์๋ค๋์ด ์งํํ์๋ CloudNeta์ Terraform 101 Study์ ์ฐธ๊ฐํ๋ฉฐ ์์ฑํ ๋ด์ฉ์ ๋๋ค.
- ์คํฐ๋ ๊ต์ฌ โ ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC
CH 5. State
- ํ ๋ผํผ์ Statefulํ ์ ํ๋ฆฌ์ผ์ด์ โ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
- ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ๋ฅผ State์ ์ ์ฅํ๊ณ ํ๋ก๋น์ ๋ํ ๋ชจ๋ ๋ด์ฉ์ ์ ์ฅ๋ ์ํ๋ก ์ถ์
- terraform.tfstate ํ์ผ์ JSON ์ผ๋ก ์ ์ฅ โ ํผ์ ๋ก์ปฌ์์ ๊ด๋ฆฌํ๊ฑฐ๋ ํ์ ํ๊ธฐ ์ํด ์๊ฒฉ ์ ์ฅ์์์ ๊ด๋ฆฌ
- State์๋ ์์ ์๊ฐ ์ ์ํ ์ฝ๋์ ์ค์ ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ โ ์ดํํ์ ๋ฆฌ์์ค ์์ฑ, ์์ , ์ญ์ ์ ๋ํ ๋์์ ํ๋จ
5-1. State์ ๋ชฉ์ ๊ณผ ์๋ฏธ
terraform apply โ State๋ฅผ ์ฌ์ฉํด์ ์ด์ ์ ์์ฑ๋ ๋ฆฌ์์ค์ ๋น๊ตํด ์์ฑ, ์์ , ์ญ์ ๋์์ด ์ํ
State์ ์ญํ
- State์๋ ํ ๋ผํผ ๊ตฌ์ฑ๊ณผ ์ค์ ๋ฅผ ๋๊ธฐํํ๊ณ ๊ฐ ๋ฆฌ์์ค์ ๊ณ ์ ํ ์์ด๋(๋ฆฌ์์ค ์ฃผ์)๋ก ๋งตํ
- ๋ฆฌ์์ค ์ข ์์ฑ๊ณผ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ์
- ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ํ๋ก๋น์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ ์ญํ ์ ์ํ
Plan์ ์คํํ๋ฉด ์๋ฌต์ ์ผ๋ก refresh ๋์์ ์ํํ๋ฉด์ ์ค์ ๋ฆฌ์์ค์ State๋ฅผ ๋น๊ตํฉ๋๋ค.
Plan์์์ -refresh=false
โ ๋๋์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ์ค์ ๋ฆฌ์์ค์ State๋ฅผ ๋น๊ตํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์
โ State๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ ๊ณํ์ ์์ฑํ๋ ์ต์
5-2. State ๋๊ธฐํ
ํ ๋ผํผ์ configuration ํ์ผ๊ณผ ๊ธฐ์กด State๋ฅผ ๋น๊ตํ์ฌ ์์ฑ, ์์ , ์ญ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
configuration ํ์ผ์ ํ ๋ผํผ ์ฝ๋๋ก ์์ฑํ ํ์ผ์ ์๋ฏธํฉ๋๋ค.
ํ ๋ผํผ์ configuration ํ์ผ ๋๋ State ํ์ผ์ ์ ๋ณด๊ฐ ์๋ ๋ฆฌ์์ค๋ง์ ๊ด๋ฆฌํฉ๋๋ค.
configuration - ๋ฆฌ์์ค ์กด์ฌ / state - ๋ฆฌ์์ค ์์ โ ๋ฆฌ์์ค create
configuration - ๋ฆฌ์์ค ์กด์ฌ / state - ๋ฆฌ์์ค ์กด์ฌ โ ๋ฆฌ์์ค update ๋๋ no changes
configuration - ๋ฆฌ์์ค ์์ / state - ๋ฆฌ์์ค ์กด์ฌ โ ๋ฆฌ์์ค destroy
5-3. ์ํฌ์คํ์ด์ค
State๋ฅผ ๊ด๋ฆฌํ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ์๊ณต๊ฐ โ ์ํฌ์คํ์ด์ค
์ํฌ์คํ์ด์ค๋ฅผ ๊ตฌ๋ถํ๋ฉด ๋์ผํ ๊ตฌ์ฑ์์ ๊ธฐ์กด ์ธํ๋ผ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๊ฐํธํ๊ฒ ํ ๋ผํผ ํ๋ก๋น์ ๋์ ํ ์คํธํ ์ ์๋ค.
๊ธฐ๋ณธ ์ํฌ์คํ์ด์ค๋ default๋ก ์ ์๋๊ณ , ์ฌ์ฉ ์ค์ธ ์ํฌ์คํ์ด์ค๋ terraform workspace list ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์๋ค.
terraform workspace new <์ํฌ์คํ์ด์ค ์ด๋ฆ> : ์๋ก์ด ์ํฌ์คํ์ด์ค ์์ฑ
configuration ํ์ผ์์๋ terraform.workspace๋ก ์ํฌ์คํ์ด์ค์ ์ด๋ฆ์ ์ฐธ์กฐํ ์ ์๋ค.
ํ ๋ผํผ OSS์ ์ํฌ์คํ์ด์ค๋ ์๋ฒฝํ ๊ฒฉ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ์ ๋๋ ํฐ๋ฆฌ ๊ธฐ๋ฐ์ ๋ ์ด์์์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ํฌ์คํ์ด์ค๋ฅผ ์์คํ ์ ์ผ๋ก ๋ณด์ํ์ฌ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ํ ๋ผํผ ํด๋ผ์ฐ๋ ๋๋ ํ ๋ผํผ ์ํฐํ๋ผ์ด์ฆ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
CH 6. ๋ชจ๋
ํ ๋ผํผ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ค๋ณด๋ฉด ์๊ฐ ์ง๋ ์๋ก ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๊ฐ ๋ง์์ง๊ณ ๋ณต์กํด์ง๋ค.
โ ๋ฆฌ์์ค ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ๋ณต์กํด์ง๊ณ ๋ณ๊ฒฝ ์์ ์ ์ํฅ๋๋ฅผ ๋ถ์ํ๊ธฐ ์ด๋ ค์์ง๋ค.๋ชจ๋ โ ํ ๋ผํผ ๊ตฌ์ฑ์ ์งํฉ
๋ชจ๋์ ํ ๋ผํผ์ผ๋ก ๊ด๋ฆฌํ๋ ๋์์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ๋ณต์กํด์ง ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ณ ๊ด๋ฆฌ ์์ ์ ์์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ชจ๋์ ๋ฃจํธ ๋ชจ๋๊ณผ ์์ ๋ชจ๋๋ก ๊ตฌ๋ถ๋๋ค.
- ๋ฃจํธ ๋ชจ๋(Root Module) โ ํ ๋ผํผ์ ์คํํ๊ณ ํ๋ก๋น์ ๋ํ๋ ์ต์์ ๋ชจ๋
- ์์ ๋ชจ๋(Child Module) โ ๋ฃจํธ๋ชจ๋์ ๊ตฌ์ฑ์์ ํธ์ถํ๋ ์ธ๋ถ ๊ตฌ์ฑ ์งํฉ
๋ชจ๋ ์ฌ์ฉ์ ์ฅ์ โ ๊ด๋ฆฌ ํจ์จํ, ์บก์ํ, ์ฌ์ฌ์ฉ์ฑ, ์ผ๊ด์ฑ, ํ์คํ
6-1. ๋ชจ๋ ์์ฑ ๊ธฐ๋ณธ ์์น
- ๋ชจ๋ ๋๋ ํฐ๋ฆฌ์ ๊ถ์ฅ ํ์ โ terraform-<ํ๋ก๋ฐ์ด๋ ์ด๋ฆ>-<๋ชจ๋ ์ด๋ฆ>
- ํ ๋ผํผ ์ฝ๋๋ ์ฒ์๋ถํฐ ๋ชจ๋ํ๋ฅผ ๊ฐ์ ํ๊ณ ๊ตฌ์ฑํ ๊ฒ์ ๊ถ์ฅ
- ๊ฐ๊ฐ์ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅ
- ๊ณต๊ฐ๋ ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ๋ชจ๋์ ์ฐธ๊ณ ํ ๊ฒ์ ๊ถ์ฅ
- ์์ฑํ ๋ชจ๋์ ๊ณต๊ฐ ๋๋ ๋น๊ณต๊ฐ๋ก ๊ณต์ ํ ๊ฒ์ ๊ถ์ฅ โ ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ํผ๋๋ฐฑ์ ํตํด ๋ ๋ฐ์ ๋ ๋ชจ๋์ ๊ตฌ์ฑ
6-2. ๋ชจ๋ํํด๋ณด๊ธฐ
ํ ๋ผํผ ๋ชจ๋ํ๋? ํ ๋ผํผ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ ์์
โ ์์ฑ๋ ๋ชจ๋์ ๋ค๋ฅธ ๋ฃจํธ ๋ชจ๋์์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ฉด์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์คํ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ ๋ณ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ
โ ๋ชจ๋์์ ํ์ํ ๊ฐ์ variable๋ก ์ ๋ ฅ ๋ฐ๊ณ , ๋ชจ๋์์ ์์ฑํ ๊ฐ ์ค ์ธ๋ถ ์ฐธ์กฐ๊ฐ ํ์ํ ๊ฐ์ output์ผ๋ก ๊ตฌ์ฑํ ๋ผํผ ์ฝ๋๋ก ๋ค์์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฆฌ์์ค ๋งํผ ๋ฐ๋ณตํด์ ์ฝ๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.
โ ๋ชจ๋์ ํ์ฉํ๋ฉด ๋ฐ๋ณต๋๋ ๋ฆฌ์์ค ๋ฌถ์์ ์ต์ํ ํ ์ ์์ต๋๋ค.๋ชจ๋๋ก ๋ฌถ์ฌ์ง ๋ฆฌ์์ค๋ module์ด๋ผ๋ ์ ์๋ฅผ ํตํด ๋จ์ํ๊ฒ ์ฌํ์ฉํ๊ณ ๋ฐ๋ณต ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋์ ๊ฒฐ๊ณผ ์ฐธ์กฐ โ module.<๋ชจ๋ ์ด๋ฆ>.<output ์ด๋ฆ>
6-3. ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ์
๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ ๊ด๋ จ ํ๋ก๋ฐ์ด๋์ ์ ์๊ฐ ํ์ํฉ๋๋ค.
ํ๋ก๋ฐ์ด๋ ์ ์์ ์์น
์์ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์
โ ์์ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ด ๋ฏผ๊ฐํ๊ฑฐ๋ ์์ ๋ชจ๋์ด ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ์ผ ๋ ์ฌ์ฉ
โ ๋ฃจํธ ๋ชจ๋๊ณผ ์์ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ด ์ผ์น๋์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์๋ฃจํธ ๋ชจ๋์์ ํ๋ก๋ฐ์ด๋ ์ ์
โ ์์ ๋ชจ๋์ด ๋ฃจํธ ๋ชจ๋์ ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ์ ์ข ์๋๋ ๋ฐฉ์
โ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ชจ๋ ๋ด ๋ฆฌ์์ค์ ๋ฐ์ดํฐ ์์ค์ ์ผ๊ด ์ ์ฉ# ๋ฃจํธ ๋ชจ๋์์ aws.seoul์ ์ ์ํ๊ณ ec2_seoul ๋ชจ๋์ ํธ์ถ provider "aws" { alias = "seoul" region = "ap-northeast-2" } module "ec2_seoul" { provider = { aws = aws.seoul } source = "../modules/terraform-aws-ec2" instance_type = "m5.large" }
๋ชจ๋์๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
locals { env = { dev = { type = "t3.micro" name = "dev_ec2" } prod = { type = "m5.large" name = "prod_ec2" } } } module "ec2_seoul" { for_each = local.env source = "../modules/terraform-aws-ec2" instance_type = each.value.type instance_name = each.value.name }
6-4. ๋ชจ๋ ์์ค ๊ด๋ฆฌ
module ๋ธ๋ก์์ source๋ก ๋ชจ๋ ์ฝ๋์ ์์น๋ฅผ ์ ์
# ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์ ์๋ ๋ชจ๋ ์ฌ์ฉ module "local_directory_vpc" { source = "../modules/" } # ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ์๋ ๋ชจ๋ ์ฌ์ฉ module "terraform_registry_vpc" { source = "terraform-aws-modules/vpc/aws" } # github์ ์๋ ๋ชจ๋ ์ฌ์ฉ module "github_vpc" { source = "github.com/hyuckang/terraform-vpc" }
๋ชจ๋ ์์ค์ ์ ํ
- ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ, ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ, ๊นํ๋ธ, S3 ๋ฑ