[t1013] Terraform Basics 1/3

xgroยท2023๋…„ 8์›” 31์ผ
0

Terraform

๋ชฉ๋ก ๋ณด๊ธฐ
6/10
post-thumbnail

๐Ÿ“Œ Notice

๋ณธ ๋ธ”๋กœ๊น…์€ ์•„๋ž˜์˜ 24๋‹จ๊ณ„ ์‹ค์Šต์œผ๋กœ ์ •๋ณตํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ฑ…์„ ๊ธฐ์ค€ํ•˜์—ฌ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ - ํ•œ๋น›์ถœํŒ๋„คํŠธ์›Œํฌ

CloudNetaStudy ๊ทธ๋ฃน์—์„œ ์Šคํ„ฐ๋””ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
Hashicorp korea ์œ ํ˜•์šฑ๋‹˜๊ณผ ํ•จ๊ป˜ ์Šคํ„ฐ๋”” ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™
์œ ํ˜•์šฑ๋‹˜๊ณผ ์œค์„œ์œจ๋‹˜๊ป˜ ๋‹ค์‹œํ•œ๋ฒˆ ๐Ÿ™‡ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
DevOps ์—”์ง€๋‹ˆ์–ด๋กœ์„œ ์—…๋ฌด์—์„œ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ…Œ๋ผํผ์— ๋Œ€ํ•ด์„œ ๋†“์ณค๋˜ ๋ถ€๋ถ„์ด๋‚˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ๋‹ค๋“ฌ์œผ๋ฉฐ, ์—…๋ฌด ์—ญ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ Summary

  • IaC์™€ ํ…Œ๋ผํผ์„ ์ดํ•ดํ•˜๊ณ  ์Šคํ„ฐ๋””์— ํ•„์š”ํ•œ ์‹ค์Šต ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ํ…Œ๋ผํผ ๊ธฐ๋ณธ ๋ช…๋ น ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • HCL์„ ์ดํ•ดํ•˜๊ณ  ๊ธฐ๋ณธ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ˜ํ”Œ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค.



๐Ÿ“Œ Study

๐Ÿ‘‰ Step 01. 1์žฅ IaC์™€ ํ…Œ๋ผํผ

ํ…Œ๋ผํผ์ด๋ž€?
ํ•˜์‹œ์ฝ”ํ”„์‚ฌ์—์„œ ๊ณต๊ฐœํ•œ IaC ๋„๊ตฌ
โ€˜ํ•˜์‹œ์ฝ”ํ”„์˜ ์ฒ ํ•™ - ๋งํฌโ€™ ์ค‘ 3๊ฐ€์ง€๋ฅผ ๋‹ด์•„์„œ ํ…Œ๋ผํผ์„ ์„ค๊ณ„ : ์›Œํฌํ”Œ๋กœ์šฐ์— ์ง‘์ค‘, ์ฝ”๋“œํ˜• ์ธํ”„๋ผ, ์‹ค์šฉ์ฃผ์˜

ํ…Œ๋ผํผ ์ œ๊ณต ์œ ํ˜•

  1. On-premise : Terraform์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ํ˜•ํƒœ๋กœ, ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์— ์˜คํ”ˆ์†Œ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌํˆด์ธ ํ…Œ๋ผํผ์„ ํ†ตํ•ด ์‚ฌ์šฉ
  2. Hosted SaaS : Terraform Cloud๋กœ ๋ถˆ๋ฆฌ๋Š” SaaS๋กœ ์ œ๊ณต๋˜๋Š” ๊ตฌ์„ฑ ํ™˜๊ฒฝ์œผ๋กœ ํ•˜์‹œ์ฝ”ํ”„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋ฒ„ ํ™˜๊ฒฝ์ด ์ œ๊ณต
  3. Private Install : Terraform Enterprise๋กœ ๋ถˆ๋ฆฌ๋Š” ์„œ๋ฒ„ ์„ค์น˜ํ˜• ๊ตฌ์„ฑ ํ™˜๊ฒฝ์œผ๋กœ, ๊ธฐ์—…์˜ ์‚ฌ๋‚ด ์ •์ฑ…์— ๋”ฐ๋ผ ํ”„๋กœ๋น„์ €๋‹ ๊ด€๋ฆฌ๊ฐ€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ๊ฒฉ๋ฆฌ - ๋งํฌ

