[t1013] Terraform Basics 3/3

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

Terraform

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

๐Ÿ“Œ Notice

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

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

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


๐Ÿ“Œ Summary

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

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

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

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



๐Ÿ“Œ Study

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

โœ… 3.10 ์กฐ๊ฑด๋ฌธ

ํ…Œ๋ผํผ์—์„œ์˜ ์กฐ๊ฑด์‹์€ 3ํ•ญ ์—ฐ์‚ฐ์ž ํ˜•ํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
์กฐ๊ฑด์€ true ๋˜๋Š” false๋กœ ํ™•์ธ๋˜๋Š” ๋ชจ๋“  ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋งํฌ

์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๊ต, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์กฐ๊ฑด์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด์‹์€ ? ๊ธฐํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ ์กฐ๊ฑด์ด๋ฉฐ, ์˜ค๋ฅธ์ชฝ์€ : ๊ธฐํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์ด ์กฐ๊ฑด์— ๋Œ€ํ•ด true๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ์ด๊ณ  ์˜ค๋ฅธ์ชฝ์ด false๊ฐ€ ๋ฐ˜ํ™˜ ๋ฉ๋‹ˆ๋‹ค.

var.a๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ๋ฉด var.a๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, ๋น„์–ด ์žˆ์„ ๋•Œ๋Š” โ€œdefault-aโ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

# <์กฐ๊ฑด ์ •์˜> ? <์˜ณ์€ ๊ฒฝ์šฐ> : <ํ‹€๋ฆฐ ๊ฒฝ์šฐ>
var.a != "" ? var.a : "default-a"

์กฐ๊ฑด์‹์˜ ๊ฐ ์กฐ๊ฑด์€ ๋น„๊ต ๋Œ€์ƒ์˜ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํ…Œ๋ผํผ ์‹คํ–‰ ์‹œ ์กฐ๊ฑด ๋น„๊ต๋ฅผ ์œ„ํ•ด ํ˜•ํƒœ๋ฅผ ์ถ”๋ก ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ, ๋ช…์‹œ์ ์ธ ํ˜•ํƒœ ์ž‘์„ฑ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

# ์กฐ๊ฑด์‹ ํ˜•ํƒœ ๊ถŒ์žฅ ์‚ฌํ•ญ 
var.example ? 12 : "hello"            # ๋น„๊ถŒ์žฅ
var.example ? "12" : "hello"          # ๊ถŒ์žฅ
var.example ? tostring(12) : "hello"  # ๊ถŒ์žฅ

โœ… 3.11 ํ•จ์ˆ˜

ํ…Œ๋ผํผ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ๊ฐ’์˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋งํฌ

๋‚ด์žฅ๋œ ํ•จ์ˆ˜ ์™ธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๋ณ„๋„์˜ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ข…๋ฅ˜์—๋Š” ์ˆซ์ž, ๋ฌธ์ž์—ด, ์ปฌ๋ ‰์…˜, ์ธ์ฝ”๋”ฉ, ํŒŒ์ผ ์‹œ์Šคํ…œ, ๋‚ ์งœ/์‹œ๊ฐ„, ํ•ด์‹œ/์•”ํ˜ธํ™”, IP ๋„คํŠธ์›Œํฌ, ์œ ํ˜• ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ผํผ ์ฝ”๋“œ์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜, ๋ฆฌ์†Œ์Šค ์†์„ฑ, ๋ฐ์ดํ„ฐ ์†Œ์Šค ์†์„ฑ, ์ถœ๋ ฅ ๊ฐ’ ํ‘œํ˜„ ์‹œ ์ž‘์—…์„ ๋™์ ์ด๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 3.12 ํ”„๋กœ๋น„์ €๋„ˆ

ํ”„๋กœ๋น„์ €๋„ˆ๋Š” ํ”„๋กœ๋ฐ”์ด๋”์™€ ๋น„์Šทํ•˜๊ฒŒ โ€˜์ œ๊ณต์žโ€™๋กœ ํ•ด์„๋˜๋‚˜, ํ”„๋กœ๋ฐ”์ด๋”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ปค๋งจ๋“œ์™€ ํŒŒ์ผ ๋ณต์‚ฌ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. - ๋งํฌ

์˜ˆ๋ฅผ ๋“ค์–ด AWS EC2 ์ƒ์„ฑ ํ›„ ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๊ฒƒ๋“ค์€ ํ…Œ๋ผํผ์˜ ๊ตฌ์„ฑ๊ณผ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋น„์ €๋„ˆ๋กœ ์‹คํ–‰๋œ ๊ฒฐ๊ณผ๋Š” ํ…Œ๋ผํผ์˜ ์ƒํƒœ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”„๋กœ๋น„์ €๋‹์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๊ฐ™๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. โ‡’ ์„ ์–ธ์  ๋ณด์žฅ๋˜์ง€ ์•Š์Œ.

