✔️ Count
count는 meta argument이다.
resource "aws_instance" "server" {
count = 4 # create four similar EC2 instances
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
tags = {
Name = "Server ${count.index}"
}
}
모듈 내부 코드를 살펴보면 첫 줄에 count 선언이 되어있다.
count는 리소스의 제일 처음에 쓰는 것이 관습이다.
당연하겠지만 count를 사용해서 생성되는 리소스들은 같은 조건 (서브넷, 이미지, 보안 그룹 등등)으로 생성된다.
output.tf
파일을 이용해 연결된 app_server와 eip 쌍의 값을 출력해보자
✔️ count.index
count
Object
count가 설정된 블록에서는 표현식에서 추가 count 개체를 사용할 수 있으므로 각 인스턴스의 구성을 수정할 수 있다.
이 개체에는 하나의 속성이 있다.
- count.index — 이 인스턴스에 해당하는 고유 인덱스 번호(0부터 시작).
인스턴스가 만들어질때 aws_instance.app_server[0] 으로 처음 만들어질 것이므로 count
를 사용할 수 있다.
output.tf
output "app_server_elastic_ip" {
count = 2
value = aws_eip.app_server_eip[count.index].public_ip
}
output "app_server_public_ip" {
count = 2
value = aws_instance.app_server[count.index].public_ip
}
이렇게 하면 오류가 난다.
output 블록에서는 count argument를 사용할 수 없다.
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
}
terraform output 하면 인스턴스의 public ip, eip 값이 쌍으로 출력된다.
variable.tf
에서 instance_count를 선언하고
variable "instance_count" {
description = "Instance Count"
type = number
default = 2
}
terraform.tfvars 파일에서 따로 관리하면 더 편리하게 인스턴스 수를 조정할 수 있다.
instance_count = 4
main.tf
root 모듈에서 인스턴스 수를 다음과 같이 참조하면 된다.
resource "aws_instance" "app_server" {
count = var.instance_count
추가로 subnet을 count.index 를 사용해 생성해보자
다음은 main.tf 파일에서 vpc module을 사용하는 코드이다.
해당 코드에서 사용할 수 있는 public, private 서브넷의 수는 각각 4개씩이다.
module "app_vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "app_vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c", "ap-northeast-2d"]
public_subnets = ["10.0.0.0/24", "10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
private_subnets = ["10.0.10.0/24", "10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"]
}
이때 생성할 subnet의 개수를 instance = 5로 하면 생성할 수 없다고 뜬다.
왜 그럴까? 서브넷 생성 후 배치를 어디에 하느냐에 대한 문제이다.
우선 인덱스에 증가순으로 서브넷을 생성한뒤 다음 서브넷은 어디에 생성해야 할지 알지 못한다.
이때는 서브넷을 순환적으로 생성하는 것이 좋다.
✔️ modulo / modular
리소스를 순환적으로 생성하기 위해 사용하는 연산이 모듈로 연산이다.
%
M % N = R(emain: 나머지)
M mod N = R
0 % 4 = 0
1 % 4 = 1
2 % 4 = 2
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1
6 % 4 = 2
7 % 4 = 3
생성할 인스턴스 수를 6으로 하면 2a, 2b, 2c, 2d, 2a, 2b ... 이렇게 서브넷의 AZ가 순환하게된다.
그러면 하나의 문제가 있는데 지금은 서브넷이 4개지만 만약 서브넷을 3개로 구성한다면
modular 또한 3으로 나눠야 하고 그에 맞춰 순환적으로 생성되도록 해야한다.
사용할 서브넷이 자주 변경되는 경우 이 조차도 번거로울 수 있다.
이때는 length() 함수를 이용해 처리할 수 있다.
subnet_id = module.app_vpc.public_subnets[count.index % length(module.app_vpc.public_subnets)]
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] 백엔드 (Backend) (0) | 2022.05.03 |
---|---|
[Terraform] 데이터 소스 (Data Source) (1) | 2022.04.25 |
[Terraform] 모듈 (Module) (0) | 2022.04.23 |
[Terraform] 프로비저너 (Provisioner) (0) | 2022.04.22 |
[Terraform] ec2 인스턴스 생성시 사용자 데이터 실행하기 (0) | 2022.04.22 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!