๐Ÿ‘‰ Step 02. 2์žฅ ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

โœ… 2.1 ํ…Œ๋ผํผ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ(3๊ฐ€์ง€) :

  • ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ(์‹คํ–‰) ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
  • ํ…Œ๋ผํผ ์†Œ์Šค ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ ํ›„ ๋นŒ๋“œ
  • OS ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ํ™œ์šฉ

๋ฒ„์ „ ์„ ํƒ : ๊ฐ€์žฅ ์ตœ์„  ๋ฒ„์ „ ๊ถŒ์žฅ - ํ•˜์œ„ ๋ฒ„์ „ ํ˜ธํ™˜, ๊ธฐ๋Šฅ ๊ฐœ์„ , ๋ฒ„๊ทธ ์ˆ˜์ •

  • ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋„ค์ด๋ฐ ๊ทœ์น™ : terraform_<๋ฒ„์ „>_<OS>_<CPU>.zip

PATH ์„ค์ • : ๋ฆฌ๋ˆ…์Šค/macOS , ์œˆ๋„์šฐ

  • ๋ฆฌ๋ˆ…์Šค : /usr/bin
  • ์œˆ๋„์šฐ : C:\\windows\\system32

์ฐธ๊ณ  : BSL ๋ผ์ด์„ผ์Šค ์ ์šฉ์€ Terraform 1.5.x ์ดํ›„๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. (์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ์ œํ•œ๋˜์ง€ ์•Š์œผ๋‹ˆ ์—ผ๋ คํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹คโ—๏ธ)

