저번강의에서는 count랑 for_each에 대해 알아보았었습니다. 이 둘은 module, resource, data에서 사용 가능한 특수한 속성이였습니다. 하지만 이는 테라폼의 모든 곳에서 활용 가능합니다.
https://www.terraform.io/language/expressions/for
위 공식문서를 기준으로 실습을 진행해 보도록 하겠습니다.
간단히 위 코드를 분석해 보도록 하겠습니다. 위 코드를 분석하기 위해서 var가 아래와 같은 json이라고 해 봅시다.
{
"a" = "aaa",
"b" = "bbb",
"c" = "ccc",
}
그렇다면 k, v에는 각각 key value가 들어가므로 [ 1 + 3, 1 + 3, 1 + 3 ]이므로 [4, 4, 4]이 반환되게 됩니다.
그리고 var.map이 아닌 var.list로 하게 되면, i,v에는 index, value가 오게 됩니다. 따라서 [ "a", "b" ]와 같은 배열이 있다고 해 봅시다. 그럼 반환되는 배열은 ["0 is a", "1 is b"]이 됩니다.
그리고 위와 같은 코드의 결과는 ["aa", "bb"]을 활용하겠습니다. 그럼 key => value의 형태를 지정해 준 것이라고 보면 되므로 결국 아래와 같은 map이 반환될겁니다.
{
"aa" = "AA"
"bb" = "BB"
}
마지막으로 하나 더 예제를 살펴보고 실습을 해보겠습니다.
위 코드를 ["aa", "", "", "bb"]와 같은 배열로 진행한다고 해 봅시다. 그럼 if문에 부합하는 조건을 가진 것만 upper를 시킨다고 보면 됩니다. 그러므로 ["AA", "BB"]가 반환되게 되는 것입니다.
이제 심화된 코드를 짜보겠습니다.
/main.tf
provider "aws" {
region = "ap-northeast-2"
}
/**
* Groups
*/
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,
]
}
/**
* Users
*/
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"
# 의존성을 계산 -> aws_iam_user.this 다음에 실행되어야 함.
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
]
}
이 코드는 위에서 설명한 모든 개념을 한번에 쓴 코드입니다.
Groups
우선 aws_iam_group을 통해서 developer, employee라는 이름의 그룹을 생성했습니다. 그리고 마지막에 output으로 groups을 출력했습니다.
Users
그리고 users라는 변수를 외부에서 참조하게 했습니다. 이는 모든 user의 정보를 담고 있는 tfars파일입니다.
/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
},
]
이와 같은 배열을 받게 했습니다.
그리고 aws_iam_user에 this라는 이름으로 user.name을 key로 갖고 user를 value로 갖는 map을 만들어 for_each에 저장했습니다. 그리고 이의 이름을 each.key로 지정해서 각각의 이름으로 설정해 놨습니다. 그리고 태그는 각각의 값의 level, role로 설정했습니다. 나중에 한번에 실행하고 결과로 보여드리겠습니다.
그다음에는 aws_iam_user_group_membersh을 설정해 주는데, is_developer가 true라면 aws_iam_group.developer.name,daws_iam_group.employee.name2개의 그룹에 속하게 하고, false라면 employee에만 속하게 코딩했습니다.
그 다음으로는 지역변수로 developers를 지정했습니다. 이는 외부 파일에서 주입받은 is_developer가 true인 map만 받아 온 것입니다.
마지막으로 이제 위에서 지역변수로 선언한 developer들에게 AdministratorAccess정책을 부여해 주는 코드를 작성했습니다. 그리고 여기서 중요한게 depends_on으로 aws_iam_user.this블럭이 실행되고 실행되어야 합니다. 그 이유는 aws_iam_user가 있어야 정책을 부여할 수 있기 때문입니다.
마지막으로 developers와 user.level이 5이상인 user들을 출력하고 끝내습니다. terraform apply을 하고 결과를 보겠습니다.
여기에 devlopers, groups, high_level_users가 잘 찍히는 것을 볼 수 있습니다.
일단 다음과 같이 5명이 다 생성되었고, 그룹도 developer2명에게 developer, employee group에 잘 할당된것을 보실 수 있습니다.
그리고 위와 같이 developer에게 AdministratorAccess와 태그가 잘 들어간 것을 보실 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 상태 관리 (0) | 2022.08.01 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 상태 저장소(Backend) (0) | 2022.08.01 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 조건문 (Conditional) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL count와 for_each (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL variable & local & output (0) | 2022.07.21 |