์ค๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ฐ ์์ฑํ ์๋ก์ด CLI ๋๊ตฌ์ ๋ํด ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๋ฌธ์
Terraform์ ์ค๋ซ๋์ Devops/Cloud/IT ์ปค๋ฎค๋ํฐ์ ํ์ค์ด์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ํธ๋ฆฌํ๊ณ ์ ์ฉํฉ๋๋ค. Terraform์๋ ํฌํฌ, ๋ ์นด๋ก์ด ์นผ, ๊ฐํด๋ฟ๋ง ์๋๋ผ ๋ง์ ์ฆ๊ฑฐ์์ด ์์ต๋๋ค.
Terraform์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ๊ฒ์ ์์ฑํ ๋ค์ ์ด๋ฅผ ๊ด๋ฆฌ, ๋ณ๊ฒฝ ๋๋ ์ญ์ ํ๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ํด๋ผ์ฐ๋์ ๊ฑฐ๋ํ ์ธํ๋ผ๋ฅผ ๊ฐ๊ณ ์๋๋ฐ Terraform์ ํตํด ์์ฑ๋์ง ์์ ์ฌ๋๋ค์ ๋ฌด์์ ํด์ผ ํ ๊น์? ์ ์ฒด ํด๋ผ์ฐ๋๋ฅผ ๋ค์ ์์ฑํ๊ณ ๋ค์ ๋ง๋๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์์ ํ์ง ์์ต๋๋ค.
์ ๋ 2๊ฐ์ ์์
์์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ์๋ ๋ชจ๋ ๊ฒ์ด Git์ Terraform ํ์ผ ํ์์ผ๋ก ์๊ธฐ๋ฅผ ์ํ์ง๋ง ๋ฒํท์ด 250๊ฐ๊ฐ ๋๊ณ ์ด๋ฅผ ์ง์ Terraform์ผ๋ก ์์ฑํ๋ ค๋ฉด ๋ง์ ๊ฒฝ์ฐ์
๋๋ค.
์ด
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก๋ง ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
๊ฒฝ๊ณ : ์ ์๋ ์ธ์์ ์ ๋ฐ์ ๋ฌ์์์์ ์ด์ง ์์์ผ๋ฉฐ ๋ฌ์์์ด๋ก ๊ธ์ ๊ฑฐ์ ์ฐ์ง ์์ต๋๋ค. ์ฒ ์ ์ค๋ฅ์ ์ฃผ์ํ์ธ์.
์๋ฃจ์
1. AWS๋ฅผ ์ํ ๊ธฐ์ฑ ์๋ฃจ์
๊ณผ ๊ธฐ์กด ์๋ฃจ์
์ด ์์ต๋๋ค.
ํ
๋ผํฌ๋ฐ ์๋ ๋ฐฉ์: AWS SDK์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ
ํ๋ฆฟ์ ํตํด tf ๋ฐ tfstate๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ๊ธฐ์๋ 3๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
1. ์
๋ฐ์ดํธ๊ฐ ํญ์ ์ง์ฐ๋ฉ๋๋ค.
2. tf ํ์ผ์ด ๊ฐ๋ ๊นจ์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ด์
3. tfstate๋ tf์ ๋ณ๋๋ก ์์ง๋๋ฉฐ ํญ์ ์๋ ด๋์ง๋ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก 'ํ
๋ผํผ ๊ณํ'์์๋ ๋ณํ๊ฐ ์๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ด๋ ต๋ค.
2. `terraform import`๋ terraform์ ๋ด์ฅ๋ ๋ช
๋ น์
๋๋ค. ์ด๋ป๊ฒ ์๋ํ๋์?
๋ฆฌ์์ค ์ด๋ฆ๊ณผ ์ ํ์ด ํฌํจ๋ ๋น TF ํ์ผ์ ์์ฑํ ๋ค์ `terraform import`๋ฅผ ์คํํ๊ณ ๋ฆฌ์์ค ID๋ฅผ ์ ๋ฌํฉ๋๋ค. Terraform์ ๊ณต๊ธ์์๊ฒ ์ฐ๋ฝํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ tfstate ํ์ผ์ ๋ง๋ญ๋๋ค.
์ฌ๊ธฐ์๋ 3๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
1. tfstate ํ์ผ๋ง ๊ฐ์ ธ์ค๊ณ tf๋ ๋น์ด ์์ผ๋ฏ๋ก ์๋์ผ๋ก ์์ฑํ๊ฑฐ๋ tfstate์์ ๋ณํํด์ผ ํฉ๋๋ค.
2. ํ ๋ฒ์ ํ๋์ ๋ฆฌ์์ค๋ก๋ง ์์
ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ง์ํ์ง๋ ์์ต๋๋ค. 250๊ฐ ์ด์์ ๋ฒํท์ผ๋ก ๋ค์ ๋ฌด์์ ํด์ผ ํฉ๋๊น?
3. ๋ฆฌ์์ค์ ID๋ฅผ ์์์ผ ํฉ๋๋ค. ์ฆ, ๋ฆฌ์์ค ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ก ์ด๋ฅผ ๋ํํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ ๋ถ๋ถ์ ์ด๋ฉฐ ์ ํ์ฅ๋์ง ์์ต๋๋ค.
๋์ ๊ฒฐ์
์๊ตฌ ์ฌํญ :
1. ๋ฆฌ์์ค์ ๋ํ tf ๋ฐ tfstate ํ์ผ์ ์์ฑํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด ๋ชจ๋ ๋ฒํท/๋ณด์ ๊ทธ๋ฃน/๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ๋ค์ด๋ก๋ํ๊ณ 'terraform plan'์์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ค๊ณ ๋ฐํํ์ต๋๋ค.
2. GCP + AWS ํด๋ผ์ฐ๋ 2๊ฐ๊ฐ ํ์ํฉ๋๋ค.
3. ๋งค๋ฒ ์
๋ฐ์ดํธ๊ฐ ์ฝ๊ณ , 3์ผ ์์
๋์ ๊ฐ ๋ฆฌ์์ค์ ์๊ฐ์ ๋ญ๋นํ์ง ์๋ ๊ธ๋ก๋ฒ ์๋ฃจ์
4. ์คํ ์์ค๋ก ๋ง๋ค๊ธฐ - ๋ชจ๋๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๊ณ ์์ต๋๋ค
Go ์ธ์ด๋ ๋ด๊ฐ ์ข์ํ๋ ์ด์ ์ด๋ฉฐ, terraform์์ ์ฌ์ฉ๋๋ HCL ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ + ์ ์ฉํ ์ ์๋ terraform์ ๋ง์ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
๊ฒฝ๋ก
๋จผ์ ์๋ํ์ญ์์ค.
์ ๋ ๊ฐ๋จํ ๋ฒ์ ์ผ๋ก ์์ํ์ต๋๋ค. ํ์ํ ๋ฆฌ์์ค์ ๋ํด SDK๋ฅผ ํตํด ํด๋ผ์ฐ๋์ ์ ์ํ๊ณ ์ด๋ฅผ Terraform์ฉ ํ๋๋ก ๋ณํํฉ๋๋ค. ๋ณด์ ๊ทธ๋ฃน๋ง ๋ณํํ๋ ๋ฐ 1.5์ผ์ด ๊ฑธ๋ฆฌ๊ณ ๋ฆฌ์์ค๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ณด์ ๊ทธ๋ฃน์์ ์๋๊ฐ ์ฆ์ ์ค๋จ๋์์ต๋๋ค. ์ค๋ ์๊ฐ์ด ์ง๋๋ฉด ํ๋๊ฐ ๋ณ๊ฒฝ/์ถ๊ฐ๋ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์๋
์ค๋ช
๋ ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก
์ด์ tfstate๋ฅผ tf๋ก ๋ณํํ๋ ์ฌ๊ท์ ํฌ๋ฅด๋
ธ๊ทธ๋ํผ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. tfstate๋ฅผ ํ๋ฒ๋ ์ฝ์ด๋ณธ ์ ์ด ์๋ ๋ถ๋ค์ ์ํด ์ค๋ช
ํ์๋ฉด JSON์ด์ง๋ง ํน๋ณํฉ๋๋ค.
์ค์ํ ๋ถํ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"attributes": {
"id": "default/backend-logging-load-deployment",
"metadata.#": "1",
"metadata.0.annotations.%": "0",
"metadata.0.generate_name": "",
"metadata.0.generation": "24",
"metadata.0.labels.%": "1",
"metadata.0.labels.app": "backend-logging",
"metadata.0.name": "backend-logging-load-deployment",
"metadata.0.namespace": "default",
"metadata.0.resource_version": "109317427",
"metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
"metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
"spec.#": "1",
"spec.0.min_ready_seconds": "0",
"spec.0.paused": "false",
"spec.0.progress_deadline_seconds": "600",
"spec.0.replicas": "1",
"spec.0.revision_history_limit": "10",
"spec.0.selector.#": "1",
๋ค์์ด ์์ต๋๋ค:
1. ์์ด๋ - ๋ฌธ์์ด
2. ๋ฉํ๋ฐ์ดํฐ - ํฌ๊ธฐ 1์ ๋ฐฐ์ด๊ณผ ๊ทธ ์์ ์๋ ์ค๋ช
๋ ํ๋๊ฐ ์๋ ๊ฐ์ฒด
3. spec - ํฌ๊ธฐ 1๊ณผ ํค์ ํด์, ๊ทธ ์์ ์๋ ๊ฐ
๊ฐ๋จํ ๋งํด์, ์ฌ๋ฏธ์๋ ํ์์ผ๋ก ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฌ ์์ค์ผ๋ก ๊น์ด์ง ์ ์์ต๋๋ค.
"spec.#": "1",
"spec.0.min_ready_seconds": "0",
"spec.0.paused": "false",
"spec.0.progress_deadline_seconds": "600",
"spec.0.replicas": "1",
"spec.0.revision_history_limit": "10",
"spec.0.selector.#": "1",
"spec.0.selector.0.match_expressions.#": "0",
"spec.0.selector.0.match_labels.%": "1",
"spec.0.selector.0.match_labels.app": "backend-logging-load",
"spec.0.strategy.#": "0",
"spec.0.template.#": "1",
"spec.0.template.0.metadata.#": "1",
"spec.0.template.0.metadata.0.annotations.%": "0",
"spec.0.template.0.metadata.0.generate_name": "",
"spec.0.template.0.metadata.0.generation": "0",
"spec.0.template.0.metadata.0.labels.%": "1",
"spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
"spec.0.template.0.metadata.0.name": "",
"spec.0.template.0.metadata.0.namespace": "",
"spec.0.template.0.metadata.0.resource_version": "",
"spec.0.template.0.metadata.0.self_link": "",
"spec.0.template.0.metadata.0.uid": "",
"spec.0.template.0.spec.#": "1",
"spec.0.template.0.spec.0.active_deadline_seconds": "0",
"spec.0.template.0.spec.0.container.#": "1",
"spec.0.template.0.spec.0.container.0.args.#": "3",
์ผ๋ฐ์ ์ผ๋ก ์ธํฐ๋ทฐ๋ฅผ ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ์ํ๋ ์ฌ๋์ด ์๋ค๋ฉด ์ด ์์
์ ๋ํ ํ์๋ฅผ ์์ฑํ๋๋ก ์์ฒญํ์ธ์. :)
๋ฒ๊ทธ ์๋ ํ์๋ฅผ ์์ฑํ๋ ค๊ณ ์ฌ๋ฌ ๋ฒ ์๋ํ ๋์ terraform ์ฝ๋์์ ๊ทธ ์ผ๋ถ์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ๋์๊ฐ๋ ๊ฒ ๊ฐ์์ด์
์ธ ๋ฒ์งธ ์๋
Terraform ๊ณต๊ธ์๋ ํด๋ผ์ฐ๋ API ์์
์ ์ํ ๋ชจ๋ ๋ฆฌ์์ค์ ๋
ผ๋ฆฌ๊ฐ ํฌํจ๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ฐ์ด๋๋ฆฌ์
๋๋ค. ๊ฐ ํด๋ผ์ฐ๋์๋ ์์ฒด ๊ณต๊ธ์๊ฐ ์์ผ๋ฉฐ Terraform ์์ฒด๋ ๋ ํ๋ก์ธ์ค ๊ฐ์ RPC ํ๋กํ ์ฝ์ ํตํด์๋ง ์ด๋ฅผ ํธ์ถํฉ๋๋ค.
์ด์ RPC ํธ์ถ์ ํตํด Terraform ์ ๊ณต์
์ฒด์ ์ง์ ์ฐ๋ฝํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ํ๋ฅญํ๊ณ Terraform ๊ณต๊ธ์๋ฅผ ์ต์ ๊ณต๊ธ์๋ก ๋ณ๊ฒฝํ๊ณ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ป์ ์ ์๊ฒ ๋์์ต๋๋ค. ๋ํ tfstate์ ๋ชจ๋ ํ๋๊ฐ tf์ ์์ด์ผ ํ๋ ๊ฒ์ ์๋์ง๋ง ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ด์ ๋ํด์๋ ์๋น์ค ์ ๊ณต์์๊ฒ ๋ฌธ์ํ์ธ์. ๊ทธ๋ฐ ๋ค์ ์ ๊ท์์ ์กฐํฉํ๋ ๋ ๋ค๋ฅธ ์ฌ๊ท ํฌ๋ฅด๋
ธ๊ทธ๋ํผ๊ฐ ์์๋์ด ๋ชจ๋ ์์ค์์ tfstate ๋ด๋ถ ํ๋๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๊ฒ์ํ์ต๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋ชจ๋ Terraform ๊ณต๊ธ์๋ฅผ ์ํ ๊ณตํต ์ธํ๋ผ๋ฅผ ๊ฐ๊ณ ์๊ณ ์ ์ธํ๋ผ๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ ์ ์ฉํ CLI ๋๊ตฌ๋ฅผ ์ป์์ต๋๋ค. ๋ํ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐ๋ ์ฝ๋๊ฐ ๊ฑฐ์ ํ์ํ์ง ์์ต๋๋ค. ๋ํ ๋ฆฌ์์ค ๊ฐ์ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๋ชจ๋ ์ข
๋ฅ์ ์ฅ์ ์ด ์์ต๋๋ค. ๋ฌผ๋ก , ๋ค ์ค๋ช
ํ ์ ์๋ ๋ค์ํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋๋ ๊ทธ ๋๋ฌผ์๊ฒ ํ
๋ผํฌ๋จธ(Terrafomer)๋ผ๋ ์ด๋ฆ์ ๋ถ์์ต๋๋ค.
๊ฒฐ์น
Terrafomer๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ํด๋ผ์ฐ๋์์ 500~700์ค์ tf + tfstate ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋ ์์ด๋์ด์ ๊ฐ์ ์ต๊ณ ์ ์ธํ๋ผ์์์ ๊ฐ์ด ๋ ๊ฑฐ์ ํญ๋ชฉ์ ๊ฐ์ ธ์ ํ ๋ผํผ์ ํตํด์๋ง ์ ๊ทผํ ์ ์์์ต๋๋ค. ๊ฑฐ๋ํ ํด๋ผ์ฐ๋๋ฅผ ๊ฐ์ ธ์ ํ์ ํตํด Terraform ์์ ์ ํ์ผ ํํ๋ก ๋ฐ๋ ๊ฒ์ ์ ๋ง ๋ง๋ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ grep/replace/git ๋ฑ์ ์ํํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋น์งํ๊ณ ์ ๋ฆฌํ๊ณ ํ๋ฝ์ ๋ฐ์์ต๋๋ค. ๋ชฉ์์ผ(02.05.19๋
XNUMX์ XNUMX์ผ)์ ๋ชจ๋ ์ฌ๋์ ์ํด GitHub์ ์ถ์๋์์ต๋๋ค.
OpenStack ๋ฐ Kubernetes์ ๋ํ ์ง์ ์ถ๊ฐ์ ๋ํ 600๊ฐ์ ํ ์์ฒญ๊ณผ 2๊ฐ์ ๋ณ์ ์ด๋ฏธ ๋ฐ์์ต๋๋ค. ์ข์ ํผ๋๋ฐฑ. ์ผ๋ฐ์ ์ผ๋ก ์ด ํ๋ก์ ํธ๋ ์ฌ๋๋ค์๊ฒ ์ ์ฉํฉ๋๋ค.
๋๋ Terraform ์์
์ ์์ํ๊ณ ์ด๋ฅผ ์ํด ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ฑํ์ง ์์ผ๋ ค๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์กฐ์ธํฉ๋๋ค.
์์ฒญ, ์ด์, ๋ณ์ ๊ธฐ๊บผ์ด ๋์ด์ฌ ๊ฒ์
๋๋ค.
ะะตะผะพ
์ถ์ฒ : habr.com