โœ… 2.2 IDE ๊ตฌ์„ฑ

ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ IDE๋Š” ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ Visual Studio Code (VS Code)๋ฅผ ์„ค์น˜ ํ›„ ์‹ค์Šต์— ์‚ฌ์šฉ - ๋งํฌ

  • Extentions (ํ™•์žฅ) ์„ค์น˜
    • HashiCorp HCL : syntax highlighting forย HCLย files - ๋งํฌ
    • HashiCorp Terraform : Highlighting syntax from Terraform ๋“ฑ - ๋งํฌ
  • VS Code์—์„œ ํ„ฐ๋ฏธ๋„ ์œˆ๋„์šฐ ์ถ”๊ฐ€(๋‹จ์ถ•ํ‚ค: `Ctrl+``)

โœ… 2.3 (์ฐธ๊ณ ) CLI ๊ตฌ์„ฑ ํŒŒ์ผ โ† skip

  • CLI ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ, ํ…Œ๋ผํผ ๋™์ž‘ ์„ค์ • ๊ฐ€๋Šฅ - ๋งํฌ
    • ์œˆ๋„์šฐ : ์‚ฌ์šฉ์ž์˜ %APPDATA% ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ terraform.rc ํŒŒ์ผ
    • ๋‚˜๋จธ์ง€ OS : ์‚ฌ์šฉ์ž ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ .terraformrc ํŒŒ์ผ
    • ํŒŒ์ผ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ค์ • ๊ฐ’
      • credentials: Terraform Cloud ๋˜๋Š” Terraform Enterprise์™€ ์—ฐ๋™์„ ์œ„ํ•œ ์ธ์ฆ ์ •๋ณด ์„ค์ •
      • credentials_helper: ํ…Œ๋ผํผ์—์„œ Terraform Cloud/Enterprise๋ฅผ ์œ„ํ•œ ์ž๊ฒฉ์ฆ๋ช…์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ์–ธ (์˜ˆ๋ฅผ ๋“ค์–ด macOS์˜ ํ‚ค์ฒด์ธ์— ์ €์žฅ)
      • disable_checkpoint: true๋กœ ์„ค์ •ํ•˜๋ฉด ํ•˜์‹œ์ฝ”ํ”„์˜ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”
      • disable_checkpoint_signature: true์ธ ๊ฒฝ์šฐ ํ•˜์‹œ์ฝ”ํ”„์˜ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋Š” ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ œ๊ฑฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ต๋ช… ID ์‚ฌ์šฉ์„ ๋น„ํ™œ์„ฑํ™”
      • plugin_cache_dir: terraform init ์ˆ˜ํ–‰ ์‹œ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์บ์‹ฑ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์บ์‹œ ์œ„์น˜๋กœ ์ง€์ • โ†’ ํ™œ์šฉ ์‹œ ํ”„๋กœ๋ฐ”์ด๋”์˜ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„๋˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
      • provider_installation: ํ”„๋กœ๋ฐ”์ด๋” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋Š” terraform init ์ˆ˜ํ–‰ ์‹œ ๋™์ž‘์„ ์žฌ์ •์˜ โ†’ ํ™œ์šฉ ์‹œ ์ธํ„ฐ๋„ท์ด ๋‹จ์ ˆ๋œ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•œ ๋กœ์ปฌ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ - ๋งํฌ

๐Ÿ‘‰ Step 03. 3์žฅ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

โœ… 3.1 ์ฃผ์š” ์ปค๋งจ๋“œ

โ€˜helpโ€™ ์˜ต์…˜(์ฐธ๊ณ )

# ์„œ๋ธŒ์ปค๋งจ๋“œ help ์ง€์›
terraform console -help
terraform init -help

init ์ดˆ๊ธฐํ™”

# ํ…Œ๋ผํผ ์‹คํ–‰์„ ์œ„ํ•ด ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™
# (์ฐธ๊ณ ) ํ…Œ๋ผํผ์ด ์‹คํ–‰๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ = ๋ชจ๋“ˆ(ํ…Œ๋ผํผ ์ฝ”๋“œ ํŒŒ์ผ๊ณผ ๋ณ€์ˆ˜ ํŒŒ์ผ), ๊ธฐ๋ณธ ์ž‘์—…๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” '๋ฃจํŠธ ๋ชจ๋“ˆ', ํ˜ธ์ถœ ๋ชจ๋“ˆ์€ '์ž์‹ ๋ชจ๋“ˆ'
cd 03.start/

# plan ์‹คํ–‰ ์‹œ ์—๋Ÿฌ ์ถœ๋ ฅ > ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ ์˜๋ฏธ๋Š”?
terraform plan
โ”‚ Error: Inconsistent dependency lock file
โ”‚
โ”‚ The following dependency selections recorded in the lock file are inconsistent with the current configuration:
โ”‚   - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected
โ”‚
โ”‚ To make the initial dependency selections that will initialize the dependency lock file, run:
โ”‚   terraform init

# ์ดˆ๊ธฐํ™” : ์ฝ”๋“œ ์‚ฌ์šฉ ๊ตฌ๋ฌธ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ ํ”„๋กœ๋ฐ”์ด๋” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ๊ณ  ์„ค์น˜, ์ถ”๊ฐ€๋กœ 'ํ”„๋กœ๋ฐ”์ด๋”/๋ชจ๋“ˆ/๋ฐฑ์—”๋“œ' ๊ตฌ์„ฑ ์„ค์ •/๋ณ€๊ฒฝ ์‹œ ์ˆ˜ํ–‰ ํ•„์š”
terraform init
ls -al
tree .terraform  # VS Code์—์„œ ํƒ์ƒ‰๊ธฐ ํ™•์ธ

plan ๊ณ„ํš & apply ์‹คํ–‰

  • terraform plan ๋ช…๋ น์€ ํ…Œ๋ผํผ์œผ๋กœ ์ ์šฉํ•  ์ธํ”„๋ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๊ด€ํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•˜๋Š” ๋™์ž‘. ๋˜ํ•œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์—ฌ ์–ด๋–ค ๋ณ€๊ฒฝ์ด ์ ์šฉ๋ ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๋ฆฌ ๊ฒ€ํ† ํ•˜๊ณ  ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์„ ์คŒ.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ์ ์šฉํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ, ์ ์šฉ ์ „์— ์˜ˆ์ƒํ•œ ๊ตฌ์„ฑ์ด ๋งž๋Š”์ง€ ๊ฒ€ํ† 

  • terraform apply ๋Š” plan ๊ณ„ํš์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰.

# plan ์‹คํ–‰ : ๊ตฌ์„ฑ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”์ง€ ์ƒ์„ธ ๋‚ด์—ญ ์ถœ๋ ฅ, ๊ธฐ๋ณธ๊ฐ’ ์ž๋™ ์ž…๋ ฅ ์ ์šฉ
terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # local_file.abc will be created
  + resource "local_file" "abc" {
      + content              = "abc!"
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./abc.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy. # ํ•˜๋‚˜์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์€ ์—†์„ ์˜ˆ์ •

-detailed-exitcode : plan ์ถ”๊ฐ€ ์˜ต์…˜์œผ๋กœ, ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ, exitcode๊ฐ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋จ

-auto-approve ์ž๋™ ์Šน์ธ ๊ธฐ๋Šฅ ๋ถ€์—ฌ ์˜ต์…˜

# plan ๊ฒฐ๊ณผ๋ฅผ ์‹œ์Šคํ…œ ์ฝ”๋“œ๋กœ ์ถœ๋ ฅ
terraform plan -detailed-exitcode
...

# ์ฝ”๋“œ ํ™•์ธ : 0(๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๋Š” ์„ฑ๊ณต), 1(์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ), 2(๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ์„ฑ๊ณต)
echo $?
2

# (์ฐธ๊ณ ) apply ๊ฒฐ๊ณผ์— ์ ์šฉ ์‹œ๋„
terraform apply -auto-approve -detailed-exitcode

apply

# apply ์‹คํ–‰ : no ์ž…๋ ฅ
terraform apply
...
Enter a value: no
...

# plan ๊ฒฐ๊ณผ๋ฅผ ์ง€์ •๋œ ํŒŒ์ผ(๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ) ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ
terraform plan -out=tfplan
cat tfplan
file tfplan

# apply ์‹คํ–‰ : ์‹คํ–‰๊ณ„ํš์ด ์žˆ์œผ๋ฏ€๋กœ ์ฆ‰์‹œ ์ ์šฉ๋จ
terraform apply tfplan
ls -al abc.txt

# apply ์‹คํ–‰ : ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?
# ํ…Œ๋ผํผ์€ ์„ ์–ธ์  ๊ตฌ์„ฑ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด๋กœ ๋ฉฑ๋“ฑ์„ฑ idempotence์„ ๊ฐ–๊ณ , ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
terraform apply
...

terraform state list

์ฝ”๋“œ ํŒŒ์ผ ์ˆ˜์ •

resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}

resource "local_file" "dev" {
  content  = "def!"
  filename = "${path.module}/def.txt"
}

์‹คํ–‰

# apply ์‹คํ–‰ : ๋ณ€๊ฒฝ(์‹ ๊ทœ ์ถ”๊ฐ€) ๋ถ€๋ถ„๋งŒ ๋ฐ˜์˜ ํ™•์ธ
terraform apply
...
# local_file.dev will be created
  + resource "local_file" "dev" {
...
Enter a value: yes

# ํ™•์ธ
terraform state list
tree
ls *.txt

# ๋ณ€๊ฒฝ ์ด์ „์˜ ์‹คํ–‰ ๊ณ„ํš ์ ์šฉ ์‹œ๋„ > ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
terraform apply tfplan
...

๋‹ค์‹œ ์ถ”๊ฐ€ ์ฝ”๋“œ ๋‚ด์šฉ์„ ์‚ญ์ œ

resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}

์‹คํ–‰
ํ…Œ๋ผํผ์€ ์„ ์–ธ์ „์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ์ฝ”๋“œ ์ƒํƒœ์™€ ์ ์šฉํ•  ์ƒํƒœ๋ฅผ ๋น„๊ตํ•ด ์ผ์น˜์‹œํ‚ค๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰

# ์‹คํ–‰ > ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?
terraform apply
...
Enter a value: yes
...

# ํ™•์ธ
terraform state list
tree
ls *.txt

-replace : ํ”„๋กœ๋น„์ €๋‹์ด ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ž์— ํ•„์š”์— ์˜ํ•ด ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ. plan, apply ๋ชจ๋‘ ์ ์šฉ ๊ฐ€๋Šฅ

destroy ์ œ๊ฑฐ & fmt
ํ…Œ๋ผํผ ๊ตฌ์„ฑ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์–ด โ† ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค๋งŒ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋  ๊นŒ์š”?

#
terraform destroy
...
Enter a value: yes
...

# ํ™•์ธ
terraform state list
ls *.txt

fmt
format ๋˜๋Š” reformat ์ค„์ž„ ํ‘œ์‹œ๋กœ terraform tmt ๋ช…๋ น์–ด๋กœ ์ˆ˜ํ–‰, ํ…Œ๋ผํผ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ‘œ์ค€ ํ˜•์‹๊ณผ ํ‘œ์ค€ ์Šคํƒ€์ผ๋กœ ์ ์šฉ. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๋†’์ž„

# ์ ์šฉ ํ›„ ์ฝ”๋“œ ํŒŒ์ผ ๋‚ด์šฉ ํ™•์ธ -> ๋“ค์—ฌ์“ฐ๊ธฐ ํ™•์ธ
terraform fmt

โœ… 3.2 HCL

HCL HashiCorp Configuration Language์€ ํ•˜์‹œ์ฝ”ํ”„์‚ฌ์—์„œ IaC์™€ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ

HCL ํŠน์ง•

  • IaC๋Š” ์ˆ˜๋™ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ธํ”„๋ผ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ”„๋กœ๋น„์ €๋‹ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•จ
  • ํ…Œ๋ผํผ์—์„œ HCL์ด ์ฝ”๋“œ์˜ ์˜์—ญ์„ ๋‹ด๋‹นํ•œ๋‹ค. HCL์€ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์˜ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.
  • ์ธํ”„๋ผ๊ฐ€ ์ฝ”๋“œ๋กœ ํ‘œํ˜„๋˜๊ณ , ์ด ์ฝ”๋“œ๋Š” ๊ณง ์ธํ”„๋ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ์ (declarative) ํŠน์„ฑ์„ ๊ฐ–๊ฒŒ ๋˜๊ณ  ํŠœ๋ง ์™„์ „ํ•œ Turing-complete ์–ธ์–ด์  ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค. [์ฐธ๊ณ : ํŠœ๋ง์™„์ „]
  • ์ฆ‰, ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์กฐ๊ฑด๋ฌธ ์ฒ˜๋ฆฌ ๊ฐ™์€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž๋™ํ™”์™€ ๋”๋ถˆ์–ด, ์‰ฝ๊ฒŒ ๋ฒ„์ €๋‹ํ•ด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•จ๊ป˜ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณต.
  • HCL์—์„œ ๋ณ€์ˆ˜์™€ ๋ฌธ์ž์—ด ๊ฐ’์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํด๋ ˆ์ด์…˜ interpolation ํ‘œํ˜„ ๋ฐฉ์‹์„, JSON์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ IaC ๋„๊ตฌ์™€ ๋น„๊ต

HCL์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • JSON๊ณผ YAML ์€ ๊ธฐ๊ณ„ ์นœํ™”์ ์ธ ์–ธ์–ด๋กœ ์ œ์ž‘.
  • HCL์€ JSON์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. (JSON ๋Œ€๋น„ 50~70% ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ๊ฐ€๋Šฅ)
  • JSON์€ ๊ตฌ๋ฌธ์ด ๊ธธ์–ด์ง€๊ณ  ์ฃผ์„์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ.

โœ… 3.3 ํ…Œ๋ผํผ ๋ธ”๋ก

ํ…Œ๋ผํผ ๋ธ”๋ก : ํ…Œ๋ผํผ ๊ตฌ์„ฑ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

  • ํ…Œ๋ผํผ ๋ฒ„์ „์ด๋‚˜ ํ”„๋กœ๋ฐ”์ด๋” ๋ฒ„์ „๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค์€ ์ž๋™์œผ๋กœ ์„ค์ •๋˜์ง€๋งŒ, ํ•จ๊ป˜ ์ž‘์—…ํ•  ๋•Œ๋Š” ๋ฒ„์ „์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ํ•„์š”ํ•œ ์กฐ๊ฑด์„ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™” ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. [Docs] [Docs ์˜ˆ์ œ]
  • ์˜ค๋Š˜ ์‹คํ–‰ํ•˜๋˜, 3๋…„ ํ›„์— ์‹คํ–‰ํ•˜๋˜ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค! (Desired State + Immutable)
terraform {
  required_version = "~> 1.3.0" # ํ…Œ๋ผํผ ๋ฒ„์ „

  required_providers { # ํ”„๋กœ๋ฐ”์ด๋” ๋ฒ„์ „์„ ๋‚˜์—ด
    random = {
      version = ">= 3.0.0, < 3.1.0"
    }
    aws = {
      version = "4.2.0"
    }
  }

  cloud { # Cloud/Enterprise ๊ฐ™์€ ์›๊ฒฉ ์‹คํ–‰์„ ์œ„ํ•œ ์ •๋ณด [์ฐธ๊ณ : Docs]
    organization = "<MY_ORG_NAME>"
    workspaces {
      name = "my-first-workspace"
    }
  }

  backend "local" { # state๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ง€์ • [์ฐธ๊ณ : Docs, local, remote, s3]
    path = "relative/path/to/terraform.tfstate"
  }
}
  • ํ…Œ๋ผํผ ๋‚ด์—์„œ ๋ฒ„์ „์ด ๋ช…์‹œ๋˜๋Š” terraform, module์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ๋‘ ์œผ๋กœ์จ ํ…Œ๋ผํผ, ํ”„๋กœ๋ฐ”์ด๋”, ๋ชจ๋“ˆ์ด ํ•ญ์ƒ ์˜๋„ํ•œ ์ •์˜๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.
  • ๋ฒ„์ „ ์ฒด๊ณ„๋Š” ์‹œ๋งจํ‹ฑ ๋ฒ„์ „ ๊ด€๋ฆฌ Semantic Versioning(SemVer) ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค [์ฐธ๊ณ ], [Kubernetes Release Versioning]

์‹œ๋งจํ‹ฑ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐฉ์‹

  • Major ๋ฒ„์ „ : ๋‚ด๋ถ€ ๋™์ž‘์˜ API๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ํ•˜์œ„ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „

  • Minor ๋ฒ„์ „ : ์‹ ๊ทœ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๊ฐœ์„ ๋˜๊ณ  ํ•˜์œ„ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „

  • Patch ๋ฒ„์ „ : ๋ฒ„๊ทธ ๋ฐ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ๊ฐœ์„ ๋œ ํ•˜์œ„ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „

  • ๋ฒ„์ „ ์ œ์•ฝ ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด์—์„œ์˜ ์ข…์†์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ ํก์‚ฌํ•˜๋‹ค.
    • = ๋˜๋Š” ์—ฐ์‚ฐ์ž ์—†์Œ : ์ง€์ •๋œ ๋ฒ„์ „๋งŒ์„ ํ—ˆ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ์กฐ๊ฑด๊ณผ ๋ณ‘๊ธฐํ•  ์ˆ˜ ์—†๋‹ค.
    • != : ์ง€์ •๋œ ๋ฒ„์ „์„ ์ œ์™ธํ•œ๋‹ค.
    • >, >=, <, <= : ์ง€์ •๋œ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•ด ์กฐ๊ฑด(๋ถ€๋“ฑํ˜ธ)์— ๋งž๋Š” ๊ฒฝ์šฐ ํ—ˆ์šฉํ•œ๋‹ค.
      • ~> : ์ง€์ •๋œ ๋ฒ„์ „์—์„œ ๊ฐ€์žฅ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๋‚ฎ์€ ๊ตฌ์„ฑ์š”์†Œ๋งŒ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.
        • ~> x.y ์ธ ๊ฒฝ์šฐ y ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ๋งŒ, ~> x.y.z์ธ ๊ฒฝ์šฐ z ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ๋งŒ ๋ณด๋‹ค ํฐ ๋ฒ„์ „์„ ํ—ˆ์šฉํ•œ๋‹ค.

๋ฐฑ์—”๋“œ ๋ธ”๋ก

  • ๋ฐฑ์—”๋“œ ๋ธ”๋ก์˜ ๊ตฌ์„ฑ์€ ํ…Œ๋ผํผ ์‹คํ–‰ ์‹œ ์ €์žฅ๋˜๋Š” State(์ƒํƒœ ํŒŒ์ผ)์˜ ์ €์žฅ ์œ„์น˜๋ฅผ ์„ ์–ธํ•œ๋‹ค. (๊ธฐ๋ณธ: local)
  • ์ฃผ์˜ํ•  ์ ์€ ํ•˜๋‚˜์˜ ๋ฐฑ์—”๋“œ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
  • ํ…Œ๋ผํผ์€ State์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ถ”์ ํ•œ๋‹ค.
  • ์ž‘์—…์ž ๊ฐ„์˜ ํ˜‘์—…์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ํ…Œ๋ผํผ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ ์ €์žฅ ํŒŒ์ผ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  State์—๋Š” ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋ฉด ์•ˆ ๋˜๋Š” ํŒจ์Šค์›Œ๋“œ ๋˜๋Š” ์ธ์ฆ์„œ ์ •๋ณด ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ State์˜ ์ ‘๊ทผ ์ œ์–ด ๋ฐ ์•ˆ์ „ํ•œ ๊ด€๋ฆฌ๋ฐฉ์•ˆ ๋Œ€์ฑ…์ˆ˜๋ฆฝ์ด ํ•„์š”ํ•˜๋‹ค.

State ์ž ๊ธˆ ๋™์ž‘

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜๋Š” ๋ฐฑ์—”๋“œ๋Š” local์ด๋‹ค.
  • ์ƒํƒœ๋ฅผ ์ž‘์—…์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ด ๋ฐ–์˜ ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ž๊ฐ€ ์ ‘๊ทผํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ ๊ฐ™์€ ๊ฐœ๋…์„ ๊ฐ–๋Š”๋‹ค.
  • ๊ณต์œ ๋˜๋Š” ๋ฐฑ์—”๋“œ์— State๊ฐ€ ๊ด€๋ฆฌ๋˜๋ฉด ํ…Œ๋ผํผ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ .terraform.tfstate.lock.info ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉด์„œ ํ•ด๋‹น State๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ž ๊ธˆ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ํŒŒ์ผ ์ƒ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด terraform apply๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒ์„ฑ๋˜๋Š” ์ž ๊ธˆ ํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด์ž. ์ž ๊ธˆ ํŒŒ์ผ ๋‚ด์˜ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


๐Ÿงฉ Assignment

๐Ÿ‘‰ AWS S3/DynamoDB ๋ฐฑ์—”๋“œ

Backend ๊ตฌ์„ฑ์„ ํ†ตํ•ด Terraform์ดย stateย ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ์œ„์น˜๋ฅผ ์ •์˜ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ผํผ์€ tfstate๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์„ ์–ธํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

tfstate์—๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋„ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์—, Github ๋˜๋Š” ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์–ด์žˆ๋Š” ์ฝ”๋“œ ์ €์žฅ์†Œ์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด aws ์„œ๋น„์Šค์ธ S3์™€ DynamoDB๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅย S3 ๋ฐ DynamoDB๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ์˜ ์žฅ์ 

  • ์™„์ „ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค์ด๋ฏ€๋กœ ์šด์˜ ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ GitOps๋กœ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ธํ”„๋ผ ์—ญ์‹œ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ“•ย Backend

๋ณ„๋„์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐฑ์—”๋“œ๋ฅผ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋กœ๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# backend.tf

provider "aws" {
  region = "ap-northeast-2" # Please use the default region ID
}

# S3 ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
resource "aws_s3_bucket" "for_tfstate" {
  bucket = "xgro-tfstate"
}

# S3 ๋ฒ„ํ‚ท์˜ ๋ฒ„์ €๋‹ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ์„ ์–ธํ•œ๋‹ค.
resource "aws_s3_bucket_versioning" "tfstate" {
  bucket = aws_s3_bucket.for_tfstate.bucket

  versioning_configuration {
    status = "Enabled"
  }
}

# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
  name         = "terraform-lock"
  hash_key     = "LockID"
  billing_mode = "PAY_PER_REQUEST"

  attribute {
    name = "LockID"
    type = "S"
  }
}

๐Ÿ“˜ย Workspace

์œ„์—์„œ ๋ฐฑ์—”๋“œ๋ฅผ ์œ„ํ•œ S3, DynamoDB๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ๋ผํผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# main.tf

# Required providers configuration
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.6.0"
    }
  }

  backend "s3" {
    bucket         = "xgro-tfstate"
    key            = "terraform.tfstate"
    region         = "ap-northeast-2"
    dynamodb_table = "terraform-lock"
    encrypt        = true
  }

  required_version = ">= 1.0.11"
}

data "aws_region" "current" {}
data "aws_caller_identity" "current" {}

ํ…Œ์ŠคํŠธ๋Š” vpc ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„ ๋ฐ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

# vpc.tf

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "final_mon1-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["ap-northeast-2a", "ap-northeast-2b"]
  private_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
  public_subnets  = ["10.0.1.0/24"]

  enable_nat_gateway = false
  enable_vpn_gateway = false
  tags = {
    Terraform   = "true"
    Environment = "dev"
  }
}

terraform.tfstate ํŒŒ์ผ์ด s3์— ์ €์žฅ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ผํผ์œผ๋กœ ์ƒ์„ฑ๋œ vpc๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Reference

profile
์•ˆ๋…•ํ•˜์„ธ์š”! DevOps ์—”์ง€๋‹ˆ์–ด ์ด์žฌ์ฐฌ์ž…๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์ˆ , ๊ฐœ๋ฐœ, ์šด์˜์— ๊ด€ํ•œ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ํ•จ๊ป˜ ๋‚˜๋ˆ„๋ฉฐ, ๋” ๋‚˜์€ ํ˜‘์—…๊ณผ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์—ฌํ–‰ํ•˜๋Š” ๊ธฐ๋ถ„์œผ๋กœ, ์ฆ๊ฒ๊ฒŒ ์ฝ์–ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

0๊ฐœ์˜ ๋Œ“๊ธ€