Terraformer - ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ

Terraformer - ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ
์˜ค๋ž˜๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์ƒˆ๋กœ์šด CLI ๋„๊ตฌ์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ

Terraform์€ ์˜ค๋žซ๋™์•ˆ Devops/Cloud/IT ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํ‘œ์ค€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Terraform์—๋Š” ํฌํฌ, ๋‚ ์นด๋กœ์šด ์นผ, ๊ฐˆํ€ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ์ฆ๊ฑฐ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Terraform์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ด๋ฅผ ๊ด€๋ฆฌ, ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ์— ๊ฑฐ๋Œ€ํ•œ ์ธํ”„๋ผ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ Terraform์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ „์ฒด ํด๋ผ์šฐ๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ €๋Š” 2๊ฐœ์˜ ์ž‘์—…์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด Git์— Terraform ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋ฒ„ํ‚ท์ด 250๊ฐœ๊ฐ€ ๋„˜๊ณ  ์ด๋ฅผ ์ง์ ‘ Terraform์œผ๋กœ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋งŽ์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
์ด ๋ฐœํ–‰๋ฌผ 2014๋…„๋ถ€ํ„ฐ terrafom์—์„œ ์ˆ˜์ž…์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์œผ๋กœ 2016๋…„์— ๋ฌธ์„ ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์€ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ๋งŒ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ : ์ €์ž๋Š” ์ธ์ƒ์˜ ์ ˆ๋ฐ˜์„ ๋Ÿฌ์‹œ์•„์—์„œ ์‚ด์ง€ ์•Š์•˜์œผ๋ฉฐ ๋Ÿฌ์‹œ์•„์–ด๋กœ ๊ธ€์„ ๊ฑฐ์˜ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒ ์ž ์˜ค๋ฅ˜์— ์ฃผ์˜ํ•˜์„ธ์š”.

์†”๋ฃจ์…˜

1. AWS๋ฅผ ์œ„ํ•œ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜๊ณผ ๊ธฐ์กด ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ๋ผํฌ๋ฐ. 250๊ฐœ ์ด์ƒ์˜ ๋ฒ„ํ‚ท์„ ํ†ต๊ณผ์‹œํ‚ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์„ ๋•Œ ๊ฑฐ๊ธฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜์˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. AWS๋Š” ์˜ค๋žซ๋™์•ˆ ๋งŽ์€ ์ƒˆ๋กœ์šด ์˜ต์…˜์„ ๋„์ž…ํ•ด ์™”์ง€๋งŒ ํ…Œ๋ผํฌ๋ฐ์€ ์ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฃจ๋น„์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์ด ๋“œ๋ฌผ์–ด ๋ณด์ž…๋‹ˆ๋‹ค.. ์ €๋… 2์‹œ ์ดํ›„์— ๋ณด๋ƒˆ์–ด์š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๊ฑฐ๊ธฐ์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์ด ์ „ํ˜€ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
ํ…Œ๋ผํฌ๋ฐ ์ž‘๋™ ๋ฐฉ์‹: 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๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?? ์—ฌ๊ธฐ์„œ 'terraform ์ƒˆ๋กœ ๊ณ ์นจ' ๋ช…๋ น์ด ๊ตฌ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. terraform์€ tfstate์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ID๋ณ„๋กœ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ชจ๋“  ๊ฒƒ์„ tfstate์— ์”๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋ฆ„๊ณผ ID๋งŒ ์žˆ๋Š” ๋นˆ tfstate๋ฅผ ๋งŒ๋“ค๊ณ  `terraform ์ƒˆ๋กœ ๊ณ ์นจ`์„ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด tfstate๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋งŒ์„ธ!
์ด์ œ 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์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. github.com/GoogleCloudPlatform/terraformer
OpenStack ๋ฐ Kubernetes์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€์— ๋Œ€ํ•œ 600๊ฐœ์˜ ํ’€ ์š”์ฒญ๊ณผ 2๊ฐœ์˜ ๋ณ„์„ ์ด๋ฏธ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ข‹์€ ํ”ผ๋“œ๋ฐฑ. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” Terraform ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์กฐ์–ธํ•ฉ๋‹ˆ๋‹ค.
์š”์ฒญ, ์ด์Šˆ, ๋ณ„์„ ๊ธฐ๊บผ์ด ๋Œ์–ด์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ะ”ะตะผะพ
Terraformer - ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€