ํ”„๋กœ๋น„์ €๋„ˆ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™” ํ•˜๋Š”๊ฒƒ์ด ๋ฐ”๋žŒ์ง ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋น„์ €๋„ˆ์˜ ์ข…๋ฅ˜์—๋Š” ํŒŒ์ผ ๋ณต์‚ฌ์™€ ๋ช…๋ น์–ด ์‹คํ–‰์„ ์œ„ํ•œ file, local-exec, remote-exec๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

local-exec ํ”„๋กœ๋น„์ €๋„ˆ
ํ…Œ๋ผํผ์ด ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰ํ•  ์ปค๋งจ๋“œ๋ฅผ ์ •์˜ - [๋งํฌ(https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec)

๋ฆฌ๋ˆ…์Šค๋‚˜ ์œˆ๋„์šฐ ๋“ฑ ํ…Œ๋ผํผ์„ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ปค๋งจ๋“œ๋ฅผ ์ •์˜, ์•„๋ž˜ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ˆ˜ ๊ฐ’

command(ํ•„์ˆ˜) : ์‹คํ–‰ํ•  ๋ช…๋ น์ค„์„ ์ž…๋ ฅํ•˜๋ฉฐ << ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ค„์˜ ์ปค๋งจ๋“œ ์ž…๋ ฅ ๊ฐ€๋Šฅ

working_dir(์„ ํƒ) : command์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ์ƒ๋Œ€/์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์„ค์ •

interpreter(์„ ํƒ) : ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ด๋ฆ„์ด๊ณ  ๋‘ ๋ฒˆ์งธ๋ถ€ํ„ฐ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ธ์ˆ˜ ๊ฐ’

environment(์„ ํƒ) : ์‹คํ–‰ ์‹œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๊ฐ’์„ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ์ถ”๊ฐ€ ๋˜๋Š” ์žฌํ• ๋‹นํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ธ์ˆ˜์— key = value ํ˜•ํƒœ๋กœ ์„ค์ •

command์˜ << ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋‹ค์ค‘ ๋ผ์ธ์˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ ํ™˜๊ฒฝ์— ๋งž๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ง€์ •ํ•ด ํ•ด๋‹น ๋ช…๋ น์„ ์ˆ˜ํ–‰

์›๊ฒฉ์ง€ ์—ฐ๊ฒฐ

remote-exec์™€ file ํ”„๋กœ๋น„์ €๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์›๊ฒฉ์ง€์— ์—ฐ๊ฒฐํ•  SSH, WinRM ์—ฐ๊ฒฐ ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

connection ๋ธ”๋ก ๋ฆฌ์†Œ์Šค ์„ ์–ธ ์‹œ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ๋‚ด์— ๊ตฌ์„ฑ๋œ ํ”„๋กœ๋น„์ €๋„ˆ์— ๋Œ€ํ•ด ๊ณตํ†ต์œผ๋กœ ์„ ์–ธ๋˜๊ณ ,
ํ”„๋กœ๋น„์ €๋„ˆ ๋‚ด์— ์„ ์–ธ๋˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ”„๋กœ๋น„์ €๋„ˆ์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

file ํ”„๋กœ๋น„์ €๋„ˆ

ํ…Œ๋ผํผ์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์—ฐ๊ฒฐ ๋Œ€์ƒ์œผ๋กœ ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

source : ์†Œ์Šค ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ, ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. content์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

content : ์—ฐ๊ฒฐ ๋Œ€์ƒ์— ๋ณต์‚ฌํ•  ๋‚ด์šฉ์„ ์ •์˜ํ•˜๋ฉฐ ๋Œ€์ƒ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ ๊ฒฝ์šฐ tf-file-content ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ , ํŒŒ์ผ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ์— ๋‚ด์šฉ์ด ๊ธฐ๋ก๋œ๋‹ค. source์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

destination : ํ•„์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ ํ•ญ์ƒ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ง€์ •๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋‹ค.

destination ์ง€์ • ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ winrm ์—ฐ๊ฒฐ์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์ง€๋งŒ, ssh ์—ฐ๊ฒฐ์˜ ๊ฒฝ์šฐ ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” source ๊ฒฝ๋กœ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋™์ž‘์— ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

destination์ด /tmp์ธ ๊ฒฝ์šฐ source๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ /foo ์ฒ˜๋Ÿผ ๋งˆ์ง€๋ง‰์— /๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ง€์ •ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—…๋กœ๋“œ๋˜์–ด ์—ฐ๊ฒฐ๋œ ์‹œ์Šคํ…œ์— /tmp/foo ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—…๋กœ๋“œ ๋ฉ๋‹ˆ๋‹ค.

source๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ /foo/ ์ฒ˜๋Ÿผ ๋งˆ์ง€๋ง‰์— /๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ source ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ๋งŒ /tmp ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—…๋กœ๋“œ ๋ฉ๋‹ˆ๋‹ค.

file ํ”„๋กœ๋น„์ €๋„ˆ ๊ตฌ์„ฑ ์˜ˆ

resource "null_resource" "foo" {

  # myapp.conf ํŒŒ์ผ์ด /etc/myapp.conf ๋กœ ์—…๋กœ๋“œ
  provisioner "file" {
    source      = "conf/myapp.conf"
    destination = "/etc/myapp.conf"
  }

  # content์˜ ๋‚ด์šฉ์ด /tmp/file.log ํŒŒ์ผ๋กœ ์ƒ์„ฑ
  provisioner "file" {
    content     = "ami used: ${self.ami}"
    destination = "/tmp/file.log"
  }

  # configs.d ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ /etc/configs.d ๋กœ ์—…๋กœ๋“œ
  provisioner "file" {
    source      = "conf/configs.d"
    destination = "/etc"
  }

  # apps/app1 ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ๋“ค๋งŒ D:/IIS/webapp1 ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์— ์—…๋กœ๋“œ
  provisioner "file" {
    source      = "apps/app1/"
    destination = "D:/IIS/webapp1"
  }

}

remote-exec ํ”„๋กœ๋น„์ €๋„ˆ : ์›๊ฒฉ์ง€ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ์™€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜

AWS์˜ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น VM์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

inline : ๋ช…๋ น์— ๋Œ€ํ•œ ๋ชฉ๋ก์œผ๋กœ [ ] ๋ธ”๋ก ๋‚ด์— โ€œ โ€œ๋กœ ๋ฌถ์ธ ๋‹ค์ˆ˜์˜ ๋ช…๋ น์„ , ๋กœ ๊ตฌ๋ถ„ํ•ด ๊ตฌ์„ฑํ•œ๋‹ค.

script : ๋กœ์ปฌ์˜ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ๊ณ  ์›๊ฒฉ์— ๋ณต์‚ฌํ•ด ์‹คํ–‰ํ•œ๋‹ค.

scripts : ๋กœ์ปฌ์˜ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ์˜ ๋ชฉ๋ก์œผ๋กœ [ ] ๋ธ”๋ก ๋‚ด์— โ€œ โ€œ๋กœ ๋ฌถ์ธ ๋‹ค์ˆ˜์˜ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๋ฅผ , ๋กœ ๊ตฌ๋ถ„ํ•ด ๊ตฌ์„ฑํ•œ๋‹ค

script ๋˜๋Š” scripts์˜ ๋Œ€์ƒ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ธ์ˆ˜๋Š” ๊ด€๋ จ ๊ตฌ์„ฑ์—์„œ ์„ ์–ธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•„์š”ํ•  ๋•Œ file ํ”„๋กœ๋ฐ”์ด๋”๋กœ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  inline ์ธ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ์Šคํฌ๋ฆฝํŠธ์— ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์˜ˆ์‹œ

resource "aws_instance" "web" {
  # ...

  # Establishes connection to be used by all
  # generic remote provisioners (i.e. file/remote-exec)
  connection {
    type     = "ssh"
    user     = "root"
    password = var.root_password
    host     = self.public_ip
  }

  provisioner "file" {
    source      = "script.sh"
    destination = "/tmp/script.sh"
  }

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh args",
    ]
  }
}

