๐ Notice
๋ณธ ๋ธ๋ก๊น ์ ์๋์
24๋จ๊ณ ์ค์ต์ผ๋ก ์ ๋ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค
์ฑ ์ ๊ธฐ์คํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.์ถ์ฒ - ํ๋น์ถํ๋คํธ์ํฌ
CloudNetaStudy
๊ทธ๋ฃน์์ ์คํฐ๋ํ ๋ด์ฉ์ ๋๋ค.
Hashicorp korea์ ํ์ฑ
๋๊ณผ ํจ๊ป ์คํฐ๋ ํ๊ณ ์์ต๋๋ค. ๐
์ ํ์ฑ
๋๊ณผ์ค์์จ
๋๊ป ๋ค์ํ๋ฒ ๐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
IaC์ ํ ๋ผํผ์ ์ดํดํ๊ณ ์คํฐ๋์ ํ์ํ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.
ํ ๋ผํผ ๊ธฐ๋ณธ ๋ช ๋ น ์ฌ์ฉ๋ฒ์ ์์๋ด ๋๋ค.
HCL์ ์ดํดํ๊ณ ๊ธฐ๋ณธ ํ์ฉ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
์ํ์ฝ๋ ์์ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ค์ตํฉ๋๋ค.
ํ
๋ผํผ์์์ ์กฐ๊ฑด์์ 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" # ๊ถ์ฅ
ํ ๋ผํผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ธ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ด์, ๊ฐ์ ์ ํ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํฉํ ์ ์๋ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. - ๋งํฌ
๋ด์ฅ๋ ํจ์ ์ธ์ ์ฌ์ฉ์๊ฐ ๊ตฌํํ๋ ๋ณ๋์ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
ํจ์ ์ข ๋ฅ์๋ ์ซ์, ๋ฌธ์์ด, ์ปฌ๋ ์ , ์ธ์ฝ๋ฉ, ํ์ผ ์์คํ , ๋ ์ง/์๊ฐ, ํด์/์ํธํ, IP ๋คํธ์ํฌ, ์ ํ ๋ณํ์ด ์์ต๋๋ค.
ํ ๋ผํผ ์ฝ๋์ ํจ์๋ฅผ ์ ์ฉํ๋ฉด ๋ณ์, ๋ฆฌ์์ค ์์ฑ, ๋ฐ์ดํฐ ์์ค ์์ฑ, ์ถ๋ ฅ ๊ฐ ํํ ์ ์์ ์ ๋์ ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
ํ๋ก๋น์ ๋๋ ํ๋ก๋ฐ์ด๋์ ๋น์ทํ๊ฒ โ์ ๊ณต์โ๋ก ํด์๋๋, ํ๋ก๋ฐ์ด๋๋ก ์คํ๋์ง ์๋ ์ปค๋งจ๋์ ํ์ผ ๋ณต์ฌ ๊ฐ์ ์ญํ ์ ์ํํฉ๋๋ค. - ๋งํฌ
์๋ฅผ ๋ค์ด 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", ] } }
ํ ๋ผํผ 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" }
moved ๋ธ๋ก
ํ ๋ผํผ์ State์ ๊ธฐ๋ก๋๋ ๋ฆฌ์์ค ์ฃผ์์ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ธฐ์กด ๋ฆฌ์์ค๋ ์ญ์ ๋๊ณ ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋จ์ ์์ ์ค๋ช ์์ ํ์ธํ ์ ์์์ต๋๋ค.
ํ ๋ผํผ ๋ฆฌ์์ค๋ฅผ ์ ์ธํ๋ค ๋ณด๋ฉด ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๊ธฐ๋ ํ๋๋ฐ, ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฆฌ์์ค ์ด๋ฆ์ ๋ณ๊ฒฝ
count๋ก ์ฒ๋ฆฌํ๋ ๋ฐ๋ณต๋ฌธ์ for_each๋ก ๋ณ๊ฒฝ
๋ฆฌ์์ค๊ฐ ๋ชจ๋๋ก ์ด๋ํ์ฌ ์ฐธ์กฐ๋๋ ์ฃผ์๊ฐ ๋ณ๊ฒฝ
๋ฆฌ์์ค์ ์ด๋ฆ์ ๋ณ๊ฒฝ๋์ง๋ง ์ด๋ฏธ ํ ๋ผํผ์ผ๋ก ํ๋ก๋น์ ๋๋ ํ๊ฒฝ์ ๊ทธ๋๋ก ์ ์งํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ํ ๋ผํผ 1.1 ๋ฒ์ ๋ถํฐ moved ๋ธ๋ก์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โmovedโ๋ผ๋ ๋จ์ด๊ฐ ์๋ฏธํ๋ ๊ฒ์ฒ๋ผ ํ ๋ผํผ State์์ ์ฎ๊ฒจ์ง ๋์์ ์ด์ ์ฃผ์์ ์ ์ฃผ์๋ฅผ ์๋ฆฌ๋ ์ญํ ์ ์ํํฉ๋๋ค.
moved ๋ธ๋ก ์ด์ ์๋ State๋ฅผ ์ง์ ํธ์งํ๋ terraform state mv ๋ช ๋ น์ ์ฌ์ฉํ์ฌ State๋ฅผ ๊ฑด๋๋ ค์ผ ํ๋ ๋ถ๋ด์ด ์์๋ค๋ฉด, moved ๋ธ๋ก์ State์ ์ ๊ทผ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ผ๋ ๋ณ๊ฒฝ๋๋ ์ฃผ์๋ฅผ ๋ฆฌ์์ค ์ํฅ ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
ํ ๋ผํผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์คํ ๋ฐฉ์๊ณผ ์ถ๋ ฅ ๋ด์ฉ์ ๋ํ ์ต์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์คํ ํ๊ฒฝ ๋ณ์ ์ค์ ์ผ๋ก, ์๊ตฌ์ ์ผ๋ก ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฉ๋๋ ์ต์ ์ด๋ ๋ณ๋ ์๋ฒ ํ๊ฒฝ์์ ์คํํ๊ธฐ ์ํ ์ต์ ์ ๋ถ์ฌ ๊ฐ๋ฅํฉ๋๋ค.
๋ก์ปฌ ์์ ํ๊ฒฝ๊ณผ ๋ค๋ฅธ ํ๊ฒฝ ๊ตฌ์ฑ์์๋ง ์ฌ์ฉ๋ ํน์ ์ต์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
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
์ถ์ฒ - ์ ๋ถ์ผ์ ๋ธ๋ก๊ทธ - https://malwareanalysis.tistory.com/619ํ ๋ผํผ์ terraform ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์์์ผ๋ก ๋ก์ปฌ ํ๊ฒฝ์๋ ๋ฐฐํฌ ์๋ฒ์ ๊ฐ์ ์๊ฒฉ ํ๊ฒฝ์์ ์ํ๋ ๋์์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์คํ๋๋ค.
์ด๋ โ์ํ๋ ๋์โ์ ํธ์ถํ๋ ๋ฐฉ์์ด ์๋ก ๋ค๋ฅด์ง๋ง ๋์์ ๊ณต๊ธ์, ์ฆ ํ๋ก๋ฐ์ด๋๊ฐ ์ ๊ณตํ๋ API๋ฅผ ํธ์ถํด ์ํธ์์ฉ์ ํ๋ค. ์ฌ๊ธฐ์ ํ ๋ผํผ์ด ๋์๊ณผ์ ์ํธ์์ฉ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด โํ๋ก๋ฐ์ด๋โ๋ค.
๊ฐ ํ๋ก๋ฐ์ด๋์ API๊ตฌํ์ ์๋ก ๋ค๋ฅด์ง๋ง ํ ๋ผํผ์ ๊ณ ์ ๋ฌธ๋ฒ์ผ๋ก ๋์ผํ ๋์์ ์ํํ๋๋ก ๊ตฌํ๋์ด ์๋ค. ํ๋ก๋ฐ์ด๋๋ ํ๋ฌ๊ทธ์ธ ํํ๋ก ํ ๋ผํผ์ ๊ฒฐํฉ๋์ด ๋์์ด ๋๋ ํด๋ผ์ฐ๋, SaaS, ๊ธฐํ ์๋น์ค API๋ฅผ ์ฌ์ฉํด ๋์์ ์ํํ๋ค. ๊ฐ ํ๋ก๋ฐ์ด๋๋ ํ ๋ผํผ์ด ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ํ๊ณผ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐํ๋ค.
์ฆ, ํ ๋ผํผ์ ํ๋ก๋ฐ์ด๋ ์์ด๋ ์ด๋ค ์ข ๋ฅ์ ์ธํ๋ผ์ ์๋น์ค๋ ๊ด๋ฆฌํ ์ ์๋ค๋ ์๋ฏธ๋ค. ๋๋ถ๋ถ์ ํ๋ก๋ฐ์ด๋๋ ๋์ ์ธํ๋ผ ํ๊ฒฝ์ด๋ ์๋น์ค ํ๊ฒฝ์ ๋ํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก, ํ๋ก๋ฐ์ด๋๋ฅผ ๊ตฌ์ฑํ ๋๋ ๋์๊ณผ์ ์ฐ๊ฒฐ๊ณผ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๊ฐ ์ ๊ณต๋์ด์ผ ํ๋ค.
ํ ๋ผํผ ๋ ์ง์คํธ๋ฆฌ์ ํ๋ก๋ฐ์ด๋ ๋ชฉ๋ก์๋ ์ ์ง ๋ณด์ ๋ฐ ๊ฒ์์ ๋ํ ๊ถํ์ ๋ฐ๋ผ 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์ ์ง์ ํ์ง ์๋๋ผ๊ณ ํ ๋ผํผ ๊ตฌ์ฑ ์ฝ๋์ฌ์์ ์ฌ์ฉ๋ ํ๋ก๋ฐ์ด๋๋ฅผ ํ ๋ผํผ์์ ์ถ๋ก ํด ์ต์ ๋ฒ์ ์ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ค์ด๋ก๋ ํ๋ค.
ํ ๋ผํผ์ ์์ฝ์์คํ ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๊ตฌ์กฐ์ ํ ๋ผํผ์ ์ ์ฉํ ์ ์๋๋ก ์ค๊ณ๋ฉ๋๋ค.
์์ฝ์์คํ ์ ์ํ ํ ๋ผํผ ํตํฉ์ ์ํฌํ๋ก ํํธ๋์ ์ธํ๋ผ ํํธ๋๋ก ๋๋ฉ๋๋ค.
์ํฌํ๋ก ํํธ๋๋ ํ ๋ผํผ ์คํ ๋ฐ Terraform Cloud/Enterprise์ ์ฐ๊ณํ์ฌ ๋์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํญ๋ชฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. โ Run Tasks
์ธํ๋ผ ํํธ๋๋ ์ฌ์ฉ์๊ฐ ํ ๋ผํผ์ผ๋ก ๋์ ํ๋ซํผ์ API๋ก ์ํธ์์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
๋ชฉํ
- ์กฐ๊ฑด๋ฌธ์ ํ์ฉํ์ฌ (๊ฐ์ ํธ๋ฆฌํ) 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) }
๊ฒฐ๊ณผ
๋ชฉํ
- ๋ด์ฅ ํจ์์ ํ์ฉํ์ฌ (๊ฐ์ ํธ๋ฆฌํ) ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์!
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) }
๊ฒฐ๊ณผ