Terraform

tjdals080Β·2022λ…„ 6μ›” 16일
0

πŸ’‘ 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, λ ˆλΉ—MQRabbitMQ, 도컀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

profile
λŠλ¦¬λ”λΌλ„ κΎΈμ€€νžˆ

0개의 λŒ“κΈ€