[Terraform] for_each 구문DevOps/Terraform2022. 10. 19. 17:46
Table of Contents
728x90
테라폼에서 여러 리소스를 한번에 생성하는 방법으로는 count와 for_each가 있다.
for_each
- Terraform에서 정의한 메타 인수이다.
- 모듈 또는 모든 리소스 유형과 함께 사용할 수 있다.
- Terraform은 map과 set의 각 구성에 대해 하나의 인스턴스를 생성한다.
예시
1. Map을 사용한 for_each
resource "azurerm_resource_group" "rg" {
for_each = {
a_group = "eastus"
another_group = "westus2"
}
name = each.key
location = each.value
}
2. Set을 사용한 for_each
resource "aws_iam_user" "the-accounts" {
for_each = toset( ["Todd", "James", "Alice", "Dottie"] )
name = each.key
}
each Object
for_each가 설정된 블록에서는 표현식에서 각 개체를 추가로 사용할 수 있으므로 각 인스턴스의 구성을 수정할 수 있다.
개체에는 두가지 속성이 있다.
- each_key : 인스턴스에 해당하는 Map의 key(또는 Set의 Value)이다.
- each_value : 인스턴스에 해당하는 Map의 Value(Set은 each.key와 동일하다.)
예제
IAM 유저를 생성하는데 Kevin, John, Kelly라는 사용자를 생성하고 그룹을 devops라고 해보자
users.tf
resource "aws_iam_user" "users" {
count = length(var.users)
name = var.users[count.index]
path = "/devops/"
tags = {
Team = "devops"
}
}
variables.tf
variable "users" {
type = list(string)
default = [
"kevin",
"john",
"kelly",
]
}
이때, Kevin을 삭제해야 한다면 varibles.tf를 수정해야 한다.
Terraform will perform the following actions:
# aws_iam_user.users[0] will be updated in-place
~ resource "aws_iam_user" "users" {
id = "kevin"
}
# aws_iam_user.users[1] will be updated in-place
~ resource "aws_iam_user" "users" {
id = "john"
~ name = "john" -> "kelly"
}
# aws_iam_user.users[2] will be destroyed
- resource "aws_iam_user" "users" {
- id = "kelly" -> null
- name = "kelly" -> null
}
Plan: 0 to add, 2 to change, 1 to destroy.
만약 Kevin을 삭제하고 terraform plan을 실행한다면 다음과 같이 John과 kelly에 대해서도 updated 상태가 된다.
왜냐하면 users.tf의 count는 index가 존재하고 index를 통해 상태가 저장되는데 Kevin이 삭제된다면 index가 변경된다.
이로 인해 John, Kelly도 업데이트가 되는 것이다.
이를 위해 for_each가 등장했다.
for_each는 index가 없어서 상태가 변하지 않는다.
users.tf와 variables.tf를 다음과 같이 변경해보자
resource "aws_iam_user" "users" {
for_each = var.users <- 변경
name = each.key. <- 변경
path = "/devops/"
tags = {
Team = "devops"
}
}
variable "users" {
type = set(string) < 변경
default = [
"kevin",
"john",
"kelly",
]
}
이후 kevin을 삭제하면
Terraform will perform the following actions:
# aws_iam_user.users["kevin"] will be destroyed
- resource "aws_iam_user" "users" {
- id = "kevin" -> null
- name = "kevin" -> null
}
Plan: 0 to add, 0 to change, 1 to destroy.
Kevin만 삭제되는 것을 확인할 수 있다.
참고
728x90
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] input, local, output, data 비교 (0) | 2022.10.20 |
---|---|
[Terraform] 독립적인 배포 환경 만들기 (0) | 2022.05.03 |
[Terraform] 백엔드 (Backend) (0) | 2022.05.03 |
[Terraform] 데이터 소스 (Data Source) (1) | 2022.04.25 |
[Terraform] Count (0) | 2022.04.25 |
@TTOII :: 뭉게뭉게 클라우드
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!