โœ… 3.13 null_resource์™€ terraform_data

ํ…Œ๋ผํผ 1.4 ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์ฆˆ๋˜๋ฉด์„œ ๊ธฐ์กด null_resource ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” terraform_data ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

null_resource : ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌํ˜„

์ด๋Ÿฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ…Œ๋ผํผ ํ”„๋กœ๋น„์ €๋‹ ๋™์ž‘์„ ์„ค๊ณ„ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๋™์ž‘์„ ์กฐ์œจํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์—ฌ, ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋งŒ์œผ๋กœ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฃผ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

  • ํ”„๋กœ๋น„์ €๋‹ ์ˆ˜ํ–‰ ๊ณผ์ •์—์„œ ๋ช…๋ น์–ด ์‹คํ–‰

  • ํ”„๋กœ๋น„์ €๋„ˆ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

  • ๋ชจ๋“ˆ, ๋ฐ˜๋ณต๋ฌธ, ๋ฐ์ดํ„ฐ ์†Œ์Šค, ๋กœ์ปฌ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

  • ์ถœ๋ ฅ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต

null_resource๋Š” ์ •์˜๋œ ์†์„ฑ์ด โ€˜idโ€™๊ฐ€ ์ „๋ถ€์ด๋ฏ€๋กœ, ์„ ์–ธ๋œ ๋‚ด๋ถ€์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ƒˆ๋กœ์šด Plan ๊ณผ์ •์—์„œ ์‹คํ–‰ ๊ณ„ํš์— ํฌํ•จ๋˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ null_resource์— ์ •์˜๋œ ๋‚ด์šฉ์„ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ˆ˜๋กœ trigger๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

