๐กcloudNet@ ํ์ ๊ฐ์๋ค ๋์ด ์งํํ๋ Terraform 101 Study 4๊ธฐ 2์ฃผ์ฐจ ๋ด์ฉ์ผ๋ก,
[ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC] ๋์๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค..
1. ๋ฐ์ดํฐ ์์ค
๋ฐ์ดํฐ ์์ค๋ ํ ๋ผํผ์ผ๋ก ์ ์๋์ง ์์ ์ธ๋ถ ๋ฆฌ์์ค ๋๋ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ํ ๋ผํผ ๋ด์์ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ๋ค. (์๋ฅผ ๋ค๋ฉด aws image ๋ฑ)
1.1 ๋ฐ์ดํฐ ์์ค ๊ตฌ์ฑ
๋ฐ์ดํฐ ์์ค ๋ธ๋ก์ data๋ก ์์๋๋ค. ์ดํ ๋ฐ์ดํฐ ์์ค ์ ํ์ ์ ์ํ๋ค.(resource ๋ธ๋ก๊ณผ ์ ์ฌํจ)
๋ฐ์ดํฐ ์์ค ์ ์ ์์
data "local_file" "cwtest" {
filename = "${path.module}/cwtest.txt"
}
# ex, aws image์ ๊ฒฝ์ฐ
data "aws_iam_user" "cwdev" {
user_name = "cwdev_name"
}
๋ฐ์ดํฐ ์์ค ์ ํ์ ์ฒซ ๋ฒ์งธ _(์ธ๋์ค์ฝ์ด) ๊ธฐ์ค์ผ๋ก ์์ ํ๋ก๋ฐ์ด๋ ์ด๋ฆ, ๋ค๋ ํ๋ก๋ฐ์ด๋์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์ ํ์ ์๋ฏธํ๋ค.
๋ฐ์ดํฐ ์์ค ์ ํ์ ์ ์ธํ ๋ค์๋ ๊ณ ์ ์ด๋ฆ์ ๋ถ์ธ๋ค.(๋ฆฌ์์ค ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ค๋ณต๋ ์ ์๋ค)
๋ํ ์ด๋ฆ ๋ค ๋ฐ์ดํฐ ์์ค ์ ํ์ ๋ํ ๊ตฌ์ฑ ์ธ์๋ { } ์์ ์ ์ธํ๋ค. ์ธ์๊ฐ ์๋๋ผ๋ { } ๋ ์ ๋ ฅํ๋ค.
๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉํ์ธ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- depends_on : ์ข ์์ฑ์ ์ ์ธํ๋ฉฐ, ์ ์ธ๋ ๊ตฌ์ฑ์์์์ ์์ฑ ์์ ์ ๋ํด ์ ์
- count : ์ ์ธ๋ ๊ฐ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์ธ
- for_each : map ๋๋ set ํ์ ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์์ฑ
- provider : ๋์ผํ ํ๋ก๋ฐ์ด๋๊ฐ ๋ค์ ์ง์ ๋์ด ์๋ ๊ฒฝ์ฐ ์ ์ธ
- lifecycle : ๋ฐ์ดํฐ ์์ค์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
๋ฐ์ดํฐ ์์ค ์ ์ธ ํ ์คํธ
์ด์ ํ๋ฒ ์ค์ต ํ์ธ์ ํด๋ณด๊ฒ ๋ค. ๋ก์ปฌ์ ์๋ฌด ํ์ผ์ ์์ฑํ์ฌ ์ด๋ฅผ ๋ฐ์ดํฐ ์์ค๋ก ์ ์ธํด๋ณด๊ฒ ๋ค.
# ์๋ฌด ํ์ผ์ ์์ฑํ๋ค.
echo "terraform stady cwcwpack" > cwtest.txt
# plan, apply ์งํ
terraform plan && terraform apply -auto-approve
# terraform ์ํ์ ๋ณด๋ฅผ ํ์ธํ๋ค. cwtest ๋ฐ์ดํฐ ์์ค๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธ๊ฐ๋ฅํ๋ค.
terraform state list
data.local_file.cwtest
- terraform console ํ์ธ ๋ด์ฉ
- ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ ์์ค ๊ตฌ์ฑ์ด ์๋ฃ๋์ด ์ฝ์์์๋ ํด๋น ๋ฐ์ดํฐ ์์ค์ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
1.2 ๋ฐ์ดํฐ ์์ค ์์ฑ ์ฐธ์กฐ
๋ฐ์ดํฐ ์์ค๋ก ์ฝ์ ๋์์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ ๋ฆฌ์์ค์ ๊ตฌ๋ณ๋๊ฒ ์์ data๊ฐ ๋ถ๋๋ค. ์์ฑ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ ์ ์๋ค.
# Terraform Code
data "<๋ฆฌ์์ค ์ ํ>" "<์ด๋ฆ>" {
<์ธ์> = <๊ฐ>
}
# ๋ฐ์ดํฐ ์์ค ์ฐธ์กฐ
data.<๋ฆฌ์์ค ์ ํ>.<์ด๋ฆ>.<์์ฑ>
๋ค์์ AWS ํ๋ก๋ฐ์ด๋์ ๊ฐ์ฉ์์ญ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ์ง ์๊ณ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ์ฉํด subnet ๊ฐ์ฉ์์ญ ์ธ์๋ฅผ ์ ์ํ๋ ์์์ด๋ค.
# Declare the data source
**data** "aws_availability_zones" "available" {
state = "available"
}
resource "aws_subnet" "primary" {
availability_zone = **data.aws_availability_zones.**available**.names[0]**
# e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
availability_zone = data.aws_availability_zones.available.names[1]
# e.g. ap-northeast-2b
}
๋ฐ์ดํฐ ์์ค๋ฅผ ํ์ฉํ์ฌ AWS ํ๋ก๋ฐ์ด๋์ ๊ตฌ์ฑ๋ ๋ฆฌ์ ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฉ์์ญ ๋ชฉ๋ก์ ์ฝ์ ์ ์๋ค.
๋ ์์ธํ ์ธ์์ ๋ฐ์ดํฐ์์ค ๋ฑ ๋ด์ฉ์ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ์ข๋ค.
์ด์ ํ๋ฒ ๋ฐ์ดํฐ ์์ค ๋์์ ํ ์คํธํด๋ณด๊ฒ ๋ค.
# main.tf
resource "local_file" "dev-chan" {
content = "I'm Chanwoo. Aspiring DebOps"
filename = "${path.module}/dev-chan.txt"
}
data "local_file" "dev-chan" {
filename = local_file.dev-chan.filename
}
resource "local_file" "dev-woo" {
content = data.local_file.dev-chan.content
filename = "${path.module}/dev-woo.txt"
}
terraform apply๋ฅผ ์คํํ ๋ค, local_file.dev-chan ์ผ๋ก ์์ฑ๋ ๋ฆฌ์์ค dev-chan.txt ํ์ผ ๋ด์ฉ๊ณผ dev-woo.txt ํ์ผ ๋ด์ฉ์ด ๋์ผํ์ง ํ์ธํ๋ค.
- ์ผ๋จ data์ resource๋ ์ ์์ ์ผ๋ก ์์ฑ๋์๋ค.
ํ์ผ ๋ํ ์ ์์ฑ๋์๊ณ , diff ๋ช ๋ น์ผ๋ก ํ์ผ ๋ด์ฉ์ ๋น๊ตํด๋ณด์์๋, ์ฐจ์ด์ ์ด ๋ฐ๊ฒฌ๋์ง ์๋๋ค.
์ ์์ ์ผ๋ก ๋์ํ ๊ฒ ๊ฐ๋ค.
echo "data.local_file.dev-chan.content" | terraform console
"I'm Chanwoo. Aspiring DebOps"
2. ์ ๋ ฅ ๋ณ์ variable
์ ๋ ฅ ๋ณ์๋ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ์์ฑ ๊ฐ์ ์ ์ํด ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ์ฌ๋ฌ ์ธํ๋ผ๋ฅผ ์์ฑํ๋๋ฐ ๋ชฉ์ ์ด ์๋ค. ํ ๋ผํผ์์๋ ์ด๊ฒ์ ์ ๋ ฅ ๋ณ์(input variables)๋ก ์ ์ํ๋ค.
(์ฌ๊ธฐ์ ์ ๋ ฅ์ด๋ผ๋ ๋ง์, ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์์ ๋ณ์ ์ ์ธ๊ณผ ๋ฌ๋ฆฌ ํ ๋ผํผ์ plan ์ํ ์ ๊ฐ์ ์ ๋ ฅํ๋ค๋ ๊ฒ.)
2.1 ๋ณ์ ์ ์ธ ๋ฐฉ์
๋ณ์๋ variable๋ก ์์๋๋ ๋ธ๋ก์ผ๋ก ๊ตฌ์ฑ๋๋ค. ๋ณ์ ๋ธ๋ก ๋ค ์ด๋ฆ ๊ฐ์ ๋์ผ ๋ชจ๋ ๋ด ๋ชจ๋ ๋ณ์ ์ ์ธ์์ ์ค๋ณต๋๋ฉด ์๋๋ค. ์ด ์ด๋ฆ์ผ๋ก ๋ค๋ฅธ ์ฝ๋์์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ!!
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 : ๋ณ์์ ๊ฐ์ด ์์ด๋ ๋จ์ ์ง์
2.2 ๋ณ์ ์ ํ
์ง์๋๋ ๋ณ์์ ๋ฒ์ฃผ์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ธฐ๋ณธ ์ ํ
- string : ๊ธ์ ์ ํ
- number : ์ซ์ ์ ํ
- bool : true ๋๋ false
- any : ๋ช
์์ ์ผ๋ก ๋ชจ๋ ์ ํ์ด ํ์ฉ๋จ์ ํ์
- ์งํฉ ์ ํ
- list (<์ ํ>): ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์งํฉ
- map (<์ ํ>): ๊ฐ = ์์ฑ ๊ธฐ๋ฐ ์งํฉ์ด๋ฉฐ ํค๊ฐ ๊ธฐ์ค ์ ๋ ฌ
- set (<์ ํ>): ๊ฐ ๊ธฐ๋ฐ ์งํฉ์ด๋ฉฐ ์ ๋ ฌ ํค๊ฐ ๊ธฐ์ค ์ ๋ ฌ
- object ({<์ธ์ ์ด๋ฆ>=<์ ํ>, …})
- tuple ([<์ ํ>, …])
๊ฐ ์ ํ์ ์๋ก, list์ set์ ์ ์ธํ๋ ํํ๊ฐ ๋น์ทํ์ง๋ง, ์ฐธ์กฐ ๋ฐฉ์์ด ์ธ๋ฑ์ค์ ํค๋ก ๊ฐ๊ฐ ์ฐจ์ด๊ฐ ์๊ณ map๊ณผ set์ ๊ฒฝ์ฐ ์ ์ธ๋ ๊ฐ์ด ์ ๋ ฌ๋๋ ํน์ง์ด ์๋ค.
# ์ ๋ฌํ ๊ฐ์ด number์ธ์ง ํ์ธํ๋ ์
๋ ฅ ๋ณ์ ์์
**variable** "number_example" {
description = "An example of a number variable in Terraform"
**type = number**
default = 42
}
# ์ ๋ฌํ ๊ฐ์ด list์ธ์ง ํ์ธํ๋ ์
๋ ฅ ๋ณ์ ์์
**variable** "list_example" {
description = "An example of a list in Terraform"
**type = list**
default = ["a", "b", "c"]
}
์กฐ๊ฑด ๊ฒฐํฉ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
# ๋ฆฌ์คํธ์ ๋ชจ๋ ํญ๋ชฉ์ด number ์ธ list์ ์์
variable "list_numeric_example" {
description = "An example of a numeric list in Terraform"
**type = list(number)**
default = [1, 2, 3]
}
# ๋ชจ๋ ๊ฐ์ด string์ธ map์ ์์
variable "map_example" {
description = "An example of a map in Terraform"
**type = map(string)**
default = {
key1 = "value1"
key2 = "value2"
key3 = "value3"
}
}
๋ค์์ ๋ณต์กํ ๊ตฌ์กฐ์ ์ ํ์ผ๋ก ์์ฑํ ์์์ด๋ค
# object ๋๋ tuple ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉ
variable "object_example" {
description = "An example of a structural type in Terraform"
**type = object({
name = string
age = number
tags = list(string)
enabled = bool**
})
default = {
name = "value1"
age = 42
tags = ["a", "b", "c"]
enabled = true
}
}
variable "string" {
type = string
description = "var String"
default = "myString"
}
variable "number" {
type = number
default = 123
}
variable "boolean" {
default = true
}
variable "list" {
default = [
"google",
"vmware",
"amazon",
"microsoft"
]
}
output "list_index_0" {
value = var.list.0
}
output "list_all" {
value = [
for name in var.list : upper(name)
]
}
variable "map" { # Sorting
default = {
aws = "amazon",
azure = "microsoft",
gcp = "google"
}
}
variable "set" { # Sorting
type = set(string)
default = [
"google",
"vmware",
"amazon",
"microsoft"
]
}
variable "object" {
type = object({ name = string, age = number })
default = {
name = "abc"
age = 12
}
}
variable "tuple" {
type = tuple([string, number, bool])
default = ["abc", 123, true]
}
variable "ingress_rules" { # optional ( >= terraform 1.3.0)
type = list(object({
port = number,
description = optional(string),
protocol = optional(string, "tcp"),
}))
default = [
{ port = 80, description = "web" },
{ port = 53, protocol = "udp" }]
}
2.3 ์ ํจ์ฑ ๊ฒ์ฌ
์ ๋ ฅ๋๋ ๋ณ์ ํ์ ์ง์ ์ธ์ ํ ๋ผํผ 0.13.- ๋ฒ์ ๋ถํฐ ์ฌ์ฉ์ ์ง์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํด์ก๋ค.
๋ณ์ ๋ธ๋ก ๋ด validation ๋ธ๋ก์์ ์กฐ๊ฑด์ธ condition์ ์ง์ ๋๋ ๊ท์น์ด true ํน์ false๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ, error_message๋ condition ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ false์ธ ๊ฒฝ์ฐ ์ถ๋ ฅ๋๋ ๋ฉ์์ง๋ฅผ ๋งํ๋ค.
regex ํจ์๋ ๋์์ ๋ฌธ์์ด์ ์ ๊ท์์ ์ ์ฉํ๊ณ ์ผ์นํ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค. ์ฌ๊ธฐ์ can ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ท์์ ์ผ์นํ์ง ์๋ ์ค๋ฅ๋ฅผ ๊ฒ์ถํ๋ค.
!! 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** {
# regex(...) fails if it cannot find a match
condition = can(regex("^ami-", var.image_id))
error_message = "The image_id value must starting with \"ami-\"."
}
}
terraform apply๋ฅผ ์คํํ์์๋ ์ผ์ชฝ ํฐ๋ฏธ๋์ธ ์ ๋ ฅ ๊ฐ์์ ami๋ฅผ ์ ๋ ฅํ์์๋๋ ๋ ์กฐ๊ฑด(4๊ธ์ ์ด์, ami- ํ์)์ด ๋ง์ง ์์ error๊ฐ ๋ฐ์ํ์๊ณ ์ค๋ฅธ์ชฝ ํฐ๋ฏธ๋์์๋ ๋ ์กฐ๊ฑด๊ฐ์ ํต๊ณผํ์ฌ ๋ฌธ์ ์์ด ๋ช ๋ น์ด ์คํ๋์๋ค.
2.4 ๋ณ์ ์ฐธ์กฐ
variable์ ์ฝ๋ ๋ด์์ var.<์ด๋ฆ>์ผ๋ก ์ฐธ์กฐ๋๋ค.
main ํ์ผ์ ๋ณ์ ์ ์ธ์ ์ถ๊ฐํ๊ณ plan์ ์งํํ๋ค.
**variable** "my_password" {}
**resource** "local_file" "abc" {
content = var.my_password
filename = "${path.module}/abc.txt"
}
์ง๊ธ ์ ์ธ๋ variable ๊ฐ์ด ๋น์ด์์ด plan ํน์ apply ์คํ์ ํ๊ฒ ๋๋ฉด ๋ณ์๊ฐ์ ์ ๋ ฅํ๋ผ๋ ํญ๋ชฉ์ด ๋ํ๋๋ค. ํด๋น ๋ณ์์ ๊ฐ์ ์ ๋ ฅํ๋ฉด ์ ๋ ฅ๋ฐ์ ๊ฐ์ผ๋ก ์คํ ๊ณํ์ด ์์ฑ๋์ด ์ํํ๊ฒ ๋๋ค.
local_file ๋ฆฌ์์ค์ content์ ๋ณ์๋ก ์ ์ธํ ๊ฐ์ด ์ฐธ์กฐ๋์ด ํ์ผ ๋ด์ ๊ฐ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
2.5 ๋ฏผ๊ฐํ ๋ณ์ ์ทจ๊ธ
๋ฏผ๊ฐํ ์ ๋ ฅ ๋ณ์๋ฅผ ์ํด ํ ๋ผํผ 0.14.0 ๋ฒ์ ๋ถํฐ ์ ๋ ฅ ๋ณ์์ ๋ฏผ๊ฐ ์ฌ๋ถ๋ฅผ ์ ์ธํ ์ ์๋ค.
main.tf ๋ณ์ ์ ์ธ์ sensitive๋ฅผ ์ถ๊ฐํ๊ณ terraform apply๋ฅผ ์งํํ๋ค.
variable "my_password" {
default = "password"
**sensitive = true**
}
resource "local_file" "abc" {
content = var.my_password
filename = "${path.module}/abc.txt"
}
default = "password"๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ ฅ๋ฐ๋ ํญ๋ชฉ์ ๋ํ๋์ง ์์ผ๋ ํ ๋ผํผ ๊ณํ ์ถ๋ ฅ ๋ถ๋ถ์์ ์ฐธ์ฐธ์กฐ๋๋ ๋ณ์ ๊ฐ์ด sensitive value๋ก ๊ฐ์ถฐ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ถ๋ ฅ์๋ ๊ฐ์ด ๋ํ๋์ง ์์ผ๋ ์ค์ ์์ฑ๋๋ ๊ฒฐ๊ณผ๋ฌผ์๋ ์ง์ ๋ ๊ฐ์ด ์ ๋ ฅ๋๋ค.
!! ๋ฏผ๊ฐํ ๋ณ์๋ก ์ง์ ํด๋ terraform.tfstate ํ์ผ์๋ ๊ฒฐ๊ณผ๋ฌผ์ด ํ๋ฌธ์ผ๋ก ๊ธฐ๋ก๋๋ฏ๋ก state ํ์ผ์ ๋ณด์์ ์ ์ํด์ผ ํ๋ค.
2.6 ๋ณ์ ์ ๋ ฅ ๋ฐฉ์๊ณผ ์ฐ์ ์์
variable์ ๋ชฉ์ ์ ์ฝ๋ ๋ด์ฉ์ ์์ ํ์ง ์๊ณ ํ ๋ผํผ์ ๋ชจ๋์ ํน์ฑ์ ํตํด ๋ณ์๋ก ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์๋ค. ํนํ ‘์ ๋ ฅ ๋ณ์’๋ผ๋ ๋ช ์นญ์ ๋ง๊ฒ ์ฌ์ฉ์๋ ํ๋ก๋น์ ๋ ์คํ์์ ์ํ๋ ๊ฐ์ผ๋ก ๋ณ์์ ์ ์ํ ์ ์๋ค.
์ ์ธ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ณ์์ ์ฐ์ ์์๊ฐ ์์ผ๋ฏ๋ก, ์ ์ ํ ์ฌ์ฉํ์ฌ ๋ก์ปฌ๊ณผ ๋น๋ ํ๊ฒฝ์ ์ ์๋ฅผ ๋ค๋ฅด๊ฒ ํ๊ฑฐ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ์ธ๋ถ ๊ฐ์ ๋ณ์์ ์ง์ ํ ์ ์๋ค.
์ ๋ ฅ ๋ณ์์ ์ฐ์ ์์๋ฅผ ํ์ธํด๋ณด๊ฒ ๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
# main.tf
variable "my_var" {}
resource "local_file" "abc" {
content = var.my_var
filename = "${path.module}/abc.txt"
}
์ ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ์ ์์๋ฅผ ํ์ธํด๋ณด๊ฒ ๋ค. ์ ์ฉ๋๋ ๋ณ์๋ resource.local_file.abc์ content ์ธ์ ๊ฒฐ๊ณผ๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค. ์ซ์๊ฐ ์์์๋ก ์ฐ์ ์์๋ ๋ฎ๋ค.
[์ฐ์ ์์ ์์ค 1] ์คํ ํ ์ ๋ ฅ(๋ณ์์ ๊ฐ์ด ์ ์ธ๋์ง ์์ CLI์์ ์ง์ ์ ๋ ฅ)
[์ฐ์ ์์ ์์ค 2] variable ๋ธ๋ก์ default ๊ฐ
# variable ๋ธ๋ก ์์
variable "my_var" {
default = "woo2"
}
resource "local_file" "abc" {
content = var.my_var
filename = "${path.module}/abc.txt"
}
- woo2๊ฐ ์ฐ์ ์์๊ฐ ๋ ๋์ ๋ณ๊ฒฝ๋๋ค.
[์ฐ์ ์์ ์์ค 3] ํ๊ฒฝ ๋ณ์ (TF_VAR_๋ณ์ ์ด๋ฆ)
์์คํ ํ๊ฒฝ ๋ณ์์ ์ ๋์ฌ์ TF_VAR_๊ฐ ํฌํจ๋๋ฉด ๊ทธ ๋ค์ ๋ฌธ์์ด์ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ธ์ํ๋ค.
default ์ ๋น๊ตํด๋ณด๊ฒ ๋ค.
main.tf์ default๋ก woo2๊ฐ ์ด๋ฏธ ์ ์ธ๋์์ผ๋, ํ๊ฒฝ ๋ณ์๋ก ์ ์ธ๋ woo3๊ฐ ์ฐ์ ์์๊ฐ ๋์ woo3๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. (woo2๊ฐ ์ก๋ค…)
[์ฐ์ ์์ ์์ค 4] terraform.tfvars์ ์ ์๋ ๋ณ์ ์ ์ธ
๋ฃจํธ ๋ชจ๋์ main.tf ํ์ผ๊ณผ ๊ฐ์ ์์น์ terraform.tfvars ํ์ผ์ ์์ฑํด ๋ณ์์ ๋ํ ๊ฐ์ ์ถ๊ฐํ๊ณ ๋น๊ต ํด๋ณด๊ฒ ๋ค.
๊ทธ๋ผ terraform.tfvars์ ์ ์ธ๋ ๋ณ์๊ฐ ํน์์งฑ์ผ๊น?
…์๋๋ค ์์ง ๋จ์๋ค.
[์ฐ์ ์์ ์์ค 5] *.auto.tfvars์ ์ ์๋ ๋ณ์ ์ ์ธ
๋์ผํ ์์น์ cwking.auto.tfvars ํ์ผ์ ์์ฑํด ๋น๊ตํด๋ณด๊ฒ ๋ค.
์ถ๊ฐ๋ก, *.auto.tfvars ํ์ผ ๋ผ๋ฆฌ์์๋ ํ์ผ๋ช ์ ์ ๋ ฌ์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์ ์ฉ๋๋ค.
(ex, A.auto.tfvars > B.auto.tfvars )
[์ฐ์ ์์ ์์ค 6] *auto.tfvars.json์ ์ ์๋ ๋ณ์ ์ ์ธ
[์ฐ์ ์์ ์์ค 7] CLI ์คํ ์ -var ์ธ์์ ์ง์ ํน์ -var-file๋ก ํ์ผ ์ง์
-var ์ธ์์ ์ ์ธ๋ ์ ๋ ฅ ๊ฐ์ด ์ ์ผ ์ฐ์ ํ์ฌ ์ ์ฉ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
*.tfvars ์ ๊ฐ์ ํ์ ๋ด์ฉ์ ํ์ผ์ด๋ผ๋ฉด, -var-file๋ก ์ง์ ํ ์ ์๋ค.
ex, terraform plan -var=my_var=var7 -var-file=”var9.txt”
์ด ๊ฒฝ์ฐ -var-file๋ก ์ง์ ๋ ํ์ผ์ ์ ์ธ๋ ์ ๋ ฅ ๋ณ์ ๊ฐ์ด ์ ์ฉ๋๋ค.
์ด๋ ๊ฒ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ๋ ฅ ๋ณ์๋ฅผ ์ ์ํ๊ณ ๊ฐ ๋ฐฉ์์ ์ฐ์ ์์๋ฅผ ํ์ธํ์๋ค.
์ ์ธ ๋ฐฉ์์ด ๋ค์ํ ์ด์ ๋ ํ ๋ผํผ ์คํ ํ๊ฒฝ, ์คํ ๋ฐฉ์์ ๋ฐ๋ผ ์ ๋ ฅ ๋ณ์ ๊ฐ์ ์ ์ธํ๋๋ก ํด ๋์ผํ ์ฝ๋๋ก ๋ค์์ ํ๋ก๋น์ ๋์ ์ํํ๋๋ก ๋์์ธํ๊ธฐ ์ํจ์ด๋ค.
.tfvars ํ์ฅ์๋ก ์์ฑ๋ ํ์ผ์ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ์ ํ๋ฉด ์คํ ์ ์ ๋ ฅํด์ผ ํ๋ ๋ณ์ ๊ฐ์ ํ๋์ ํ์ผ์์ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.