[t1013] Terraform Basics 2/3

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

Terraform

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

๐Ÿ“Œ Notice

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

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

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


๐Ÿ“Œ Summary

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

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

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

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



๐Ÿ“Œ Study

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

โœ… 3.5 ๋ฐ์ดํ„ฐ ์†Œ์Šค

๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ํ…Œ๋ผํผ์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ์ €์žฅ๋œ ์ •๋ณด๋ฅผ ํ…Œ๋ผํผ ๋‚ด์—์„œ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ตฌ์„ฑ

๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ธ”๋ก์€ data๋กœ ์‹œ์ž‘, ์ดํ›„ โ€˜๋ฐ์ดํ„ฐ ์†Œ์Šค ์œ ํ˜•โ€™์„ ์ •์˜ โ† Resource ๋ธ”๋ก ์ •์˜์™€ ์œ ์‚ฌ

๋ฐ์ดํ„ฐ ์†Œ์Šค ์œ ํ˜•์€ ์ฒซ ๋ฒˆ์งธ _๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์€ ํ”„๋กœ๋ฐ”์ด๋” ์ด๋ฆ„, ๋’ค๋Š” ํ”„๋กœ๋ฐ”์ด๋”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์œ ํ˜•์„ ์˜๋ฏธํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์†Œ์Šค ์œ ํ˜•์„ ์„ ์–ธํ•œ ๋’ค์—๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฆ„์€ ๋™์ผํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ์‹๋ณ„์ž ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค.

์ด๋ฆ„ ๋’ค์—๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์ธ์ˆ˜๋“ค์€ { } ์•ˆ์— ์„ ์–ธํ•œ๋‹ค. ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ ํ˜•๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋•Œ์—๋„ { } ๋Š” ์ž…๋ ฅํ•œ๋‹ค

data "local_file" "abc" {
  filename = "${path.module}/abc.txt"
}

๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”ํƒ€์ธ์ˆ˜

  • depends_on : ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋ฉฐ, ์„ ์–ธ๋œ ๊ตฌ์„ฑ์š”์†Œ์™€์˜ ์ƒ์„ฑ ์‹œ์ ์— ๋Œ€ํ•ด ์ •์˜
  • count : ์„ ์–ธ๋œ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
  • for_each : map ๋˜๋Š” set ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
  • lifecycle : ๋ฆฌ์†Œ์Šค์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ

๋ฐ์ดํ„ฐ ์†Œ์Šค ์†์„ฑ ์ฐธ์กฐ
๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ฝ์€ ๋Œ€์ƒ์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฆฌ์†Œ์Šค์™€ ๊ตฌ๋ณ„๋˜๊ฒŒ data๊ฐ€ ์•ž์— ๋ถ™๋Š”๋‹ค. ์†์„ฑ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

# Terraform Code
data "<๋ฆฌ์†Œ์Šค ์œ ํ˜•>" "<์ด๋ฆ„>" {
  <์ธ์ˆ˜> = <๊ฐ’>
}

# ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ฐธ์กฐ
data.<๋ฆฌ์†Œ์Šค ์œ ํ˜•>.<์ด๋ฆ„>.<์†์„ฑ>

โœ… 3.6 ์ž…๋ ฅ ๋ณ€์ˆ˜ Variable

์ž…๋ ฅ ๋ณ€์ˆ˜๋Š” ์ธํ”„๋ผ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์†์„ฑ ๊ฐ’์„ ์ •์˜ํ•ด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ์—ฌ๋Ÿฌ ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ผํผ์—์„œ๋Š” ์ด๊ฒƒ์„ ์ž…๋ ฅ ๋ณ€์ˆ˜ Input Variables๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹

๋ณ€์ˆ˜๋Š” variable๋กœ ์‹œ์ž‘๋˜๋Š” ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ๋ธ”๋ก ๋’ค์˜ ์ด๋ฆ„ ๊ฐ’์€ ๋™์ผ ๋ชจ๋“ˆ ๋‚ด ๋ชจ๋“  ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋‚ด์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# variable ๋ธ”๋ก ์„ ์–ธ์˜ ์˜ˆ
variable "<์ด๋ฆ„>" {
 <์ธ์ˆ˜> = <๊ฐ’>
}

variable "image_id" {
 type = string
}

ํ…Œ๋ผํผ ์˜ˆ์•ฝ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
source, version, providers, count, for_each, lifecycle, depends_on, locals

๋ณ€์ˆ˜ ์ •์˜ ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”ํƒ€์ธ์ˆ˜

  • default : ๋ณ€์ˆ˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ์ „๋‹ฌ๋จ, ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฉด ๋Œ€ํ™”์‹์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฌผ์–ด๋ด„
  • type : ๋ณ€์ˆ˜์— ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’ ์œ ํ˜• ์ •์˜, string number bool list map set object tuple ์™€ ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด any ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผ
  • description : ์ž…๋ ฅ ๋ณ€์ˆ˜์˜ ์„ค๋ช…
  • validation : ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™์„ ์ •์˜ - ๋งํฌ
  • sensitive : ๋ฏผ๊ฐํ•œ ๋ณ€์ˆ˜ ๊ฐ’์ž„์„ ์•Œ๋ฆฌ๊ณ  ํ…Œ๋ผํผ์˜ ์ถœ๋ ฅ๋ฌธ์—์„œ ๊ฐ’ ๋…ธ์ถœ์„ ์ œํ•œ (์•”ํ˜ธ ๋“ฑ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ) - ๋งํฌ
  • nullable : ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†์–ด๋„ ๋จ์„ ์ง€์ •

๋ณ€์ˆ˜ ์œ ํ˜• : ์ง€์›๋˜๋Š” ๋ณ€์ˆ˜์˜ ๋ฒ”์ฃผ์™€ ํ˜•ํƒœ

๊ธฐ๋ณธ ์œ ํ˜•

  • string : ๊ธ€์ž ์œ ํ˜•
  • number : ์ˆซ์ž ์œ ํ˜•
  • bool : true ๋˜๋Š” false
  • any : ๋ช…์‹œ์ ์œผ๋กœ ๋ชจ๋“  ์œ ํ˜•์ด ํ—ˆ์šฉ๋จ์„ ํ‘œ์‹œ

์ง‘ํ•ฉ ์œ ํ˜•

  • list (<์œ ํ˜•>): ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ง‘ํ•ฉ
  • map (<์œ ํ˜•>): ๊ฐ’ = ์†์„ฑ ๊ธฐ๋ฐ˜ ์ง‘ํ•ฉ์ด๋ฉฐ ํ‚ค๊ฐ’ ๊ธฐ์ค€ ์ •๋ ฌ
  • set (<์œ ํ˜•>): ๊ฐ’ ๊ธฐ๋ฐ˜ ์ง‘ํ•ฉ์ด๋ฉฐ ์ •๋ ฌ ํ‚ค๊ฐ’ ๊ธฐ์ค€ ์ •๋ ฌ
  • object ({<์ธ์ˆ˜ ์ด๋ฆ„>=<์œ ํ˜•>, โ€ฆ})
  • tuple ([<์œ ํ˜•>, โ€ฆ])
    • list์™€ set์€ ์„ ์–ธํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋น„์Šทํ•˜์ง€๋งŒ ์ฐธ์กฐ ๋ฐฉ์‹์ด ์ธ๋ฑ์Šค์™€ ํ‚ค๋กœ ๊ฐ๊ฐ ์ฐจ์ด๊ฐ€ ์žˆ๊ณ , map์™€ set์˜ ๊ฒฝ์šฐ ์„ ์–ธ๋œ ๊ฐ’์ด ์ •๋ ฌ๋˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ : ์ž…๋ ฅ๋˜๋Š” ๋ณ€์ˆ˜ ํƒ€์ž… ์ง€์ • ์ด์™ธ, ์‚ฌ์šฉ์ž ์ง€์ • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅ

  • ๋ณ€์ˆ˜ ๋ธ”๋ก ๋‚ด์— validation ๋ธ”๋ก์—์„œ ์กฐ๊ฑด์ธ condition์— ์ง€์ •๋˜๋Š” ๊ทœ์น™์ด true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, error_message๋Š” condition ๊ฐ’์˜ ๊ฒฐ๊ณผ๊ฐ€ false ์ธ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • regex ํ•จ์ˆ˜๋Š” ๋Œ€์ƒ์˜ ๋ฌธ์ž์—ด์— ์ •๊ทœ์‹์„ ์ ์šฉํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์— can ํ•จ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ •๊ทœ์‹์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœํ•œ๋‹ค.
  • validation ๋ธ”๋ก์€ ์ค‘๋ณต์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • variable ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์˜ ์˜ˆ - main.tf ์ฝ”๋“œ ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ •

๋ฏผ๊ฐํ•œ ๋ณ€์ˆ˜ ์ทจ๊ธ‰ : ์ž…๋ ฅ ๋ณ€์ˆ˜์˜ ๋ฏผ๊ฐ ์—ฌ๋ถ€ ์„ ์–ธ ๊ฐ€๋Šฅ

main.tf ์ฝ”๋“œ ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ •

  • ๊ธฐ๋ณธ๊ฐ’ ์ถ”๊ฐ€๋กœ ์ž…๋ ฅ ํ•ญ๋ชฉ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ์ถœ๋ ฅ์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋ณ€์ˆ˜ ๊ฐ’์ด(sensitive)๋กœ ๊ฐ์ถฐ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

    variable "my_password" {
      default   = "password"
      **sensitive = true**
    }
    
    resource "local_file" "abc" {
      content  = var.my_password
      filename = "${path.module}/abc.txt"
    }
  • ํ™•์ธ : ๋ฏผ๊ฐํ•œ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด๋„ terraform.tfstate ํŒŒ์ผ์—๋Š” ๊ฒฐ๊ณผ๋ฌผ์ด ํ‰๋ฌธ์œผ๋กœ ๊ธฐ๋ก๋˜๋ฏ€๋กœ State ํŒŒ์ผ์˜ ๋ณด์•ˆ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. [์ฐธ๊ณ  Docs - sensitive-variables , State ์•”ํ˜ธํ™”]

# ์ถœ๋ ฅ๋ถ€๋ถ„์— ๋‚ด์šฉ ์•ˆ๋ณด์ž„!
terraform apply -auto-approve
terraform state show local_file.abc

# ๊ฒฐ๊ณผ๋ฌผ ํŒŒ์ผ ํ™•์ธ
cat abc.txt ; echo

# terraform.tfstate ํŒŒ์ผ ํ™•์ธ
cat terraform.tfstate | grep '"content":'
            "content": "password",

๋ณ€์ˆ˜ ์ž…๋ ฅ ๋ฐฉ์‹๊ณผ ์šฐ์„ ์ˆœ์œ„

  • variable์˜ ๋ชฉ์ ์€ ์ฝ”๋“œ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ํ…Œ๋ผํผ์˜ ๋ชจ๋“ˆ์  ํŠน์„ฑ์„ ํ†ตํ•ด ์ž…๋ ฅ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์žˆ๋‹ค.
  • ํŠนํžˆ ์ž…๋ ฅ ๋ณ€์ˆ˜๋ผ๋Š” ๋ช…์นญ์— ๋งž๊ฒŒ ์‚ฌ์šฉ์ž๋Š” ํ”„๋กœ๋น„์ €๋‹ ์‹คํ–‰ ์‹œ์— ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณ€์ˆ˜์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ ์–ธ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋ณ€์ˆ˜์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ ํ™˜๊ฒฝ๊ณผ ๋นŒ๋“œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ์˜ ์ •์˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ๋น„์ €๋‹ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

