-
๋ฐ์ํ
๐ก Terraform ์ด๋?
Terraform์ ์ธํ๋ผ๋ฅผ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถ, ๋ณ๊ฒฝ ๋ฐ ๋ฒ์ ํํ ์ ์๋ ์ฝ๋ํ ์ธํ๋ผ(IaC) ๋๊ตฌ์ด๋ค. ์ฌ๊ธฐ์๋ ์ปดํจํ ์ธ์คํด์ค, ์คํ ๋ฆฌ์ง ๋ฐ ๋คํธ์ํน๊ณผ ๊ฐ์ ํ์ ์์ค ๊ตฌ์ฑ ์์์ DNS ํญ๋ชฉ ๋ฐ SaaS ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์์ ์์ค ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ํฌํจ๋๋ค.
๐ IAC ์ข ๋ฅ
์ฝ๋ํ ์ธํ๋ผ๋ฅผ ๊ฐ๋ฅํ๊ฒํ๋ ๋๊ตฌ(Tool)๋ค์ Terraform๋ฟ๋ง ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.- Chef
- Puppet
- Ansible
- AWS Cloudformation
๐ก Terraform work flow
ํ ๋ผํผ์ ๋ช ๋ ์ด๋ฅผ ํตํด ์ปดํจํฐ์๊ฒ ์ผ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค ์ฆ, CLI(Command-line interface)๋ฅผ ์ ๊ณตํ๋ค. ๋ํ, HCL์ด๋ผ๊ณ ๋ถ๋ฅด๋ Hashcorp Language๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ ํ๋ค.
1. terrafrom CLI ์ค์น(Install)
2. terraform ์ฝ๋ ์์ฑ(Write)
-> HCL์ธ์ด๋ก ์ด๋ค ์์(์๋ฒ,๋คํธ์ํฌ ๋ฑ)์ ์ด๋ป๊ฒ ๋ง๋ค์ง๋ฅผ ์ ์ํ ".tf" ํ์ฅ์์ ์์ค์ฝ๋๋ฅผ ์์ฑ
3. terraform ์ฝ๋ ๊ณํ(Plan)
-> ์์ฑํ ์ฝ๋๊ฐ ์ค์ ๋ก ์ด๋ค ๋ฆฌ์์ค๋ฅผ ์์ฑํ ๊ฒ์ธ์ง ์์ฑ ์ ์ ์ถ๋ ฅ
ํ์ ์๋ ์์ ์์ฑ, ์ฌ์ฉ์ค์ธ ์์ ์ญ์ ๋ฐฉ์ง
4. terraform ์ฝ๋ ์ ์ฉ(Apply)
-> ๊ณํ์์ ํ์ธํ ๋ฆฌ์์ค๋ฅผ ์ ์ฉํ๋ ๋จ๊ณ
Terraform ํ์ค ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
minimal ์์ โโโ README.md โโโ main.tf โโโ variables.tf โโโ outputs.tf
complete ์์ โโโ README.md โโโ main.tf โโโ variables.tf โโโ outputs.tf โโโ ... โโโ modules/ โ โโโ nestedA/ โ โ โโโ README.md โ โ โโโ variables.tf โ โ โโโ main.tf โ โ โโโ outputs.tf โ โโโ nestedB/ โ โโโ .../ โโโ examples/ โ โโโ exampleA/ โ โ โโโ main.tf โ โโโ exampleB/ โ โโโ .../
- ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ์ปค์คํ
ํ๊ฒ ์๋์ ํ์ผ๋ค์ ๋ถํ๊ธฐ๋ ํ๋ค.
โโโ provider.tf
โโโ backend.tf - main.tf : ํ ๋ผํผ CLI๋ฅผ ์ฌ์ฉํ์ฌ apply ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ๋จผ์ main์์ค ์ฝ๋๋ฅผ ๋์์ํจ๋ค.
- modules : ์๋ฐ๋ก ํ๋์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฐ๋ ์ด๋ค. main์์ input ๊ฐ์ ์ง์ ํ๊ณ ํด๋น ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค.
- backend.tf : ํ ๋ผํผ์ ํ์๊ด๋ฆฌ๋ฅผ ์ํด .tfstate ํ์ผ์ ์์ฑํ๋ค. ์ด ํ์ผ์ backupํ๊ณ ํ์๊ด๋ฆฌ ํ๊ธฐ ์ํ ์ค์ ์ ์ ์ํ๋ค.
- provider.tf : ๋ฆฌ์์ค๋ฅผ ์ด๋์ ์ ๊ณตํ๋์ง, ๋ฒ์ ์ ์ด๋ค๊ฒ์ธ์ง ๋ฑ์ ์ค์ ํ๋ค.
- outputs.tf : ํด๋น ํ์ผ์ ์ค์ ์ ํตํด์ ์์ค์ฝ๋์ ๋ํ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
- variables.tf : ์์ค์ฝ๋์ ์ฌ์ฉํ ๋ณ์๋ค์ ์ ์ ํ๋ค.
๐ ์ฉ์ด ์ ๋ฆฌ
ํ๋ก๋น์ ๋(Provisioning)
์ด๋ค ํ๋ก์ธ์ค๋ ์๋น์ค๋ฅผ ์คํํ๊ธฐ ์ํ ์ค๋น ๋จ๊ณ๋ฅผ ํ๋ก๋น์ ๋์ด๋ผ๊ณ ์ด์ผ๊ธฐํ๋ค. ํ๋ก๋น์ ๋์๋ ํฌ๊ฒ ๋คํธ์ํฌ๋ ์ปดํจํ ์์์ ์ค๋นํ๋ ์์ ๊ณผ ์ค๋น๋ ์ปดํจํ ์์์ ์ฌ์ดํธ ํจํค์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์์กด์ฑ์ ์ค๋นํ๋ ๋จ๊ณ๋ก ๋๋์ด์ง๋ค. ๋ช ํํ ๊ฒฝ๊ณ๋ ๋ถ๋ถ๋ช ํ์ง๋ง ํ ๋ผํผ์ ์ ์๋ฅผ ์ฃผ๋ก ๋ค๋ฃจ๋ ๋๊ตฌ์ด๋ค.
ํ๋ก๋ฐ์ด๋(Provider)
ํ ๋ผํผ๊ณผ ์ธ๋ถ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ ๋ชจ๋์ด๋ค. ์๋ฅผ ๋ค์ด ํ ๋ผํผ์ผ๋ก AWS ์๋น์ค์ ์ปดํจํ ์์์ ์์ฑํ๊ธฐ ์ํด์๋ aws ํ๋ก๋ฐ์ด๋๋ฅผ ๋จผ์ ์ ์ ํด์ผํ๋ค. ํ๋ก๋ฐ์ด๋๋ก๋ AWS, ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ๋ซํผ(Google Cloud Platform), ๋ง์ดํฌ๋ก์ํํธ ์ ์ (Microsoft Azure)์ ๊ฐ์ ๋ฒ์ฉ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ๋น๋กฏํด ๊นํ๋ธ(Github), ๋ฐ์ดํฐ๋๊ทธ(Datadog), DNSimple๊ณผ ๊ฐ์ ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋น์ค, MySQL, ๋ ๋นMQ(RabbitMQ), ๋์ปค(Docker)์ ๊ฐ์ ๋ก์ปฌ ์๋น์ค ๋ฑ์ ์ง์ํ๋ค. ์ ์ฒด ๋ชฉ๋ก์ ํ ๋ผํผ ํ๋ก๋ฐ์ด๋ ๋ฌธ์์์ ์ฐพ์๋ณผ ์ ์๋ค.
๋ฆฌ์์ค(Resource)
๋ฆฌ์์ค๋ ํน์ ํ๋ก๋ฐ์ด๋๊ฐ ์ ๊ณตํด์ฃผ๋ ์กฐ์ ๊ฐ๋ฅํ ๋์์ ์ต์ ๋จ์์ด๋ค. ์๋ฅผ ๋ค์ด AWS ํ๋ก๋ฐ์ด๋๋ aws_instance ๋ฆฌ์์ค ํ์ ์ ์ ๊ณตํ๊ณ , ์ด ๋ฆฌ์์ค ํ์ ์ ์ฌ์ฉํด Amazon EC2์ ๊ฐ์ ๋จธ์ ๋ฆฌ์์ค๋ฅผ ์ ์ธํ๊ณ ์กฐ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. EC2 ์ธ์คํด์ค, ์ํ๋ฆฌํฐ ๊ทธ๋ฃน, ํค ํ์ด ๋ชจ๋ aws ํ๋ก๋ฐ์ด๋๊ฐ ์ ๊ณตํด์ฃผ๋ ๋ฆฌ์์ค ํ์ ์ด๋ค.
HCL(Hashicorp Configuration Language)
HCL์ ํ ๋ผํผ์์ ์ฌ์ฉํ๋ ์ค์ ์ธ์ด์ด๋ค. ํ ๋ผํผ์์ ๋ชจ๋ ์ค์ ๊ณผ ๋ฆฌ์์ค ์ ์ธ์ HCL์ ์ฌ์ฉํด ์ด๋ฃจ์ด์ง๋ค. ํ ๋ผํผ์์ HCL ํ์ผ์ ํ์ฅ์๋ .tf๋ฅผ ์ฌ์ฉํ๋ค.
References
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started
http://dveamer.github.io/backend/TerrafromAwsEks.html๋ฐ์ํ