๐กcloudNet@ ํ์ ๊ฐ์๋ค ๋์ด ์งํํ๋ Terraform 101 Study 4๊ธฐ 2์ฃผ์ฐจ ๋ด์ฉ์ผ๋ก,
[ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC] ๋์๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค..
1. local (์ง์ญ๊ฐ)
์ฝ๋ ๋ด์์ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฐ ๋๋ ์์ฑ ๊ฐ์ ๊ฐ๊ณตํด ์ฐธ์กฐ ๊ฐ๋ฅํ local (์ง์ญ ๊ฐ) ์ ์ธ๋ถ์์ ์ ๋ ฅ๋์ง ์๊ณ , ์ฝ๋ ๋ด์์๋ง ๊ฐ๊ณต๋์ด ๋์ํ๋ ๊ฐ์ ์ ์ธํ๋ค.
‘local’์ ์ ๋ ฅ ๋ณ์์ ๋ฌ๋ฆฌ ์ ์ธ๋ ๋ชจ๋ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ๋ณ์์ฒ๋ผ ์คํ ์์ ์ ๋ ฅ๋ฐ์ ์ ์๋ค.
๋ก์ปฌ์ ์ฌ์ฉ์๊ฐ ํ ๋ผํผ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ ๊ฐ์ด๋ ํํ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํธ์๋ฅผ ์ ๊ณตํ๋ค. ํ์ง๋ง ์ฌ๋ฌ ๊ณณ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ค์ ๊ฐ์ ๋ํ ์ถ์ ์ด ์ด๋ ค์์ง๋ฏ๋ก ์ ์ง ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ถ๋ด์ด ๋ฐ์ํ ์ ์๋ค. ์ฃผ์ํ ๊ฒ!!
1.1 local ์ ์ธ
๋ก์ปฌ์ด ์ ์ธ๋๋ ๋ธ๋ก์ locals๋ก ์์ํ๋ค. ์ ์ธ๋๋ ์ธ์์ ํํ๋๋ ๊ฐ์ ์์๋ง์ด ์๋ ๋ฆฌ์์ค์ ์์ฑ, ๋ณ์์ ๊ฐ๋ค๋ ์กฐํฉํด ์ ์ํ ์ ์๋ค.
๋์ผํ tf ํ์ผ ๋ด์์ ์ฌ๋ฌ๋ฒ ์ ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ณ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์ณ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๋ค๋ง locals์ ์ ์ธํ ๋ก์ปฌ ๋ณ์ ์ด๋ฆ์ ์ ์ฒด ๋ฃจํธ ๋ชจ๋ ๋ด์์ ์ ์ผํด์ผ ํ๋ค.
์ ์๋๋ ์์ฑ ๊ฐ์ ์ง์ ๋ ๊ฐ์ ํํ์ ๋ฐ๋ผ ๋ค์ํ ์ ํ์ผ๋ก ์ ์ํ ์ ์๋ค.
local ๊ฐ ์ ์ธ ๋ฐฉ์ ์์ ์ฝ๋
variable "prefix" {
default = "hello"
}
**locals** {
name = "terraform"
**content** = "${var.prefix} ${local.name}"
my_info = {
age = 20
region = "KR"
}
my_nums = [1, 2, 3, 4, 5]
}
**locals** {
**content** = "content2" # ์ค๋ณต ์ ์ธ
}
ํด๋น ์ฝ๋๋ฅผ ์คํํด๋ณด๋, ๋ค์๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. locals์ content๊ฐ ์ค๋ณต ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
1.2 local ์ฐธ์กฐ
์ ์ธ๋ local ๊ฐ์ local.<์ด๋ฆ>์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค. ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ์ฌ๋ฌ ๊ฐ ์์ฑํด ์์ ํ๋ ๊ฒฝ์ฐ ์๋ก ๋ค๋ฅธ ํ์ผ์ ์ ์ธ๋์ด ์๋๋ผ๋ ๋ค๋ฅธ ํ์ผ์์ ์ฐธ์กฐํ ์ ์๋ค.
dev.tf ์ ops.tf ํ์ผ์ ์์ฑํ์ฌ plan์ ์คํํด local ์ฐธ์กฐ๋ฅผ ํ ์คํธํด๋ณด๊ฒ ๋ค.
# dev.tf
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
}
resource "local_file" "abc" {
content = local.content
filename = "${path.module}/abc.txt"
}
# ops.tf
locals {
content = "${var.prefix} ${local.name}"
}
dev.tf ํ์ผ์ content ๋ด์ฉ ๊ฐ์ผ๋ก local.content๋ฅผ ์ฐธ์กฐํ๋ค. ํด๋น ๊ฐ์ ๋ค๋ฅธ ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ์์ง๋ง ์คํ์ ํ๋์ ๊ตฌ์ฑ ํ์ผ์ฒ๋ผ ์ ์์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํด๋น ํ ์คํธ๋ก ์๋ก ๋ค๋ฅธ ๊ตฌ์ฑ ํ์ผ์์๋ ๋ก์ปฌ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค๋ ๊ฒ์ ํ์ธํ์ผ๋, ๊ด๋ฆฌ์ ์ธ ์ธก๋ฉด์์ ๋ณด๋ฉด ์๋ก ์ฐธ์กฐํ๋ ๋ก์ปฌ๊ฐ์ด ๋ง์์ง๋ฉด ํํธํ๋์ด ์ ์ง ๋ณด์๊ฐ ์ด๋ ค์ ์ง ์ ์์ผ๋ ์ ์ํด์ผํ๋ค..!
local์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ์ข์๊น?
๋ง์ด ์ฌ์ฉํ ์๋ก ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ธ ๊ฒ ๊ฐ์๋ฐ, ์ด๋ป๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
์ผ๋จ ๊ฐ์ฅ ํฐ ํน์ง์ธ ์ธ๋ถ์์ ์ ๋ ฅ๋์ง ์๊ณ ์ฝ๋ ๋ด๋ก๋ง ๋์ํ๋ฉฐ ์คํ์์ ์ ๋ ฅํ ์๋ ์๋ค๋ ์ ์ผ๋ก ์ค์ํ ๋ฆฌ์์ค ์ฆ, ์์ฃผ ๋ณํ์ง ์๊ฑฐ๋ ์๋ชป ์ ๋ ฅํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํด ๋ณด์ธ๋ค.
ํน์ ์ธํ๋ผ ๋ฆฌ์์ค๊ฐ์ ์์กด์ฑ์ด๋ผ๊ณ ํด์ผํ ๊น? local์ ์ฐธ์กฐํ ์ ์๋ ํน์ง์ ์ด์ฉํด์ ๋ค๋ฅธ ๋ฆฌ์์ค๋ค๊ณผ ์ฐ๊ฒฐ์ด ๋ง์ด ๋๋ ์ค์ํ ๋์์ ๊ฒฝ์ฐ local๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ๊ด๋ฆฌ๊ฐ ์์ํด์ง์ง ์์๊น ์ถ๋ค.
(๊ฒฝํ์ด ๋ง์ด ์์ด ๋จ์ํ ์๊ฐํด๋ดค์ต๋๋ค. ๋ค๋ฅธ๋ถ๋ค์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌ~^^)
1.3 local ์ค์ต AWS IAM User ์์ฑ [์คํฐ๋ ์ ๊ณต]
๋ค์๊ณผ ๊ฐ์ด ํ์ผ ๋ด์ฉ์ ์์ฑํ๊ณ apply๋ฅผ ์งํํ๋ค.
# iamuser.tf
provider "aws" {
region = "ap-northeast-2"
}
**locals** {
**name** = "mytest"
**team** = {
group = "dev"
}
}
resource "aws_iam_user" "**myiamuser1**" {
name = "${local.name}1"
tags = local.team
}
resource "aws_iam_user" "**myiamuser2**" {
name = "${local.name}2"
tags = local.team
}
2. output (์ถ๋ ฅ)
์ถ๋ ฅ ๊ฐ์ ์ฃผ๋ก ํ ๋ผํผ ์ฝ๋์ ํ๋ก๋น์ ๋ ์ํ ํ์ ๊ฒฐ๊ณผ ์์ฑ ๊ฐ์ ํ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. ๋ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฝ๋ ๋ด ์์ ๊ฐ์ ์ ํ๋ ๋ ธ์ถ์ ์ง์ํ๋ฏ, ํ ๋ผํผ ๋ชจ๋ ๊ฐ, ์ํฌ์คํ์ด์ค ๊ฐ ๋ฐ์ดํฐ ์ ๊ทผ ์์๋ก๋ ํ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด ์๋ฐ์ *getter์ ๋น์ทํ ์ญํ ์ด๋ค. ์ถ๋ ฅ ๊ฐ์ ์ฉ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฃจํธ ๋ชจ๋์์ ์ฌ์ฉ์๊ฐ ํ์ธํ๊ณ ์ ํ๋ ํน์ ์์ฑ ์ถ๋ ฅ
- ์์ ๋ชจ๋์ ํน์ ๊ฐ์ ์ ์ํ๊ณ ๋ฃจํธ ๋ชจ๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ
- ์๋ก ๋ค๋ฅธ ๋ฃจํธ ๋ชจ๋์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฒฉ์ผ๋ก ์ฝ๊ธฐ ์ํ ์ ๊ทผ ์์
์ถ๋ ฅ ๊ฐ์ ์์ฑํ๋ฉด ๋จ์ํ ๋๋ฒ๊น ์ ๋์ด ์์ฑ ๊ฐ์ ๋ ธ์ถํ๊ณ ์ ๊ทผํ ์ ์์ด ๋ค๋ฅธ ์์ ์ ๋ฐ ํ ํ์ ์ ์ ์ฉํ๋ค.
- getter : java์์ private๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ์๋. privateํ ๋ ๋ค๋ฅธ ํด๋์ค์์ ์ ๊ทผํ๋ ค๋ฉด ํด๋น ํด๋์ค ์์ ๋ฉ์๋๋ฅผ ํตํด์๋ง ๊ฐ๋ฅํ๋ฐ, ๊ทธ ๊ด๋ฆฌํ๋ ๋ฉ์๋๋ฅผ Getter(์ธ๋ถ๋ก ๋ฆฌํด), Setter(๋ด๋ถ๋ก ๋ฐํ) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2.1 output ์ ์ธ
๋ชจ๋ ๋ด์์ ์์ฑ๋๋ ์์ฑ ๊ฐ๋ค์ output ๋ธ๋ก์ ์ ์๋๋ค.
**output** "instance_ip_addr" {
value = "http://${aws_instance.server.private_ip}"
}
์ถ๋ ฅ๋๋ ๊ฐ์ value์ ๊ฐ์ด๋ฉฐ ํ ๋ผํผ์ด ์ ๊ณตํ๋ ์กฐํฉ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ํด ์ํ๋ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
์ฃผ์ํ ์ ์ output ๊ฒฐ๊ณผ์์ ๋ฆฌ์์ค ์์ฑ ํ ๊ฒฐ์ ๋๋ ์์ฑ๊ฐ์ ๋ํด์๋ ํ๋ก๋น์ ๋์ด ์๋ฃ๋์ด์ผ ์ต์ข ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.(์ฆ, plan ๋จ๊ณ์์๋ ์ ์ฉ๋ ๊ฐ์ ์ถ๋ ฅํ์ง ์๋๋ค๋ ๊ฒ.)
๋ณ์ ์ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉํ์ธ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- description : ์ถ๋ ฅ ๊ฐ ์ค์
- sensitive : ๋ฏผ๊ฐํ ์ถ๋ ฅ ๊ฐ์์ ์๋ฆฌ๊ณ ํ ๋ผํผ์ ์ถ๋ ฅ๋ฌธ์์ ๊ฐ ๋ ธ์ถ์ ์ ํ
- depends_on : value์ ๋ด๊ธธ ๊ฐ์ด ํน์ ๊ตฌ์ฑ์ ์ข ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์์ฑ๋๋ ์์๋ฅผ ์์๋ก ์กฐ์
- precondition : ์ถ๋ ฅ ์ ์ ์ง์ ๋ ์กฐ๊ฑด์ ๊ฒ์ฆ
sensitive์ ๊ฒฝ์ฐ ๊ฐ์ด ์ถ๋ ฅ๋์ง ์์ผ๋ฏ๋ก ๋๋ฒ๊น ๋ชฉ์ ๋ณด๋จ ๊ฐ์ ๋ ธ์ถํ์ง ์๊ณ ๋ค๋ฅธ ๋ชจ๋์์ ์ฐธ์กฐํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ํ์ฉ๋๋ค!
2.2 output ํ์ฉ & abspath ํจ์
output ๋ธ๋ก ๋์ ํ์ธ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ์์ฑํ๋ค.
resource "local_file" "abc" {
content = "abc123"
filename = "${path.module}/abc.txt"
}
output "file_id" {
value = local_file.abc.id
}
output "file_abspath" {
value = **abspath**(local_file.abc.filename)
}
- abspath : ํ์ผ ์์คํ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด์ ๊ฐ์ ธ์ ์ ๋ ๊ฒฝ๋ก๋ก ๋ฐํํ๋ ํจ์ https://developer.hashicorp.com/terraform/language/functions/abspath
plan ์คํ ์ ์ด๋ฏธ ์ ํด์ง ์์ฑ(file_abspath)์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ง๋ง, ์์ง ์์ฑ๋์ง ์์ file_id ๊ฐ์ ๊ฒฐ๊ณผ ์์ธก์ ํ ์ ์๋ค. apply๋ฅผ ์งํํด์ผ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
3. ๋ฐ๋ณต๋ฌธ
list ํํ์ ๊ฐ ๋ชฉ๋ก์ด๋ค Key-Value ํํ์ ๋ฌธ์์ด ์งํ์ธ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋์ผํ ๋ด์ฉ์ ๋ํด ํ ๋ผํผ ๊ตฌ์ฑ ์ ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ง ์๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
3.1 count
๋ฆฌ์์ค ๋๋ ๋ชจ๋ ๋ธ๋ก์ count ๊ฐ์ด ์ ์์ธ ์ธ์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ ์ธ๋ ์ ์ ๊ฐ๋งํผ ๋ฆฌ์์ค๋ ๋ชจ๋์ ์์ฑํ๊ฒ ๋๋ค. count์์ ์์ฑ๋๋ ์ฐธ์กฐ๊ฐ์ count.index์ด๋ฉฐ, ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ 0๋ถํฐ 1์ฉ ์ฆ๊ฐํด ์ธ๋ฑ์ค๊ฐ ๋ถ์ฌ๋๋ค.
count ๊ฐ์ด ์๋ ๋ฐ๋ณต๋ฌธ ๋์ ํ์ธ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ์ผ๋ฅผ ์์ฑํ๋ค.
**resource** "local_file" "abc" {
**count = 5**
content = "abc"
filename = "${path.module}/**abc.txt**"
}
output "filecontent" {
value = local_file.abc.*.content
}
output "fileid" {
value = local_file.abc.*.id
}
output "filename" {
value = local_file.abc.*.filename
}
์ ํ์ผ์ apply๋ก ์คํํ๋ count =5๋ก ์ด 5๊ฐ์ ํ์ผ์ด ์์ฑ๋์ด์ผ ํ๋ ํ์ผ๋ช ์ด ๋์ผํ์ฌ ํ๋์ ํ์ผ๋ง์ด ์์ฑ๋์๋ค.
count๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ๋ณต๋๋ ์ ์๋ก ์ธํด ๋ฌธ์ ๋๋ ๊ฐ์ด ์๋์ง ์ฃผ์ํด์ผ ํ๋ค!!
main.tf๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ํ apply๋ฅผ ์งํํ์๋ค. ์ด๋ฒ์ ๋ค์์ ํ์ผ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
resource "local_file" "abc" {
count = 5
content = "This is filename abc**${count.index}**.txt"
filename = **"${path.module}/**abc**${count.index}.txt"**
}
output "fileid" {
value = local_file.abc.*.id
}
output "filename" {
value = local_file.abc.*.filename
}
output "filecontent" {
value = local_file.abc.*.content
}
๋๋ก๋ ์ฌ๋ฌ ๋ฆฌ์์ค๋ ๋ชจ๋์ count๋ก ์ง์ ๋๋ ์๋์ด ๋์ผํด์ผ ํ๋ ์ํฉ์ด ์๋ค. ์ด ๊ฒฝ์ฐ count์ ๋ถ์ฌ๋๋ ์ ์ ๊ฐ์ ์ธ๋ถ ๋ณ์์ ์๋ณ๋๋๋ก ๊ตฌ์ฑํ ์ ์๋ค.
list ํํ์ ๋ฐฐ์ด์ ํ์ฉํ์ฌ ๋ฐ๋ณต๋ฌธ ๋์ ๊ตฌ์ฑ์ ์งํํ์๋ค.
variable "names" {
type = list(string)
default = ["a", "b", "c"]
}
resource "local_file" "abc" {
count = length(var.names)
content = "abc"
# ๋ณ์ ์ธ๋ฑ์ค์ ์ง์ ์ ๊ทผ
filename = "${path.module}/abc-${var.names[count.index]}.txt"
}
resource "local_file" "def" {
count = length(var.names)
content = local_file.abc[count.index].content
# element function ํ์ฉ
filename = "${path.module}/def-${element(var.names, count.index)}.txt"
}
local_file.abc์ local_file.def๋ var.names์ ์ ์ธ๋๋ ๊ฐ์ ์ํฅ์ ๋ฐ์ ๋์ผํ ๊ฐ์๋งํผ ์์ฑํ๊ฒ ๋๋ค. local_file.def์ ๊ฒฝ์ฐ local_abc์ ๊ฐ์๊ฐ ๊ฐ์์ผ content์ ์ ์ธ๋๋ ์ธ์ ๊ฐ์ ์ค๋ฅ๊ฐ ์์ ๊ฒ์ด๋ฏ๋ก ์๋ก ์ฐธ์กฐ๋๋ ๋ฆฌ์์ค์ ๋ชจ๋์ ๋ฐ๋ณต์ ์์ ๋ํ ๊ณตํต์ ์ํฅ์ ์ฃผ๋ ๋ณ์๋ก ๊ด๋ฆฌํ ์ ์๋ค.
count๋ก ์์ฑ๋๋ ๋ฆฌ์์ค์ ๊ฒฝ์ฐ <๋ฆฌ์์ค ํ์ >, <์ด๋ฆ>,[<์ธ๋ฑ์ค ๋ฒํธ>],
๋ชจ๋์ ๊ฒฝ์ฐ module,<๋ชจ๋ ์ด๋ฆ>,[<์ธ๋ฑ์ค ๋ฒํธ>] ๋ก ํด๋น ๋ฆฌ์์ค์ ๊ฐ์ ์ฐธ์กฐํ๋ค.
- ๋จ, ๋ชจ๋ ๋ด์ count ์ ์ฉ์ด ๋ถ๊ฐ๋ฅํ ์ ์ธ์ด ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค!!
์๋ฅผ ๋ค์ด provider ๋ธ๋ก ์ ์ธ๋ถ๊ฐ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ์๋ count ์ ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ํ ์ธ๋ถ ๋ณ์๊ฐ list ํ์ ์ธ ๊ฒฝ์ฐ ์ค๊ฐ์ ๊ฐ์ด ์ญ์ ๋๋ฉด ์ธ๋ฑ์ค๊ฐ ์ค์ด๋ค์ด ์๋ํ๋ ์ค๊ฐ ๊ฐ์ ๋ํ ๋ฆฌ์์ค๋ง ์ญ์ ๋๋ ๊ฒ์ด ์๋๋ผ ์ดํ์ ์ ์๋ ๋ฆฌ์์ค๋ค๋ ์ญ์ ๋๊ณ ์ฌ์์ฑ๋๋ค.
ํด๋น ๋ด์ฉ์ ๋ฐ๋ณต๋ฌธ ์ค์ต๊ณผ ๋ค์ ํฌ์คํ ํ cloudnet ์คํฐ๋ ์ ๋ถ๋์ด ์ ๊ณตํด์ฃผ์ ์คํฐ๋์์ ํ๋ฒ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ๋ค.
3.2 ๋ฐ๋ณต๋ฌธ ์ค์ต
์ค์ต1. IAM ์ฌ์ฉ์ 3๋ช ์์ฑ
ํ ๋ผํผ์ ์ธ์ด์ ๋ด์ฅ๋ ์ ์ฐจ ๋ ผ๋ฆฌ๊ฐ ์์ด ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ for ์ ๊ฐ์ ๋์์ ํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด count์ ์ ์๋ฅผ ์ง์ ํ์ฌ ์ํํ๋ค.
# 1_iam_user_test.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_iam_user" "myiam" {
**count = 3**
name = "myuser.**${count.index}**"
}
์ค์ต2. count ์ ๋ ฅ ๋ณ์๋ฅผ ํตํด IAM ์ฌ์ฉ์ ์์ฑ
count์ ๋ฐฐ์ด ์กฐ ๊ตฌ๋ฌธ๊ณผ length ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ ์ฌ์ฉ์๋ฅผ ์์ฑํ ์ ์๋ค.
์ด์ 1_iam_user_test.tf ํ์ผ ๋ด์ฉ์ ์์ ํ๊ณ , 2_variable.tf ํ์ผ์ ์์ฑํ๋ค.
# 1_iam_user_test.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_iam_user" "myiam" {
**count = length(var.user_names)
name = var.user_names[count.index]**
}
# 2_variable.tf
variable "user_names" {
description = "Create IAM users with these names"
type = list(string)
default = ["chanwoo", "devops", "study"]
}
chanwoo, devops, study 3๊ฐ์ IAM ๊ณ์ ์ด ์์ฑ๋๋ค.
์ค์ต 3. count ์ ์ฝ์ฌํญ (์ธ๋ผ์ธ ๋ธ๋ก ๋ฐ๋ณต X)
count์ ๊ฒฝ์ฐ ๋ฐฐ์ด ์ค๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ ์ค๊ฐ์ ๋ฐฐ์ด์ด ์ญ์ ๋๊ฒ ๋๋ฉด ๋ชจ๋ ํญ๋ชฉ์ด ์์ผ๋ก ๋น๊ฒจ์ง๊ฒ ๋๋๋ฐ, ํ ๋ผํผ์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ฆฌ์์ค ์๋ณ์๋ก ํ๋จํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค 1์์ ๊ณ์ ์ญ์ , ์ธ๋ฑ์ค 2์์ ๊ณ์ ์์ฑ ๋ฑ์ผ๋ก ๋ณด๊ฒ ๋๋ค.
์ฆ, count ์ฌ์ฉ ์ ๋ชฉ๋ก ์ค๊ฐ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ฉด ํ ๋ผํผ์ ํด๋น ํญ๋ชฉ ๋ค ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ ํ ๋ค์ ์์ฑํ๊ฒ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด IAM ํญ๋ชฉ์ ์์ ํ๊ณ plan์ ์งํํ๊ฒ ๋ค.
# 2_variable.tf
variable "user_names" {
description = "Create IAM users with these names"
type = list(string)
# ์ค๊ฐ devops ๊ฐ์ ์ ๊ฑฐ
# default = ["chanwoo", "devops", "study"]
default = ["chanwoo", "study"]
}