[์šฐ์„ ์ˆœ์œ„ ์ˆ˜์ค€]์˜ ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๋„ ๋‚ฎ๋‹ค.


โœ… 3.7 local ์ง€์—ญ ๊ฐ’

์ฝ”๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ฐ’ ๋˜๋Š” ์†์„ฑ ๊ฐ’์„ ๊ฐ€๊ณตํ•ด ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ local (์ง€์—ญ ๊ฐ’)์€ ์™ธ๋ถ€์—์„œ ์ž…๋ ฅ๋˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ ๋‚ด์—์„œ๋งŒ ๊ฐ€๊ณต๋˜์–ด ๋™์ž‘ํ•˜๋Š” ๊ฐ’์„ ์„ ์–ธํ•œ๋‹ค.

local์€ ์ž…๋ ฅ ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ์„ ์–ธ๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‹คํ–‰ ์‹œ์— ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

๋กœ์ปฌ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ๋ผํผ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ’์ด๋‚˜ ํ‘œํ˜„์‹์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ๊ฐ’์— ๋Œ€ํ•œ ์ถ”์ ์ด ์–ด๋ ค์›Œ์ ธ ์œ ์ง€ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋กœ์ปฌ์ด ์„ ์–ธ๋˜๋Š” ๋ธ”๋ก์€ locals๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์„ ์–ธ๋˜๋Š” ์ธ์ˆ˜์— ํ‘œํ˜„๋˜๋Š” ๊ฐ’์€ ์ƒ์ˆ˜๋งŒ์ด ์•„๋‹Œ ๋ฆฌ์†Œ์Šค์˜ ์†์„ฑ, ๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค๋„ ์กฐํ•ฉํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์ผํ•œ tf ํŒŒ์ผ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ณ  ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๊ฑธ์ณ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค๋งŒ lcoals์— ์„ ์–ธํ•œ ๋กœ์ปฌ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์ „์ฒด ๋ฃจํŠธ ๋ชจ๋“ˆ ๋‚ด์—์„œ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค.

์ •์˜๋˜๋Š” ์†์„ฑ ๊ฐ’์€ ์ง€์ •๋œ ๊ฐ’์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์œ ํ˜•์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

local ์ฐธ์กฐ

  • ์„ ์–ธ๋œ local ๊ฐ’์€ local.<์ด๋ฆ„>์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ…Œ๋ผํผ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์„ ์–ธ๋˜์–ด ์žˆ๋”๋ผ๋„ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ… 3.8 ์ถœ๋ ฅ output

์ถœ๋ ฅ ๊ฐ’์€ ์ฃผ๋กœ ํ…Œ๋ผํผ ์ฝ”๋“œ์˜ ํ”„๋กœ๋น„์ €๋‹ ์ˆ˜ํ–‰ ํ›„์˜ ๊ฒฐ๊ณผ ์†์„ฑ ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ฝ”๋“œ ๋‚ด ์š”์†Œ ๊ฐ„์— ์ œํ•œ๋œ ๋…ธ์ถœ์„ ์ง€์›ํ•˜๋“ฏ, ํ…Œ๋ผํผ ๋ชจ๋“ˆ ๊ฐ„, ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์š”์†Œ๋กœ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ž๋ฐ”์˜ getter์™€ ๋น„์Šทํ•œ ์—ญํ• ์ด๋‹ค.

์ถœ๋ ฅ ๊ฐ’์˜ ์šฉ๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฃจํŠธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ํŠน์ • ์†์„ฑ ์ถœ๋ ฅ

  • ์ž์‹ ๋ชจ๋“ˆ์˜ ํŠน์ • ๊ฐ’์„ ์ •์˜ํ•˜๊ณ  ๋ฃจํŠธ ๋ชจ๋“ˆ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ชจ๋“ˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์›๊ฒฉ์œผ๋กœ ์ฝ๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ ์š”์†Œ