trigger๋Š” ์ž„์˜์˜ string ํ˜•ํƒœ์˜ map ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ, ์ •์˜๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด null_resource ๋‚ด๋ถ€์— ์ •์˜๋œ ํ–‰์œ„๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

trigger ์ •์˜์™€ ๋™์ž‘ ์˜ˆ์ œ

resource "null_resource" "foo" {
  triggers = {
    ec2_id = aws_instance.bar.id # instance์˜ id๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์žฌ์‹คํ–‰
  }
  ...์ƒ๋žต...
}

resource "null_resource" "bar" {
  triggers = {
    ec2_id = time() # ํ…Œ๋ผํผ์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•  ๋–„๋งˆ๋‹ค ์žฌ์‹คํ–‰
  }
  ...์ƒ๋žต...
}

terraform_data

์ž์ฒด์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์ง€๋งŒ null_resource๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๋ฐ”์ด๋” ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ๊ณผ ๋น„๊ตํ•˜์—ฌ ์ถ”๊ฐ€ ํ”„๋กœ๋ฐ”์ด๋” ์—†์ด ํ…Œ๋ผํผ ์ž์ฒด์— ํฌํ•จ๋œ ๊ธฐ๋ณธ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๊ธฐ๋ณธ null_resource์™€ ๋™์ผํ•˜๋ฉฐ ๊ฐ•์ œ ์žฌ์‹คํ–‰์„ ์œ„ํ•œ trigger_replace์™€ ์ƒํƒœ ์ €์žฅ์„ ์œ„ํ•œ input ์ธ์ˆ˜์™€ input์— ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” output ์†์„ฑ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

triggers_replace์— ์ •์˜๋˜๋Š” ๊ฐ’์ด ๊ธฐ์กด map ํ˜•ํƒœ์—์„œ tuple๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์“ฐ์ž„์ด ๋” ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

terraform_data ๋ฆฌ์†Œ์Šค์˜ trigger_replace ์ •์˜์™€ ๋™์ž‘ ์˜ˆ์ œ

resource "terraform_data" "foo" {
  triggers_replace = [
    aws_instance.foo.id,
    aws_instance.bar.id
  ]

  input = "world"
}

output "terraform_data_output" {
  value = terraform_data.foo.output  # ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” "world"
}

โœ… 3.14 moved ๋ธ”๋ก

moved ๋ธ”๋ก

ํ…Œ๋ผํผ์˜ State์— ๊ธฐ๋ก๋˜๋Š” ๋ฆฌ์†Œ์Šค ์ฃผ์†Œ์˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋Š” ์‚ญ์ œ๋˜๊ณ  ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋จ์„ ์•ž์„œ ์„ค๋ช…์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ผํผ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ์–ธํ•˜๋‹ค ๋ณด๋ฉด ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ๋ณ€๊ฒฝ

  • count๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ฐ˜๋ณต๋ฌธ์„ for_each๋กœ ๋ณ€๊ฒฝ

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜์—ฌ ์ฐธ์กฐ๋˜๋Š” ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ

๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ์ด๋ฏธ ํ…Œ๋ผํผ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ํ…Œ๋ผํผ 1.1 ๋ฒ„์ „๋ถ€ํ„ฐ moved ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€˜movedโ€™๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ…Œ๋ผํผ State์—์„œ ์˜ฎ๊ฒจ์ง„ ๋Œ€์ƒ์˜ ์ด์ „ ์ฃผ์†Œ์™€ ์ƒˆ ์ฃผ์†Œ๋ฅผ ์•Œ๋ฆฌ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

moved ๋ธ”๋ก ์ด์ „์—๋Š” State๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜๋Š” terraform state mv ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ State๋ฅผ ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์žˆ์—ˆ๋‹ค๋ฉด, moved ๋ธ”๋ก์€ State์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ฆฌ์†Œ์Šค ์˜ํ–ฅ ์—†์ด ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 3.15 CLI๋ฅผ ์œ„ํ•œ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

