๐ Notice
๋ณธ ๋ธ๋ก๊น ์ ์๋์
24๋จ๊ณ ์ค์ต์ผ๋ก ์ ๋ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค
์ฑ ์ ๊ธฐ์คํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.์ถ์ฒ - ํ๋น์ถํ๋คํธ์ํฌ
CloudNetaStudy
๊ทธ๋ฃน์์ ์คํฐ๋ํ ๋ด์ฉ์ ๋๋ค.
Hashicorp korea์ ํ์ฑ
๋๊ณผ ํจ๊ป ์คํฐ๋ ํ๊ณ ์์ต๋๋ค. ๐
์ ํ์ฑ
๋๊ณผ์ค์์จ
๋๊ป ๋ค์ํ๋ฒ ๐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
IaC์ ํ ๋ผํผ์ ์ดํดํ๊ณ ์คํฐ๋์ ํ์ํ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.
ํ ๋ผํผ ๊ธฐ๋ณธ ๋ช ๋ น ์ฌ์ฉ๋ฒ์ ์์๋ด ๋๋ค.
HCL์ ์ดํดํ๊ณ ๊ธฐ๋ณธ ํ์ฉ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
์ํ์ฝ๋ ์์ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ค์ตํฉ๋๋ค.
๋ฐ์ดํฐ ์์ค๋ ํ ๋ผํผ์ผ๋ก ์ ์๋์ง ์์ ์ธ๋ถ ๋ฆฌ์์ค ๋๋ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ํ ๋ผํผ ๋ด์์ ์ฐธ์กฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
๋ฐ์ดํฐ ์์ค ๊ตฌ์ฑ
๋ฐ์ดํฐ ์์ค ๋ธ๋ก์ data๋ก ์์, ์ดํ โ๋ฐ์ดํฐ ์์ค ์ ํโ์ ์ ์ โ Resource ๋ธ๋ก ์ ์์ ์ ์ฌ
๋ฐ์ดํฐ ์์ค ์ ํ์ ์ฒซ ๋ฒ์งธ _๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ํ๋ก๋ฐ์ด๋ ์ด๋ฆ, ๋ค๋ ํ๋ก๋ฐ์ด๋์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์ ํ์ ์๋ฏธํ๋ค.
๋ฐ์ดํฐ ์์ค ์ ํ์ ์ ์ธํ ๋ค์๋ ๊ณ ์ ํ ์ด๋ฆ์ ๋ถ์ธ๋ค. ๋ฆฌ์์ค์ ์ด๋ฆ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฆ์ ๋์ผํ ์ ํ์ ๋ํ ์๋ณ์ ์ญํ ์ ํ๋ฏ๋ก ์ค๋ณต๋ ์ ์๋ค.
์ด๋ฆ ๋ค์๋ ๋ฐ์ดํฐ ์์ค ์ ํ์ ๋ํ ๊ตฌ์ฑ ์ธ์๋ค์ { } ์์ ์ ์ธํ๋ค. ์ธ์๊ฐ ํ์ํ์ง ์์ ์ ํ๋ ์์ง๋ง, ๊ทธ๋์๋ { } ๋ ์ ๋ ฅํ๋ค
data "local_file" "abc" { filename = "${path.module}/abc.txt" }
๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉํ์ธ์
- depends_on : ์ข ์์ฑ์ ์ ์ธํ๋ฉฐ, ์ ์ธ๋ ๊ตฌ์ฑ์์์์ ์์ฑ ์์ ์ ๋ํด ์ ์
- count : ์ ์ธ๋ ๊ฐ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- for_each : map ๋๋ set ํ์ ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- lifecycle : ๋ฆฌ์์ค์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
๋ฐ์ดํฐ ์์ค ์์ฑ ์ฐธ์กฐ
๋ฐ์ดํฐ ์์ค๋ก ์ฝ์ ๋์์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ ๋ฆฌ์์ค์ ๊ตฌ๋ณ๋๊ฒ data๊ฐ ์์ ๋ถ๋๋ค. ์์ฑ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ ์ ์๋ค.# Terraform Code data "<๋ฆฌ์์ค ์ ํ>" "<์ด๋ฆ>" { <์ธ์> = <๊ฐ> } # ๋ฐ์ดํฐ ์์ค ์ฐธ์กฐ data.<๋ฆฌ์์ค ์ ํ>.<์ด๋ฆ>.<์์ฑ>
์ ๋ ฅ ๋ณ์๋ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ์์ฑ ๊ฐ์ ์ ์ํด ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ์ฌ๋ฌ ์ธํ๋ผ๋ฅผ ์์ฑํ๋ ๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค.
ํ
๋ผํผ์์๋ ์ด๊ฒ์ ์
๋ ฅ ๋ณ์ 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์ ๋ชฉ์ ์ ์ฝ๋ ๋ด์ฉ์ ์์ ํ์ง ์๊ณ ํ ๋ผํผ์ ๋ชจ๋์ ํน์ฑ์ ํตํด ์ ๋ ฅ๋๋ ๋ณ์๋ก ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์๋ค.
- ํนํ ์ ๋ ฅ ๋ณ์๋ผ๋ ๋ช ์นญ์ ๋ง๊ฒ ์ฌ์ฉ์๋ ํ๋ก๋น์ ๋ ์คํ ์์ ์ํ๋ ๊ฐ์ผ๋ก ๋ณ์์ ์ ์ํ ์ ์๋ค.
- ์ ์ธ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ณ์์ ์ฐ์ ์์๊ฐ ์์ผ๋ฏ๋ก, ์ด๋ฅผ ์ ์ ํ ์ฌ์ฉํด ๋ก์ปฌ ํ๊ฒฝ๊ณผ ๋น๋ ์๋ฒ ํ๊ฒฝ์์์ ์ ์๋ฅผ ๋ค๋ฅด๊ฒ ํ๊ฑฐ๋, ํ๋ก๋น์ ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ์ธ๋ถ ๊ฐ์ ๋ณ์์ ์ง์ ํ ์ ์๋ค.
[์ฐ์ ์์ ์์ค]์ ์ซ์๊ฐ ์์์๋ก ์ฐ์ ์์๋ ๋ฎ๋ค.
์ฝ๋ ๋ด์์ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฐ ๋๋ ์์ฑ ๊ฐ์ ๊ฐ๊ณตํด ์ฐธ์กฐ ๊ฐ๋ฅํ local (์ง์ญ ๊ฐ)์ ์ธ๋ถ์์ ์ ๋ ฅ๋์ง ์๊ณ , ์ฝ๋ ๋ด์์๋ง ๊ฐ๊ณต๋์ด ๋์ํ๋ ๊ฐ์ ์ ์ธํ๋ค.
local
์ ์
๋ ฅ ๋ณ์์ ๋ฌ๋ฆฌ ์ ์ธ๋ ๋ชจ๋ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ๋ณ์์ฒ๋ผ ์คํ ์์ ์
๋ ฅ๋ฐ์ ์ ์๋ค.
๋ก์ปฌ์ ์ฌ์ฉ์๊ฐ ํ
๋ผํผ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ ๊ฐ์ด๋ ํํ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํธ์๋ฅผ ์ ๊ณตํ๋ค.
ํ์ง๋ง ๋น๋ฒํ๊ฒ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ค์ ๊ฐ์ ๋ํ ์ถ์ ์ด ์ด๋ ค์์ ธ ์ ์ง ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ถ๋ด์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
๋ก์ปฌ์ด ์ ์ธ๋๋ ๋ธ๋ก์ locals๋ก ์์ํ๋ค. ์ ์ธ๋๋ ์ธ์์ ํํ๋๋ ๊ฐ์ ์์๋ง์ด ์๋ ๋ฆฌ์์ค์ ์์ฑ, ๋ณ์์ ๊ฐ๋ค๋ ์กฐํฉํด ์ ์ํ ์ ์๋ค.
๋์ผํ tf ํ์ผ ๋ด์์ ์ฌ๋ฌ ๋ฒ ์ ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ณ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์ณ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๋ค๋ง lcoals์ ์ ์ธํ ๋ก์ปฌ ๋ณ์ ์ด๋ฆ์ ์ ์ฒด ๋ฃจํธ ๋ชจ๋ ๋ด์์ ์ ์ผํด์ผ ํ๋ค.
์ ์๋๋ ์์ฑ ๊ฐ์ ์ง์ ๋ ๊ฐ์ ํํ์ ๋ฐ๋ผ ๋ค์ํ ์ ํ์ผ๋ก ์ ์ํ ์ ์๋ค.
local ์ฐธ์กฐ
์ ์ธ๋ local ๊ฐ์ local.<์ด๋ฆ>์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค.
ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ์ฌ๋ฌ ๊ฐ ์์ฑํด ์์ ํ๋ ๊ฒฝ์ฐ ์๋ก ๋ค๋ฅธ ํ์ผ์ ์ ์ธ๋์ด ์๋๋ผ๋ ๋ค๋ฅธ ํ์ผ์์ ์ฐธ์กฐํ ์ ์๋ค.
์ถ๋ ฅ ๊ฐ์ ์ฃผ๋ก ํ ๋ผํผ ์ฝ๋์ ํ๋ก๋น์ ๋ ์ํ ํ์ ๊ฒฐ๊ณผ ์์ฑ ๊ฐ์ ํ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
๋ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฝ๋ ๋ด ์์ ๊ฐ์ ์ ํ๋ ๋ ธ์ถ์ ์ง์ํ๋ฏ, ํ ๋ผํผ ๋ชจ๋ ๊ฐ, ์ํฌ์คํ์ด์ค ๊ฐ ๋ฐ์ดํฐ ์ ๊ทผ ์์๋ก๋ ํ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด ์๋ฐ์ getter์ ๋น์ทํ ์ญํ ์ด๋ค.
์ถ๋ ฅ ๊ฐ์ ์ฉ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
๋ฃจํธ ๋ชจ๋์์ ์ฌ์ฉ์๊ฐ ํ์ธํ๊ณ ์ ํ๋ ํน์ ์์ฑ ์ถ๋ ฅ
์์ ๋ชจ๋์ ํน์ ๊ฐ์ ์ ์ํ๊ณ ๋ฃจํธ ๋ชจ๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ
์๋ก ๋ค๋ฅธ ๋ฃจํธ ๋ชจ๋์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฒฉ์ผ๋ก ์ฝ๊ธฐ ์ํ ์ ๊ทผ ์์
๋ชจ๋ ๋ด์์ ์์ฑ๋๋ ์์ฑ ๊ฐ๋ค์ output ๋ธ๋ก์ ์ ์๋๋ค
output "instance_ip_addr" { value = "http://${aws_instance.server.private_ip}" }
์ถ๋ ฅ๋๋ ๊ฐ์ value์ ๊ฐ์ด๋ฉฐ ํ ๋ผํผ์ด ์ ๊ณตํ๋ ์กฐํฉ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ํด ์ํ๋ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
์ฃผ์ํ ์ ์ output ๊ฒฐ๊ณผ์์ ๋ฆฌ์์ค ์์ฑ ํ ๊ฒฐ์ ๋๋ ์์ฑ ๊ฐ์ ํ๋ก๋น์ ๋์ด ์๋ฃ๋์ด์ผ ์ต์ข ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๊ณ terraform plan ๋จ๊ณ์์๋ ์ ์ฉ๋ ๊ฐ์ด ์ถ๋ ฅํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๋ณ์ ์ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉํ์ธ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
description
: ์ถ๋ ฅ ๊ฐ ์ค๋ชsensitive
: ๋ฏผ๊ฐํ ์ถ๋ ฅ ๊ฐ์์ ์๋ฆฌ๊ณ ํ ๋ผํผ์ ์ถ๋ ฅ๋ฌธ์์ ๊ฐ ๋ ธ์ถ์ ์ ํdepends_on
: value์ ๋ด๊ธธ ๊ฐ์ด ํน์ ๊ตฌ์ฑ์ ์ข ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์์ฑ๋๋ ์์๋ฅผ ์์๋ก ์กฐ์ precondition
: ์ถ๋ ฅ ์ ์ ์ง์ ๋ ์กฐ๊ฑด์ ๊ฒ์ฆ
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 ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- list ์ ํ์ ๊ฒฝ์ฐ ๋ฐํ ๋ฐ๋ ๊ฐ์ด ํ๋๋ก ๋์ด ์์ผ๋ฉด ๊ฐ์, ๋ ๊ฐ์ ๊ฒฝ์ฐ ์์ ์ธ์๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๊ณ ๋ค์ ์ธ์๊ฐ ๊ฐ์ ๋ฐํ - ๊ด์ฉ์ ์ผ๋ก ์ธ๋ฑ์ค๋ i, ๊ฐ์ v๋ก ํํ
- map ์ ํ์ ๊ฒฝ์ฐ ๋ฐํ ๋ฐ๋ ๊ฐ์ด ํ๋๋ก ๋์ด ์์ผ๋ฉด ํค๋ฅผ, ๋ ๊ฐ์ ๊ฒฝ์ฐ ์์ ์ธ์๊ฐ ํค๋ฅผ ๋ฐํํ๊ณ ๋ค์ ์ธ์๊ฐ ๊ฐ์ ๋ฐํ - ๊ด์ฉ์ ์ผ๋ก ํค๋ k, ๊ฐ์ v๋ก ํํ
- ๊ฒฐ๊ณผ ๊ฐ์ for ๋ฌธ์ ๋ฌถ๋ ๊ธฐํธ๊ฐ [ ]์ธ ๊ฒฝ์ฐ tuple๋ก ๋ฐํ๋๊ณ { }์ธ ๊ฒฝ์ฐ object ํํ๋ก ๋ฐํ
- 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 } } }
๋ชฉํ
- ๋ฆฌ์ ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฉ์์ญ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ VPC ๋ฆฌ์์ค ์์ฑ ์ค์ต ์งํ - ๋งํฌ ํน์ ์๋ฌด๊ฑฐ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ ์ค์ต ์งํ
VPC ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
data๋ฅผ ์ด์ฉํ์ฌ ํน์ ํ๊ทธ ๊ฐ์ ๊ฐ์ง VPC์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.data "aws_vpcs" "foo" { tags = { Terraform = "true" } } output "foo" { value = data.aws_vpcs.foo.ids }
๊ฒฐ๊ณผ
๋ชฉํ
- ์ 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๊ฐ ์ ์์ ์ผ๋ก ๋ฐฐํฌ๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ชฉํ
- ์ ๋ ฅ๋ณ์๋ฅผ ํ์ฉํด์ ๋ฆฌ์์ค(์ด๋ค ๋ฆฌ์์ค๋ ์ง ์๊ด์์)๋ฅผ ๋ฐฐํฌํด๋ณด๊ณ , ํด๋น ์ฝ๋๋ฅผ ์ ๋ฆฌํด์ฃผ์ธ์!
์ ๋ ฅ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ๋์ ๊ณผ์ 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์ ์๋ธ๋ท์ ์ถ๊ฐ๋ก ์์ฑํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.