๋ชจ๋“ˆ ๋‚ด์—์„œ ์ƒ์„ฑ๋˜๋Š” ์†์„ฑ ๊ฐ’๋“ค์€ output ๋ธ”๋ก์— ์ •์˜๋œ๋‹ค

output "instance_ip_addr" {
  value = "http://${aws_instance.server.private_ip}"
}

์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์€ value์˜ ๊ฐ’์ด๋ฉฐ ํ…Œ๋ผํผ์ด ์ œ๊ณตํ•˜๋Š” ์กฐํ•ฉ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์ธ ๊ธฐ๋Šฅ๋“ค์— ์˜ํ•ด ์›ํ•˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ output ๊ฒฐ๊ณผ์—์„œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ํ›„ ๊ฒฐ์ •๋˜๋Š” ์†์„ฑ ๊ฐ’์€ ํ”„๋กœ๋น„์ €๋‹์ด ์™„๋ฃŒ๋˜์–ด์•ผ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  terraform plan ๋‹จ๊ณ„์—์„œ๋Š” ์ ์šฉ๋  ๊ฐ’์ด ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ณ€์ˆ˜ ์ •์˜ ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”ํƒ€์ธ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • description : ์ถœ๋ ฅ ๊ฐ’ ์„ค๋ช…
  • sensitive : ๋ฏผ๊ฐํ•œ ์ถœ๋ ฅ ๊ฐ’์ž„์„ ์•Œ๋ฆฌ๊ณ  ํ…Œ๋ผํผ์˜ ์ถœ๋ ฅ๋ฌธ์—์„œ ๊ฐ’ ๋…ธ์ถœ์„ ์ œํ•œ
  • depends_on : value์— ๋‹ด๊ธธ ๊ฐ’์ด ํŠน์ • ๊ตฌ์„ฑ์— ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ž„์˜๋กœ ์กฐ์ •
  • precondition : ์ถœ๋ ฅ ์ „์— ์ง€์ •๋œ ์กฐ๊ฑด์„ ๊ฒ€์ฆ

โœ… 3.9 ๋ฐ˜๋ณต๋ฌธ

list ํ˜•ํƒœ์˜ ๊ฐ’ ๋ชฉ๋ก์ด๋‚˜ Key-Value ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด ์ง‘ํ•ฉ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด ํ…Œ๋ผํผ ๊ตฌ์„ฑ ์ •์˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

count : ๋ฐ˜๋ณต๋ฌธ, ์ •์ˆ˜ ๊ฐ’๋งŒํผ ๋ฆฌ์†Œ์Šค๋‚˜ ๋ชจ๋“ˆ์„ ์ƒ์„ฑ

  • ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ชจ๋“ˆ ๋ธ”๋ก์— count ๊ฐ’์ด ์ •์ˆ˜์ธ ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์„ ์–ธ๋œ ์ •์ˆ˜ ๊ฐ’๋งŒํผ ๋ฆฌ์†Œ์Šค๋‚˜ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

  • count์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ฐธ์กฐ ๊ฐ’์€ count.index์ด๋ฉฐ, ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•ด ์ธ๋ฑ์Šค๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค.

๋•Œ๋•Œ๋กœ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋‚˜ ๋ชจ๋“ˆ์˜ count๋กœ ์ง€์ •๋˜๋Š” ์ˆ˜๋Ÿ‰์ด ๋™์ผํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ count์— ๋ถ€์—ฌ๋˜๋Š” ์ •์ˆ˜ ๊ฐ’์„ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์‹๋ณ„๋˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

for_each : ๋ฐ˜๋ณต๋ฌธ, ์„ ์–ธ๋œ key ๊ฐ’ ๊ฐœ์ˆ˜๋งŒํผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ชจ๋“ˆ ๋ธ”๋ก์—์„œ for_each์— ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๊ฐ€ map ๋˜๋Š” set์ด๋ฉด, ์„ ์–ธ๋œ key ๊ฐ’ ๊ฐœ์ˆ˜๋งŒํผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

