728x90
반응형
SMALL
SMALL
이번엔 루프를 이용해보자. 다음 main.tf 파일을 보자.
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_iam_group" "developer" {
name = "developer"
}
resource "aws_iam_group" "employee" {
name = "employee"
}
output "groups" {
value = [
aws_iam_group.developer,
aws_iam_group.employee
]
}
variable "users" {
type = list(any)
}
resource "aws_iam_user" "this" {
for_each = {
for user in var.users : user.name => user
}
name = each.key
tags = {
level = each.value.level
role = each.value.role
}
}
resource "aws_iam_user_group_membership" "this" {
for_each = {
for user in var.users : user.name => user
}
user = each.key
groups = each.value.is_developer ? [
aws_iam_group.developer.name, aws_iam_group.employee.name
] : [
aws_iam_group.employee.name
]
}
locals {
developers = [
for user in var.users : user if user.is_developer
]
}
resource "aws_iam_user_policy_attachment" "developer" {
for_each = {
for user in local.developers : user.name => user
}
user = each.key
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
depends_on = [ aws_iam_user.this ] # 이 리소스가 생성되어야만 가능하게 설정
}
output "developers" {
value = local.developers
}
output "high_level_users" {
value = [
for user in var.users : user if user.level > 5
]
}
그리고 변수를 정의한 파일인 terraform.tfvars 파일은 다음과 같다.
users = [
{
name = "john"
level = 7
role = "재무"
is_developer = false
},
{
name = "alice"
level = 1
role = "인턴 개발자"
is_developer = true
},
{
name = "tony"
level = 4
role = "데브옵스"
is_developer = true
},
{
name = "cindy"
level = 9
role = "경영"
is_developer = false
},
{
name = "hoon"
level = 3
role = "마케팅"
is_developer = false
}
]
이런식으로 for 문을 사용할 수 있다.
resource "aws_iam_user" "this" {
for_each = {
for user in var.users : user.name => user
}
name = each.key
tags = {
level = each.value.level
role = each.value.role
}
}
코드를 보면 이러한 구문이 있다.
for user in var.users : user.name => user
선언한 users 라는 변수에 담긴 각각의 유저 하나씩 루프를 돌리는데 이걸 담는 형태가 Map 형식이기 때문에 Key/Value를 다음과 같이 선언하는 것.
user.name => user
Map이 아닌 배열로 담는 경우 다음과 같이 사용한다.
locals {
developers = [
for user in var.users : user if user.is_developer
]
}
다만, 이 배열에 담을 땐 조건이 따른다. 그래서 if가 있다. 조건 없이 모두 넣으려고 한다면 이렇게 사용하면 된다.
locals {
developers = [
for user in var.users : user
]
}
그리고 위 main.tf 파일에서 한 가지 새로운 개념인 depends_on 이 있다.
resource "aws_iam_user_policy_attachment" "developer" {
for_each = {
for user in local.developers : user.name => user
}
user = each.key
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
depends_on = [ aws_iam_user.this ] # 이 리소스가 생성되어야만 가능하게 설정
}
이 depends_on이 있는 리소스는 depends_on에 걸려있는 리소스가 생성되어야만 만들어지는 리소스임을 의미한다.
728x90
반응형
LIST
'IaC(Infrastructure as Code)' 카테고리의 다른 글
Terraform Commands (taint / untaint) (0) | 2024.03.08 |
---|---|
Terraform State (0) | 2024.03.07 |
AWS + Terraform (Conditions) (0) | 2024.03.07 |
AWS + Terraform (For-Each) (0) | 2024.03.06 |
AWS + Terraform (Module) (0) | 2024.03.06 |