ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Terraform
    Terraform 2022. 10. 23. 18:20
    ๋ฐ˜์‘ํ˜•

    ๐Ÿ’ก 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

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.