for_each๊ฐ€ ์„ค์ •๋œ ๋ธ”๋ก์—์„œ๋Š” each ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

  • each.key : ์ด ์ธ์Šคํ„ด์Šค์— ํ•ด๋‹นํ•˜๋Š” map ํƒ€์ž…์˜ key ๊ฐ’
  • each.value : ์ด ์ธ์Šคํ„ด์Šค์— ํ•ด๋‹นํ•˜๋Š” map์˜ value ๊ฐ’

์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ์šฐ <๋ฆฌ์†Œ์Šค ํƒ€์ž…>.<์ด๋ฆ„>, ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ module.<๋ชจ๋“ˆ ์ด๋ฆ„>๋กœ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค.

์ด ์ฐธ์กฐ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ๊ฐ„ ์ข…์†์„ฑ์„ ์ •์˜ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ถœ๋ ฅ์„ ์œ„ํ•œ ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

for : ๋ณตํ•ฉ ํ˜•์‹ ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ. - for_each์™€ ๋‹ค๋ฆ„

์˜ˆ๋ฅผ ๋“ค์–ด list ๊ฐ’์˜ ํฌ๋งท์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ ‘๋‘์‚ฌ prefix๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , output์— ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ˜๋ณต์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

  • list ํƒ€์ž…์˜ ๊ฒฝ์šฐ ๊ฐ’ ๋˜๋Š” ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ๋ฐ˜ํ™˜
  • map ํƒ€์ž…์˜ ๊ฒฝ์šฐ ํ‚ค ๋˜๋Š” ํ‚ค์™€ ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜
  • set ํƒ€์ž…์˜ ๊ฒฝ์šฐ ํ‚ค ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜

for ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. list ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๋ฐ›๋Š” ๊ฐ’์ด ํ•˜๋‚˜๋กœ ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฐ’์„, ๋‘ ๊ฐœ์˜ ๊ฒฝ์šฐ ์•ž์˜ ์ธ์ˆ˜๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋’ค์˜ ์ธ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ - ๊ด€์šฉ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋Š” i, ๊ฐ’์€ v๋กœ ํ‘œํ˜„
  1. map ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๋ฐ›๋Š” ๊ฐ’์ด ํ•˜๋‚˜๋กœ ๋˜์–ด ์žˆ์œผ๋ฉด ํ‚ค๋ฅผ, ๋‘ ๊ฐœ์˜ ๊ฒฝ์šฐ ์•ž์˜ ์ธ์ˆ˜๊ฐ€ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋’ค์˜ ์ธ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ - ๊ด€์šฉ์ ์œผ๋กœ ํ‚ค๋Š” k, ๊ฐ’์€ v๋กœ ํ‘œํ˜„
  1. ๊ฒฐ๊ณผ ๊ฐ’์€ for ๋ฌธ์„ ๋ฌถ๋Š” ๊ธฐํ˜ธ๊ฐ€ [ ]์ธ ๊ฒฝ์šฐ tuple๋กœ ๋ฐ˜ํ™˜๋˜๊ณ  { }์ธ ๊ฒฝ์šฐ object ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
  1. object ํ˜•ํƒœ์˜ ๊ฒฝ์šฐ ํ‚ค์™€ ๊ฐ’์— ๋Œ€ํ•œ ์Œ์€ โ‡’ ๊ธฐํ˜ธ๋กœ ๊ตฌ๋ถ„
    { } ํ˜•์‹์„ ์‚ฌ์šฉํ•ด object ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ‚ค ๊ฐ’์€ ๊ณ ์œ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ’ ๋’ค์— ๊ทธ๋ฃนํ™” ๋ชจ๋“œ ์‹ฌ๋ณผ(โ€ฆ)๋ฅผ ๋ถ™์—ฌ์„œ ํ‚ค์˜ ์ค‘๋ณต์„ ๋ฐฉ์ง€(SQL์˜ group by ๋ฌธ ๋˜๋Š” Java์˜ MultiValueMap๊ณผ ๊ฐ™์€ ๊ฐœ๋…)
    if ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด ์กฐ๊ฑด ๋ถ€์—ฌ ๊ฐ€๋Šฅ