ํ…Œ๋ผํผ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๋ฐฉ์‹๊ณผ ์ถœ๋ ฅ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์œผ๋กœ, ์˜๊ตฌ์ ์œผ๋กœ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ ์šฉ๋˜๋Š” ์˜ต์…˜์ด๋‚˜ ๋ณ„๋„ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์„ ๋ถ€์—ฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์ž‘์—… ํ™˜๊ฒฝ๊ณผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์—์„œ๋งŒ ์‚ฌ์šฉ๋  ํŠน์ • ์˜ต์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mac/๋ฆฌ๋ˆ…์Šค/์œ ๋‹‰์Šค: export <ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„>=<๊ฐ’>
Windows CMD: set <ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„>=<๊ฐ’>
Windows PowerShell: $Env:<ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„>='<๊ฐ’>'

TF_LOG : ํ…Œ๋ผํผ์˜ stderr ๋กœ๊ทธ์— ๋Œ€ํ•œ ๋ ˆ๋ฒจ์„ ์ •์˜

trace, debug, info, warn, error, off๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ด€๋ จ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ off์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋กœ๊ทธ ๊ด€๋ จ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • TF_LOG: ๋กœ๊น… ๋ ˆ๋ฒจ ์ง€์ • ๋˜๋Š” ํ•ด์ œ

  • TF_LOG_PATH: ๋กœ๊ทธ ์ถœ๋ ฅ ํŒŒ์ผ ์œ„์น˜ ์ง€์ •

  • TF_LOG_CORE: TF_LOG์™€ ๋ณ„๋„๋กœ ํ…Œ๋ผํผ ์ž์ฒด ์ฝ”์–ด์— ๋Œ€ํ•œ ๋กœ๊น… ๋ ˆ๋ฒจ ์ง€์ • ๋˜๋Š” ํ•ด์ œ

  • TF_LOG_PROVIDER: TF_LOG์™€ ๋ณ„๋„๋กœ ํ…Œ๋ผํผ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•œ ๋กœ๊น… ๋ ˆ๋ฒจ ์ง€์ • ๋˜๋Š” ํ•ด์ œ

ํ™˜๊ฒฝ์— ๋งž๊ฒŒ TF_LOG๋ฅผ info๋กœ ์„ค์ •ํ•˜๊ณ , terraform plan ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋ฉด ํ…Œ๋ผํผ ์ถœ๋ ฅ์— ๊ด€๋ จ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

TF_LOG=info terraform plan

TF_INPUT : ๊ฐ’์„ false ๋˜๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ…Œ๋ผํผ ์‹คํ–‰ ์‹œ ์ธ์ˆ˜์— -input=false ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ

ํ™˜๊ฒฝ์— ๋งž๊ฒŒ TF_INPUT์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  terraform plan ๋™์ž‘ ์‹คํ–‰ํ•˜๋ฉด ์ž…๋ ฅ๋ฐ›๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž…๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

TF_INPUT=0 terraform plan
Error : No value for required variable

TF_VAR_name : TFVAR<๋ณ€์ˆ˜ ์ด๋ฆ„>์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž…๋ ฅ ์‹œ ๋˜๋Š” default๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. โ† 3.6์ ˆ์—์„œ ํ™•์ธ!

TF_CLI_ARGS / TF_CLI_ARGS_subcommand : ํ…Œ๋ผํผ ์‹คํ–‰ ์‹œ ์ถ”๊ฐ€ํ•  ์ธ์ˆ˜๋ฅผ ์ •์˜

# TF_CLI_ARGS="-input=false" terraform apply -auto-approve ๋Š” terraform apply -input=false -auto-approve ์™€ ๊ฐ™๋‹ค
**TF_CLI_ARGS="-input=false" terraform apply -auto-approve**
Error: No value for required variable

# TF_CLI_ARGS_apply๋กœ ์ธ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด terraform apply ์ปค๋งจ๋“œ ์ˆ˜ํ–‰ ์‹œ์—๋งŒ ๋™์ž‘ํ•œ๋‹ค
export TF_CLI_ARGS_apply="-input=false"
**terraform apply -auto-approve**
<์—๋Ÿฌ>

terraform plan
<์ •์ƒ ๊ณ„ํš ์˜ˆ์ธก ์ถœ๋ ฅ>

TF_DATA_DIR : State ์ €์žฅ ๋ฐฑ์—”๋“œ ์„ค์ •๊ณผ ๊ฐ™์€ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ง€์ •

