๋ฐ์ํ
- ๊ฐ์๋ค๋์ด ์งํํ์๋ CloudNeta์ Terraform 101 Study์ ์ฐธ๊ฐํ๋ฉฐ ์์ฑํ ๋ด์ฉ์ ๋๋ค.
- ์คํฐ๋ ๊ต์ฌ โ ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC
CH3. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ - 2
3-5. ๋ฐ์ดํฐ ์์ค
- ๋ฐ์ดํฐ ์์ค โ ํ ๋ผํผ์ผ๋ก ์ ์๋์ง ์์ ์ธ๋ถ ๋ฆฌ์์ค ๋๋ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ํ ๋ผํผ ๋ด์์ ์ฐธ์กฐํ ๋ ์ฌ์ฉ
- ์ธ๋ถ์์ ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์กฐ๊ฑด โ ์ธ์(Arguments)
- ๊ฐ์ ธ์จ ๋ฐ์ด์ ์์ค์ ๋ด์ฉ โ ์์ฑ(Attributes)
# ํ
๋ผํผ ์ฝ๋
data "<๋ฆฌ์์ค ์ ํ>" "<์ด๋ฆ>" {
<์ธ์> = <๊ฐ>
}
# ๋ฐ์ดํฐ ์์ค ์ฐธ์กฐ
data.<๋ฆฌ์์ค ์ ํ>.<์ด๋ฆ>.<์์ฑ>
3-6. ์ ๋ ฅ ๋ณ์(variable)
- Input Variables โ ํ์ํ ์์ฑ ๊ฐ์ ์ ์ํด ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ์ธํ๋ผ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ
- ์ ๋ ฅ ๋ณ์๋ ํ ๋ผํผ Plan์์ ์ ๋ ฅํ๊ณ ์ฐธ์กฐ๋ var.<์ด๋ฆ>์ผ๋ก ํ๋ค
variable "<์ด๋ฆ>" {
<์ธ์> = <๊ฐ>
}
๋ณ์ ์ ํ
- ๊ธฐ๋ณธ ์ ํ
- string, number, bool, any
- ์ปฌ๋ ์
์ ํ
- list โ ์ธ๋ฑ์ค๋ก ์ฐธ์กฐ
- set โ ํค๋ก ์ฐธ์กฐ
- map, set โ ์ ์ธ๋ ๊ฐ์ด ์ ๋ ฌ
์ ํจ์ฑ ๊ฒ์ฌ
- ํ ๋ผํผ 0.13.0 ์ดํ๋ก ์ฌ์ฉ์ ์ง์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅ โ ๋ณ์ ๋ธ๋ก ๋ด์ validation๊ณผ condition, error_message
- ๋ณ์ ์ฝ๋ ๋ด์์ validation์ ์ฌ๋ฌ๋ฒ ๊ฐ๋ฅ
variable "image_id" {
type = string
description = "The id of the machine image(AMI) to use for the server"
validation {
condition = length(var.image_id) > 4
error_message = "The image_id value must exceed 4."
}
validation {
condition = can(regex("^ami-", var.image_id))
error_message = "The image_id value mus starting with 'ami-i'."
}
}
๋ฏผ๊ฐํ ๋ณ์ ์ทจ๊ธ
- sensitive๊ฐ ์ ์ฉ๋ ๋ณ์๋ Plan, Apply์์ (sensitive value)๋ก ํ์๊ฐ ๋๋ค.
- sensitive๋ฅผ ์ ์ฉํด๋ terraform.tfstate ํ์ผ์๋ ํ๋ฌธ์ผ๋ก ์ ์ฅ
variable "my_password" {
default = "password"
sensitive = true
}
๋ณ์ ์ ๋ ฅ ๋ฐฉ์๊ณผ ์ฐ์ ์์
- ๋ณ์๊ฐ ์ ์ธ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์กด์ฌ
- CLI์์ ์ ๋ ฅ < default ๊ฐ < ํ๊ฒฝ๋ณ์ < terraform.tfvars < *.auto.tfvars < *auto.tfvars.json < -var ๋๋ -var-file๋ก ๋ณ์ ์ง์
- ํ๊ฒฝ๋ณ์๋ โTF_VAR_๋ณ์์ด๋ฆโ์ผ๋ก ์ ์ธ
- *.atuo.tfvars๊ณผ *.auto.tfvars.json โ ํ์ผ๋ช ์ ๋ฐ๋ผ ์ฐ์ ์์ ์ ์ฉ(a.auto.tfvars๋ณด๋ค b.auto.tfvars์ ์ฐ์ ์์๊ฐ ๋๋ค, *.auto.tfvars.json๋ ๋์ผ)
- ๋ณ์ ์ ์ธ ๋ฐฉ์์ด ๋ค์ํ ์ด์ โ ํ ๋ผํผ ์คํ ํ๊ฒฝ, ์คํ ๋ฐฉ์์ ๋ฐ๋ผ ๋์ผํ ์ฝ๋๋ก ๋ค์์ ํ๋ก๋น์ ๋์ ์ํํ๋๋ก ๋์์ธ
3-7. local(์ง์ญ ๊ฐ)
- local โ ์ฝ๋ ๋ด์์ ๊ฐ๊ณต๋์ด ๋์ํ๋ ๊ฐ์ ์ ์ธ(locals ๋ธ๋ญ์ผ๋ก ์ ์ธ)
- ๋ณ์์ฒ๋ผ ์คํ ์์ ์ ๋ ฅ๋ฐ์ ์ ์๋ค.
- ๊ฐ์ด๋ ํํ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํธ์์ฑ์ ์ ๊ณต
โ ๋น๋ฒํ๊ฒ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค์ ๊ฐ์ ๋ํ ์ถ์ ์ด ์ด๋ ค์์ ธ ๊ด๋ฆฌ์ ์ธก๋ฉด์์ ๋ถ๋ด์ด ๋ฐ์ํ ์ ์๋ค. - ๋์ผํ tfํ์ผ ๋ด์์ ์ฌ๋ฌ๋ฒ ์ ์ธ ๊ฐ๋ฅํ๊ณ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์ณ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅ
โ locals์ ์ ์ธํ ์ด๋ฆ์ ์ ์ฒด ๋ฃจํธ ๋ชจ๋ ๋ด์์ ์ ์ผํด์ผ ํฉ๋๋ค.
locals {
name = "tf101"
my_info = {
name = "hyuckang"
region = "KR"
}
}
# local.name -> tf101
# local.my_info.name -> hyuckang
3-8. ์ถ๋ ฅ(output)
- output โ ํ๋ก๋น์ ๋ ์ํ ํ์ ๊ฒฐ๊ณผ ๊ฐ์ ํ์ธํ๋ ์ฉ๋
- ํ ๋ผํผ ๋ชจ๋ ๊ฐ ๋๋ ์ํฌ์คํ์ด์ค ๊ฐ ๋ฐ์ดํฐ ์ ๊ทผ ์ฉ๋
- output ๊ฒฐ๊ณผ์์ ๋ฆฌ์์ค ์์ฑ ํ ๊ฒฐ์ ๋๋ ์์ฑ ๊ฐ์ ํ๋ก๋น์ ๋์ด ์๋ฃ๋์ด์ผ ์ต์ข
์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค.
โ ์ด๋ฐ ๊ฒฝ์ฐ terraform plan์์ ๊ฐ์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
3-9. ๋ฐ๋ณต๋ฌธ
count
- ์ ์ธ๋ ์ ์(count)๋งํผ ๋ฆฌ์์ค๋ ๋ชจ๋์ ์์ฑ
- count์์ ์์ฑ๋๋ ์ฐธ์กฐ๊ฐ์ count.index์ด๋ฉฐ ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํด 1์ฉ ์ฆ๊ฐ
resource "local_file" "count_files" {
count = 5
content = "abc"
filename = "abc${count.index}.txt"
}
# count๋ก ์์ฑํ ๋ฆฌ์์ค ์ฐธ์กฐ
<๋ฆฌ์์ค ํ์
>.<์ด๋ฆ>[<์ธ๋ฑ์ค ๋ฒํธ>]
local_file.count_files[0].filename # abc0.txt
- count์ list๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ
โ list ์ค๊ฐ์ ๊ฐ์ด ์ญ์ ๋๋ฉด ์๋ํ์ง ์์ ์ญ์ ๋ฐ ์ฌ์์ฑ์ด ์ผ์ด๋ ์ ์๋ค.
for_each
- map ๋๋ set์ ์ด์ฉํ์ฌ ์ ์ธ๋ key์ ๊ฐ์๋งํผ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- key ๊ฐ์ count์ index์๋ ๋ฌ๋ฆฌ ๊ณ ์ ํ๋ฏ๋ก ์ค๊ฐ์ ๊ฐ์ ์ญ์ ํ ํ ๋ค์ ์ ์ฉํด๋ ์ญ์ ํ ๊ฐ์ ๋ํด์๋ง ๋ฆฌ์์ค๋ฅผ ์ญ์
- each.key์ each.value๋ฅผ ํตํด ์ฝ๋๋ด์์ ์ฐธ์กฐ ๊ฐ๋ฅ
# AAA๋ผ๋ ๋ด์ฉ์ ๊ฐ์ง key_a.txt์ BBB๋ผ๋ ๋ด์ฉ์ ๊ฐ์ง key_b.txt๊ฐ ์์ฑ๋๋ ์ฝ๋
resource "local_file" "for_each_test" {
for_each = {
key_a = "AAA"
key_b = "BBB"
}
content = each.value
filename = "${each.key}.txt"
}
for
๋ณตํฉ ํ์ ๊ฐ์ ๋ฐ๋ณตํ๋๋ฐ ์ฌ์ฉ
for๋ฌธ์ [ ]๋ก ๋ฌถ์ผ๋ฉด tuple์ด ๋ฐํ๋๊ณ , { }๋ก ๋ฌถ์ผ๋ฉด object๊ฐ ๋ฐํ๋๋ค.
object์ ๊ฒฝ์ฐ์ ํค์ ๊ฐ์ ๋ํ ์์ => ๊ธฐํธ๋ก ๊ตฌ๋ถํ๋ค.
list์ for
# ๊ฐ ๋๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ณต -> ์ธ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ "๊ฐ"๋ง ๋ฐ๋ณต, ์ธ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ "์ธ๋ฑ์ค์ ๊ฐ"์ ๋ฐ๋ณต # ๊ด์ฉ์ ์ผ๋ก ๊ฐ์ v, ์ธ๋ฑ์ค๋ i๋ก ํํ output "list_one_argument" { value = [for v in [1, 2, 3] : "value : ${v}"] } # list_one_argument์ ์ถ๋ ฅ ๊ฒฐ๊ณผ list_one_argument = [ "value : 1", "value : 2", "value : 3", ] output "list_two_argument" { value = [for i, v in [1, 2, 3] : "index : ${i} / value : ${v}"] # ์ถ๋ ฅ index : 0 / value : 1 } # list_two_argument์ ์ถ๋ ฅ ๊ฒฐ๊ณผ list_two_argument = [ "index : 0 / value : 1", "index : 1 / value : 2", "index : 2 / value : 3", ]
map๊ณผ for
# ํค ๋๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ณต -> ์ธ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ "ํค"๋ง ๋ฐ๋ณต, ์ธ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ "ํค์ ๊ฐ"์ ๋ฐ๋ณต # ๊ด์ฉ์ ์ผ๋ก ํค๋ k, ๊ฐ์ v๋ก ํํ variable "members" { default = { name_a = { role = "guest", group = "infra" }, name_b = { role = "member", group = "dev" }, name_c = { role = "admin", group = "infra" }, } } output "print_role" { value = [for k, v in var.members : "${k} has ${v.role}"] } # print_role์ ์ถ๋ ฅ ๊ฒฐ๊ณผ print_role = [ "name_a has guest", "name_b has member", "name_c has admin", ]
dynamic
- ๋ฆฌ์์ค ์์ฒด์ ๋ฐ๋ณต์ด ์๋ ๋ฆฌ์์ค ๋ด์ ๋ธ๋ก ์์ฑ(Attribute as Blocks)์ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ โ dynamic
- ๊ธฐ์กด ๋ธ๋ก์ ์์ฑ ์ด๋ฆ์ dynamic ๋ธ๋ก์ ์ด๋ฆ ์ ์ธํ๊ณ , ๊ธฐ์กด ๋ธ๋ก์ ์์ฑ์ content ๋ธ๋ก์ ์์ฑํ๋ค.
# ๊ธฐ์กด์ ๋ฆฌ์์ค ๋ด์ ๋ฐ๋ณต
resource "provider_resource" "name" {
some_setting {
key = a_value
}
some_setting {
key = b_value
}
some_setting {
key = c_value
}
}
# ๋ฆฌ์์ค ๋ด์ ๋ฐ๋ณต์ dynamic์ผ๋ก ๋ณ๊ฒฝ
resource "provider_resource" "name" {
dynamic "some_setting" {
for_each = {
a_key = a_value
b_key = b_value
c_key = c_value
}
}
content {
key = some_setting.value
}
}
๋ฐ์ํ
'๐ IaC > Terraform' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TF 101 Study 3์ฃผ์ฐจ ์ ๋ฆฌ - ์กฐ๊ฑด์, ํจ์, ํ๋ก๋น์ ๋, ํ๊ฒฝ ๋ณ์, ํ๋ก๋ฐ์ด๋ (0) | 2023.07.22 |
---|---|
Terraform 101 Study - 2์ฃผ์ฐจ(2) ๋์ ๊ณผ์ (0) | 2023.07.14 |
Terraform 101 Study - 1์ฃผ์ฐจ(2) ๋์ ๊ณผ์ (0) | 2023.07.09 |
Terraform 101 Study - 1์ฃผ์ฐจ(1) ๋ด์ฉ์ ๋ฆฌ (0) | 2023.07.09 |
[Terraform] Provider (0) | 2022.09.09 |