dynamic : ๋ฆฌ์†Œ์Šค ๋‚ด๋ถ€ ์†์„ฑ ๋ธ”๋ก์„ ๋™์ ์ธ ๋ธ”๋ก์œผ๋กœ ์ƒ์„ฑ

count ๋‚˜ for_each ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค ์ „์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์ด์™ธ๋„ ๋ฆฌ์†Œ์Šค ๋‚ด์— ์„ ์–ธ๋˜๋Š” ๊ตฌ์„ฑ ๋ธ”๋ก์„ ๋‹ค์ค‘์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด AWS Security Group ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ์— ingress, egress ์š”์†Œ๊ฐ€ ๋ฆฌ์†Œ์Šค ์„ ์–ธ ๋‚ด๋ถ€์—์„œ ๋ธ”๋ก ํ˜•ํƒœ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ •์˜๋˜๋Š” ๊ฒฝ์šฐ๋‹ค.

๋ฆฌ์†Œ์Šค ๋‚ด์˜ ๋ธ”๋ก ์†์„ฑ(Attributes as Blocks)์€ ๋ฆฌ์†Œ์Šค ์ž์ฒด์˜ ๋ฐ˜๋ณต ์„ ์–ธ์ด ์•„๋‹Œ ๋‚ด๋ถ€ ์†์„ฑ ์š”์†Œ ์ค‘ ๋ธ”๋ก์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ˜๋ณต ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋•Œ dynamic ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด ๋™์ ์ธ ๋ธ”๋ก์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

dynamic ๋ธ”๋ก์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ๊ธฐ์กด ๋ธ”๋ก์˜ ์†์„ฑ ์ด๋ฆ„์„ dynamic ๋ธ”๋ก์˜ ์ด๋ฆ„์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ๊ธฐ์กด ๋ธ”๋ก ์†์„ฑ์— ์ •์˜๋˜๋Š” ๋‚ด์šฉ์„ content ๋ธ”๋ก์— ์ž‘์„ฑํ•œ๋‹ค.

๋ฐ˜๋ณต ์„ ์–ธ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ณต๋ฌธ ๊ตฌ๋ฌธ์€ for_each๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ์กด for_each ์ ์šฉ ์‹œ each ์†์„ฑ์— key, value๊ฐ€ ์ ์šฉ๋˜์—ˆ๋‹ค๋ฉด dynamic์—์„œ๋Š” dynamic์— ์ง€์ •ํ•œ ์ด๋ฆ„์— ๋Œ€ํ•ด ์†์„ฑ์ด ๋ถ€์—ฌ๋œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ธ”๋ก ์†์„ฑ ๋ฐ˜๋ณต ์ ์šฉ ์‹œ

  resource "provider_resource" "name" {
  name = "some_resource"

  some_setting {
    key = a_value
  }

  some_setting {
    key = b_value
  }

  some_setting {
    key = c_value
  }

  some_setting {
    key = d_value
  }
}

dynamic ๋ธ”๋ก ์ ์šฉ ์‹œ

resource "provider_resource" "name" {
  name = "some_resource"

  dynamic "some_setting" {
    for_each = {
      a_key = a_value
      b_key = b_value
      c_key = c_value
      d_key = d_value
    }

    content {
      key = some_setting.value
    }
  }
}


๐Ÿงฉ Assignment

๐Ÿ‘‰ ๋„์ „๊ณผ์ œ 1

๋ชฉํ‘œ - ๋ฆฌ์ „ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์šฉ์˜์—ญ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ VPC ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์‹ค์Šต ์ง„ํ–‰ - ๋งํฌ ํ˜น์€ ์•„๋ฌด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์‹ค์Šต ์ง„ํ–‰