๋ฐ์ดํ„ฐ๋Š” .terraform ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์น˜์— ๊ธฐ๋ก๋˜์ง€๋งŒ TF_DATA_DIR์— ๊ฒฝ๋กœ๊ฐ€ ์ •์˜๋˜๋ฉด ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๊ด€๋œ ํ…Œ๋ผํผ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ์‹คํ–‰ ์‹œ๋งˆ๋‹ค ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฐ’์ด ์ด์ „ ์‹คํ–‰ ์‹œ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ init ๋ช…๋ น์œผ๋กœ ์ˆ˜ํ–‰๋œ ๋ชจ๋“ˆ, ์•„ํ‹ฐํŒฉํŠธ ๋“ฑ์˜ ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ terraform init์ด ์ˆ˜ํ–‰๋œ ์ƒํƒœ์—์„œ TF_DATA_DIR๋กœ ๊ฒฝ๋กœ๋ฅผ ์žฌ์ง€์ •ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

**TF_DATA_DIR=./.terraform_tmp terraform plan**
Error: Required plugins anr not installed


๐Ÿ‘‰ Step 02. 4์žฅ ํ”„๋กœ๋ฐ”์ด๋”


์ถœ์ฒ˜ - ์•…๋ถ„์ผ์ƒ ๋ธ”๋กœ๊ทธ - https://malwareanalysis.tistory.com/619

ํ…Œ๋ผํผ์€ terraform ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹œ์ž‘์œผ๋กœ ๋กœ์ปฌ ํ™˜๊ฒฝ์—๋‚˜ ๋ฐฐํฌ ์„œ๋ฒ„์™€ ๊ฐ™์€ ์›๊ฒฉ ํ™˜๊ฒฝ์—์„œ ์›ํ•˜๋Š” ๋Œ€์ƒ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์ด๋•Œ โ€˜์›ํ•˜๋Š” ๋Œ€์ƒโ€™์€ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด ์„œ๋กœ ๋‹ค๋ฅด์ง€๋งŒ ๋Œ€์ƒ์˜ ๊ณต๊ธ‰์ž, ์ฆ‰ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•ด ์ƒํ˜ธ์ž‘์šฉ์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ํ…Œ๋ผํผ์ด ๋Œ€์ƒ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด โ€˜ํ”„๋กœ๋ฐ”์ด๋”โ€™๋‹ค.

๊ฐ ํ”„๋กœ๋ฐ”์ด๋”์˜ API๊ตฌํ˜„์€ ์„œ๋กœ ๋‹ค๋ฅด์ง€๋งŒ ํ…Œ๋ผํผ์˜ ๊ณ ์œ  ๋ฌธ๋ฒ•์œผ๋กœ ๋™์ผํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ํ”„๋กœ๋ฐ”์ด๋”๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ํ…Œ๋ผํผ์— ๊ฒฐํ•ฉ๋˜์–ด ๋Œ€์ƒ์ด ๋˜๋Š” ํด๋ผ์šฐ๋“œ, SaaS, ๊ธฐํƒ€ ์„œ๋น„์Šค API๋ฅผ ์‚ฌ์šฉํ•ด ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ฐ ํ”„๋กœ๋ฐ”์ด๋”๋Š” ํ…Œ๋ผํผ์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์œ ํ˜•๊ณผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค.

์ฆ‰, ํ…Œ๋ผํผ์€ ํ”„๋กœ๋ฐ”์ด๋” ์—†์ด๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ธํ”„๋ผ์™€ ์„œ๋น„์Šค๋„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋ฐ”์ด๋”๋Š” ๋Œ€์ƒ ์ธํ”„๋ผ ํ™˜๊ฒฝ์ด๋‚˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ๋Š” ๋Œ€์ƒ๊ณผ์˜ ์—ฐ๊ฒฐ๊ณผ ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.

โœ… 4.1 ํ”„๋กœ๋ฐ”์ด๋” ๊ตฌ์„ฑ

ํ…Œ๋ผํผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ํ”„๋กœ๋ฐ”์ด๋” ๋ชฉ๋ก์—๋Š” ์œ ์ง€ ๋ณด์ˆ˜ ๋ฐ ๊ฒŒ์‹œ์— ๋Œ€ํ•œ ๊ถŒํ•œ์— ๋”ฐ๋ผ Tier ์ •๋ณด๊ฐ€ ์ œ๊ณต

์ง€์ •ํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ : ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ Overview ํ•ญ๋ชฉ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” [USE PROVIDER] ํด๋ฆญํ•ด ํ˜„์žฌ ๋ฒ„์ „์˜ ์ •์˜ ๋ฐฉ๋ฒ•์„ ํ™•์ธ

AWS Terraform ๋ธ”๋Ÿญ ์˜ˆ์‹œ์ฝ”๋“œ

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "5.16.1"
    }
  }
}

