728x90
- count는 resource에서만 사용 가능
- count는 resource의 가장 처음에 적는 것이 관습
- 0부터 시작하는 count.index를 참조하여 사용
예시 : count에 값에 정수인 인수가 포함된 경우 Terraform은 그만큼의 인스턴스를 생성한다.
resource "aws_instance" "server" {
count = 4 # create four similar EC2 instances
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
tags = {
Name = "Server ${count.index}"
}
}
📝main.tf : eip에서 instance에 count.index를 통해 참조한다.
resource "aws_instance" "app_server" {
count = 2 #count
#aws_instance.app_server[0]
#aws_instance.app_server[1]
ami = var.aws_amazon_linux_ami[var.aws_region]
instance_type = "t3.small"
#availability_zone = var.aws_availability_zone[var.aws_region]
vpc_security_group_ids = [aws_security_group.app_server_sg.id]
key_name = aws_key_pair.app_server_key.key_name
subnet_id = module.app_vpc.public_subnets[0]
tags = local.common_tags
}
resource "aws_eip" "app_server_eip" {
count = 2 #count
vpc = true
instance = aws_instance.app_server[count.index].id #instance 참조
tags = local.common_tags
}
output에서는 count 사용이 불가능하다. => asterisk(*)를 통해 전체 참조하는 것이 일반적이다.
output "app_server_elastic_ip" {
value = aws_eip.app_server_eip.*.public_ip
}
output "app_server_public_ip" {
value = aws_instance.app_server.*.public_ip
}
count를 매번 변경하기는 번거로우므로, 변수 처리해주는 것이 좋다.
📝variable.tf
variable "instance_count" {
description = "Instance Count"
type = number
default = 2
}
📝terraform.tfvars
instance_count = 4
📝 main.tf
resource "aws_eip" "app_server_eip" {
count = var.instance_count
vpc = true
instance = aws_instance.app_server[count.index].id
tags = local.common_tags
}
모듈러(%) 활용하기
count가 서브넷의 개수를 넘어서는 것과 같은 경우를 대비하여 순환을 위해 모듈러 연산자(%)를 활용한다.
resource "aws_instance" "app_server" {
count = var.instance_count
#aws_instance.app_server[0]
#aws_instance.app_server[1]
ami = data.aws_ami.ubuntu_image.id
instance_type = "t3.small"
vpc_security_group_ids = [aws_security_group.app_server_sg.id]
key_name = aws_key_pair.app_server_key.key_name
subnet_id = module.app_vpc.public_subnets[count.index % length(module.app_vpc.public_subnets)] #모듈려 연산자 활용
tags = local.common_tags
}
length function
length : list, map, string의 length를 반환
서브넷의 개수가 바뀌면 계속 수정해줘야하는 번거로움을 줄이기 위해 length() 함수를 사용할 수 있다.
subnet_id = module.app_vpc.public_subnets[count.index % length(module.app_vpc.aws_subnet.public_subnets)]
728x90