VPC ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
data๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํƒœ๊ทธ ๊ฐ’์„ ๊ฐ€์ง„ VPC์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data "aws_vpcs" "foo" {
  tags = {
    Terraform = "true"
  }
}

output "foo" {
  value = data.aws_vpcs.foo.ids
}

๊ฒฐ๊ณผ


๐Ÿ‘‰ ๋„์ „๊ณผ์ œ 2

๋ชฉํ‘œ - ์œ„ 3๊ฐœ ์ฝ”๋“œ ํŒŒ์ผ ๋‚ด์šฉ์— ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„(myvpc, mysubnet1 ๋“ฑ)์„ ๋ฐ˜๋“œ์‹œ! ๊ผญ! ์ž์‹ ์˜ ๋‹‰๋„ค์ž„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋ฐฐํฌ ์‹ค์Šตํ•ด๋ณด์„ธ์š”!

my* ๋กœ ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋ณ€๊ฒฝํ•˜์—ฌ AWS์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "xgro_vpc" {
  cidr_block       = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "xgro-t1013-study"
  }
}

resource "aws_subnet" "xgro_subnet1" {
  vpc_id     = aws_vpc.xgro_vpc.id
  cidr_block = "10.10.1.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "t101-subnet1"
  }
}

resource "aws_subnet" "xgro_subnet2" {
  vpc_id     = aws_vpc.xgro_vpc.id
  cidr_block = "10.10.2.0/24"

  availability_zone = "ap-northeast-2c"

  tags = {
    Name = "t101-subnet2"
  }
}


resource "aws_internet_gateway" "xgro_igw" {
  vpc_id = aws_vpc.xgro_vpc.id

  tags = {
    Name = "t101-igw"
  }
}

resource "aws_route_table" "xgro_rt" {
  vpc_id = aws_vpc.xgro_vpc.id

  tags = {
    Name = "t101-rt"
  }
}

resource "aws_route_table_association" "xgro_rtassociation1" {
  subnet_id      = aws_subnet.xgro_subnet1.id
  route_table_id = aws_route_table.xgro_rt.id
}

resource "aws_route_table_association" "xgro_rtassociation2" {
  subnet_id      = aws_subnet.xgro_subnet2.id
  route_table_id = aws_route_table.xgro_rt.id
}

resource "aws_route" "xgro_defaultroute" {
  route_table_id         = aws_route_table.xgro_rt.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.xgro_igw.id
}

output "aws_vpc_id" {
  value = aws_vpc.xgro_vpc.id
}

๊ฒฐ๊ณผ

VScode Console์—์„œ apply๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AWS Console์—์„œ ํ…Œ๋ผํผ์œผ๋กœ ์‹คํ–‰ํ•œ VPC๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐฐํฌ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘‰ ๋„์ „๊ณผ์ œ 3

๋ชฉํ‘œ - ์ž…๋ ฅ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค(์–ด๋–ค ๋ฆฌ์†Œ์Šค๋“ ์ง€ ์ƒ๊ด€์—†์Œ)๋ฅผ ๋ฐฐํฌํ•ด๋ณด๊ณ , ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ์„ธ์š”!

์ž…๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋„์ „๊ณผ์ œ 2์—์„œ ์ƒ์„ฑํ•œ VPC_id๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์„œ๋ธŒ๋„ท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

variable "vpc_id" {}

data "aws_vpc" "selected" {
  id = var.vpc_id
}

resource "aws_subnet" "example" {
  vpc_id            = data.aws_vpc.selected.id
  availability_zone = "ap-northeast-2a"
  cidr_block        = cidrsubnet(data.aws_vpc.selected.cidr_block, 4, 1)
}

๊ฒฐ๊ณผ
์ž…๋ ฅ ๋ณ€์ˆ˜๋กœ vpc-0f6a753723217b6a2๋ฅผ ๋ฐ›์•„ ํ•ด๋‹นํ•˜๋Š” VPC์— ์„œ๋ธŒ๋„ท์„ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Reference

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

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