provider "aws" {
  # Configuration options
}

๋กœ์ปฌ ์ด๋ฆ„๊ณผ ํ”„๋กœ๋ฐ”์ด๋” ์ง€์ •

terraform ๋ธ”๋ก์˜ required_providers ๋ธ”๋ก ๋‚ด์— <๋กœ์ปฌ ์ด๋ฆ„> = { } ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ปฌ ์ด๋ฆ„์€ ํ…Œ๋ผํผ ๋ชจ๋“ˆ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์ด๋ฆ„๊ณผ ๋ฆฌ์†Œ์Šค ์ ‘๋‘์‚ฌ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์„ ์–ธ๋˜๋ฉฐ, ๊ฐ ํ”„๋กœ๋ฐ”์ด๋”์˜ ์†Œ์Šค ๊ฒฝ๋กœ๊ฐ€ ์ง€์ •๋˜๋ฉด ํ”„๋กœ๋ฐ”์ด๋”์˜ ๊ณ ์œ  ์ ‘๋‘์‚ฌ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋™์ผํ•œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์„ ์–ธ๋˜๋Š” ๊ฒฝ์šฐ ๋กœ์ปฌ ์ด๋ฆ„์„ ๋‹ฌ๋ฆฌํ•ด ๊ด€๋ จ ๋ฆฌ์†Œ์Šค์—์„œ ์–ด๋–ค ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์˜ˆ์‹œ : hashicorp/http, terraform-aws-modules/http

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์˜ main.tf์—์„œ์ฒ˜๋Ÿผ ๋™์ผํ•œ http ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ ํ”„๋กœ๋ฐ”์ด๋”์— ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๊ณ  ๋ฆฌ์†Œ์Šค์™€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์–ด๋–ค ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ฌ์šฉํ• ์ง€ provider ์ธ์ˆ˜์— ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ source์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ ์ •์˜๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ http ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ๋ฐ”์ด๋” ์‚ฌ์šฉ ์ •์˜ โ†’ **main.tf ์˜ˆ์ œ**

terraform {
  required_providers {
    architech-http = {
      source = "architect-team/http"
      version = "~> 3.0"
    }
    http = {
      source = "hashicorp/http"
    }
    aws-http = {
      source = "terraform-aws-modules/http"
    }
  }
}

data "http" "example" {
  provider = aws-http
  url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

  request_headers = {
    Accept = "application/json"
  }
}

๋‹จ์ผ ํ”„๋กœ๋ฐ”์ด๋”์˜ ๋‹ค์ค‘ ์ •์˜

๋™์ผํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์กฐ๊ฑด์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋งˆ๋‹ค ๋ณ„๋„๋กœ ์„ ์–ธ๋œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, AWS ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์„œ๋กœ ๋‹ค๋ฅธ ๊ถŒํ•œ์˜ IAM์„ ๊ฐ–๋Š” Access ID ๋˜๋Š” ๋Œ€์ƒ ๋ฆฌ์ „์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ํ”„๋กœ๋ฐ”์ด๋” ์„ ์–ธ์—์„œ alias๋ฅผ ๋ช…์‹œํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค์™€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ๋Š” provider ๋ฉ”ํƒ€์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

provider ๋ฉ”ํƒ€์ธ์ˆ˜์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ alias๊ฐ€ ์—†๋Š” ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ๊ธฐ๋ณธ ํ”„๋กœ๋ฐ”์ด๋”๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฐ”์ด๋” ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜

ํ…Œ๋ผํผ ์‹คํ–‰ ์‹œ ์š”๊ตฌ๋˜๋Š” ํ”„๋กœ๋ฐ”์ด๋” ์š”๊ตฌ์‚ฌํ•ญ์€ terraform ๋ธ”๋ก์˜ required_providers ๋ธ”๋ก์— ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

source์—๋Š” ํ”„๋กœ๋ฐ”์ด๋” ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ  version์€ ๋ฒ„์ „ ์ œ์•ฝ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

terraform {
  required_providers {
    <ํ”„๋กœ๋ฐ”์ด๋” ๋กœ์ปฌ ์ด๋ฆ„> = {
      source = [<ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ>/]<๋„ค์ž„์ŠคํŽ˜์ด์Šค>/<์œ ํ˜•>
      version = <๋ฒ„์ „ ์ œ์•ฝ>
    }
    ...
  }
}

ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ : ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ฃผ์†Œ๋กœ์„œ ๊ธฐ๋ณธ๊ฐ’์€ registry.terraform.io

๋„ค์ž„์ŠคํŽ˜์ด์Šค : ์ง€์ •๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋‚ด์—์„œ ๊ตฌ๋ถ„ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ, ๊ณต๊ฐœ๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ฐ Terraform Cloud์˜ ๋น„๊ณต๊ฐœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ์กฐ์ง์„ ์˜๋ฏธ

์œ ํ˜• : ํ”„๋กœ๋ฐ”์ด๋”์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ํ”Œ๋žซํผ์ด๋‚˜ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๋‘์‚ฌ์™€ ์ผ์น˜ํ•˜๋‚˜ ์ผ๋ถ€ ์˜ˆ์™ธ ์กด์žฌ

ํ”„๋กœ๋ฐ”์ด๋” ์„ค์น˜

ํ…Œ๋ผํผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „ terraform init ๋ช…๋ น์„ ํ†ตํ•ด ์ •์˜๋œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋‹ค์šด๋กœ๋“œ, ๋ณต์‚ฌ, ์บ์‹œ์—์„œ ์ฝ์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•ญ์ƒ ์ง€์ •๋œ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์„ค์น˜ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ํ…Œ๋ผํผ ๊ตฌ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ terraform ๋ธ”๋ก์— ์ •์˜ํ•˜๊ฑฐ๋‚˜ .terraform.lock.hcl ์ž ๊ธˆ ํŒŒ์ผ์„ ์ฝ”๋“œ ์ €์žฅ์†Œ์— ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์•ˆ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

2์žฅ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ required_providers์— ์ง€์ •๋œ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ์ƒ ๊ตฌ์„ฑ์—์„œ ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ๋˜๊ณ , required_providers์— ์ง€์ •ํ•˜์ง€ ์•Š๋”๋ผ๊ณ  ํ…Œ๋ผํผ ๊ตฌ์„ฑ ์ฝ”๋“œ์‚ฌ์—์„œ ์‚ฌ์šฉ๋œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ํ…Œ๋ผํผ์—์„œ ์ถ”๋ก ํ•ด ์ตœ์‹  ๋ฒ„์ „์˜ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.


โœ… 4.2 ํ”„๋กœ๋ฐ”์ด๋” ์—์ฝ”์‹œ์Šคํ…œ

ํ…Œ๋ผํผ์˜ ์—์ฝ”์‹œ์Šคํ…œ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์— ํ…Œ๋ผํผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋ฉ๋‹ˆ๋‹ค.

์—์ฝ”์‹œ์Šคํ…œ์„ ์œ„ํ•œ ํ…Œ๋ผํผ ํ†ตํ•ฉ์€ ์›Œํฌํ”Œ๋กœ ํŒŒํŠธ๋„ˆ์™€ ์ธํ”„๋ผ ํŒŒํŠธ๋„ˆ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ ํŒŒํŠธ๋„ˆ๋Š” ํ…Œ๋ผํผ ์‹คํ–‰ ๋ฐ Terraform Cloud/Enterprise์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. โ†’ Run Tasks

์ธํ”„๋ผ ํŒŒํŠธ๋„ˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ๋ผํผ์œผ๋กœ ๋Œ€์ƒ ํ”Œ๋žซํผ์˜ API๋กœ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.



๐Ÿงฉ Assignment

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

๋ชฉํ‘œ - ์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ (๊ฐ์ž ํŽธ๋ฆฌํ•œ) AWS ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž!

# vpc_id๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, vpc์™€ ์„œ๋ธŒ๋„ท์„ ๋งŒ๋“œ๋Š” ํ…Œ๋ผํผ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
variable "vpc_id" {
  default = "xgro"
}

variable "vpc_cidr_block" {
  default = "10.0.0.0/16"
}

resource "aws_subnet" "example" {
  count             = var.vpc_id != null ? 1 : 0
  vpc_id            = var.vpc_id
  availability_zone = "ap-northeast-2a"
  cidr_block        = cidrsubnet(var.vpc_cidr_block, 4, 1)
}

๊ฒฐ๊ณผ


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

๋ชฉํ‘œ - ๋‚ด์žฅ ํ•จ์ˆ˜์„ ํ™œ์šฉํ•˜์—ฌ (๊ฐ์ž ํŽธ๋ฆฌํ•œ) ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž!

Lookup ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ output_value์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

variable "aws_amis" {
  type = map
  default = {
    "us-east-1" = "ami-0739f8cdb239fe9ae"
    "us-west-2" = "ami-008b09448b998a562"
    "us-east-2" = "ami-0ebc8f6f580a04647"
  }
}

variable "aws_region" {
  default = "us-east-1"
}

output "ami_value" {
  value = lookup(var.aws_amis, var.aws_region)
}

๊ฒฐ๊ณผ

๐Ÿ“Œ Reference

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

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