이번에는 Auto Scaling Group과 Capacity Provider를 테라폼 모듈로 생성하자
📌 서론
이전 포스트에서 vpc와 subnet을 설정했고 EC2 런치 템플릿을 모듈로 생성했다. 이렇게 생성한 EC2 런치 템플릿은 ASG에 의해 사용되어 인스턴스의 생성을 관리해 주고, 용량 공급자(Capacity Provider)는 ASG와 연결되어 인스턴스의 스케일링을 관리하는 데 도움을 준다. ASG는 EC2 런치 템플릿을 바탕으로 EC2 인스턴스의 생성 및 관리를 담당하며, 용량 공급자는 이런 ASG를 활용해 ECS 환경에서의 자동 스케일링을 조절한다.
이렇게 설정된 ASG는 ECS 클러스터와 연결되어, ECS에서 실행되는 컨테이너들이 적절한 자원을 가진 인스턴스에서 실행될 수 있도록 해준다. 이 과정에서 ASG의 스케일링 정책과 ECS의 태스크 관리 기능이 서로 협력하게 된다.
이 글을 이해하기 위해서는 이전 포스트를 꼭 확인하도록 하자👇🏻👇🏻
EC2 Launch Template을 사용하는 오토 스케일링 그룹(ASG)에 대해 자세히 알아보자
1. 오토스케일링 그룹(Auto Scaling group) 모듈 생성하기
1-1. Auto Scaling Group 이해하기
- Auto Scaling Group(ASG)의 기능은 EC2 인스턴스들의 집합을 관리해 주는 건데, 트래픽이나 사용량에 따라 인스턴스의 수를 자동으로 조절해 준다. ASG를 설정할 때 EC2 런치 템플릿을 사용하여 인스턴스가 어떻게 생성될지 규정할 수 있다.
1-2. aws 콘솔에서 asg설정하는 방법
- aws 콘솔에서 asg가 설정되는 과정을 직접 확인해보고 싶다면 ecs클러스터 생성을 해보면 된다. ecs 클러스터 생성 페이지에서 EC2 인스턴스를 선택하면 "Auto Scaling 그룹"을 설정할 수 있다.
이제 ASG를 설정하는 테라폼 코드를 작성해보자
1-3. Auto Scaling group 코드 작성
- 우선 테라폼에서 autoscaling_group서브모듈을 생성하고 내부 폴더의 구조를 잡아준다. (main, outputs, variables).tf 파일 생성한다.
- main.tf
# AWS Auto Scaling 그룹 리소스를 선언
resource "aws_autoscaling_group" "asg" {
vpc_zone_identifier = var.vpc_subnets # VPC 서브넷 ID들 설정
desired_capacity = 1 # 원하는 용량(시작할 인스턴스 수)
max_size = 1 # 최대 크기(인스턴스 최대 수)
min_size = 1 # 최소 크기(인스턴스 최소 수)
# Auto Scaling 그룹의 이름을 지정. 변수를 사용하여 접두사를 추가한다.
name = "${var.name_prefix}-asg"
# Auto Scaling 그룹이 사용할(EC2) 실행 템플릿을 지정한다.
launch_template {
id = var.launch_template_id # 실행 템플릿 ID
version = "$Latest" # 사용할 템플릿 버전
}
# 인스턴스 시작 시 태그를 전파한다.
tag {
key = "AmazonECSManaged"
value = true
propagate_at_launch = true # 인스턴스 시작 시 이 태그를 적용
}
}
- outputs.tf
output "asg_arn" {
description = "ARN of the Auto Scaling Group."
value = aws_autoscaling_group.asg.arn
}
- variables.tf
variable "vpc_subnets" {
description = "VPC subnets for the Auto Scaling Group."
type = list(string)
}
variable "launch_template_id" {
description = "ID of the launch template to use for the Auto Scaling Group."
type = string
}
variable "name_prefix" {
description = "Prefix to be added to the name of the Auto Scaling Group."
type = string
}
1-4. root 경로의 main.tf에서 생성한 모듈 사용하기
# 오토 스케일링 그룹 생성
module "{모듈명 작성}" {
source = "{asg 서브모듈이 존재하는 경로 작성}"
vpc_subnets = ["{서브넷 적기}"]
launch_template_id = {ec2 런치 템플릿 작성 -> 모듈로 선언했으니 모듈에서 참조해서 사용}
name_prefix = "{이름에 접두사 추가}"
}
이제 ASG를 활용해 ECS 환경에서 자동 스케일링을 조절하는 용량 공급자를 생성하자
2. 용량공급자(Capacity Provider) 모듈 생성하기
2-1. 용량 공급자(Capacity Provider) 이해하기
- 용량 공급자(Capacity Provider)는 AWS ECS(Elastic Container Service)에서 사용되는 개념이다. 간단히 말해서, ECS에서 컨테이너를 실행할 때 필요한 서버(즉, EC2 인스턴스)의 수를 자동으로 관리해 주는 도구다. 예를 들어, 애플리케이션이 더 많은 트래픽을 받을 때, 용량 공급자는 더 많은 서버를 자동으로 추가해서 부하를 분산시키고, 트래픽이 줄어들면 서버 수를 줄인다.
2-2. 용량 공급자(Capacity Provider)와 ASG의 연결
- 용량 공급자는 특정 ASG와 연결되어 동작한다. 이 연결을 통해 ECS 클러스터에서 실행되는 서비스의 컴퓨팅 자원 요구사항에 맞춰 EC2 인스턴스의 수를 자동으로 조절하게 된다. (ECS 클러스터는 용량 공급자와 연결되어 있다.)
- 용량 공급자는 ASG의 Scaling링 규칙을 사용하여, 서비스의 부하와 트래픽 변화에 따라 인스턴스를 추가하거나 제거한다. 예를 들어, ECS 서비스가 더 많은 리소스를 필요로 할 때, 용량 공급자는 ASG에게 EC2 인스턴스를 더 생성하도록 지시하고, 반대로 리소스 사용량이 줄면 인스턴스를 줄인다.
2-3. 코드 작성하기
- main.tf
# ECS 클러스터에 대한 개별 용량 공급자를 정의한다.
resource "aws_ecs_capacity_provider" "ecs_capacity_provider_resource" {
name = var.name # 용량 공급자의 이름을 지정한다. 변수를 통해 외부에서 값을 받는다.
# 오토 스케일링 그룹과 관련된 설정을 정의한다.
auto_scaling_group_provider {
auto_scaling_group_arn = var.auto_scaling_group_arn # 오토 스케일링 그룹의 ARN을 지정한다. 변수를 사용해 값을 받는다.
# 관리 스케일링에 대한 설정을 정의한다.
managed_scaling {
maximum_scaling_step_size = var.maximum_scaling_step_size # 스케일링을 할 때 한 번에 증가시킬 수 있는 최대 인스턴스 수
minimum_scaling_step_size = var.minimum_scaling_step_size # 스케일링을 할 때 한 번에 감소시킬 수 있는 최소 인스턴스 수
status = var.status # 관리 스케일링의 활성화 상태 (예: 'ENABLED', 'DISABLED')
target_capacity = var.target_capacity # 목표 용량 (예: 클러스터에서 유지하고자 하는 전체 용량의 백분율)
}
}
}
# 특정 ECS 클러스터에 하나 이상의 용량 공급자를 연결하는 데 사용된다.
resource "aws_ecs_cluster_capacity_providers" "ecs_cluster_capacity_providers" {
cluster_name = var.cluster_name # 연결할 ECS 클러스터의 이름을 지정한다.
# 사용할 용량 공급자의 목록을 지정한다. 여기서는 위에서 정의한 용량 공급자를 사용한다.
capacity_providers = [aws_ecs_capacity_provider.ecs_capacity_provider_resource.name]
# 기본 용량 공급자 전략을 정의한다. 이 설정은 클러스터에서 새 서비스를 시작할 때 사용된다.
default_capacity_provider_strategy {
base = var.base # 기본 인스턴스 수를 지정한다. 이 값은 최소한으로 유지되는 인스턴스의 수를 의미한다.
weight = var.weight # 용량 공급자의 가중치를 지정한다. 가중치가 높을수록 더 많은 태스크가 할당된다.
capacity_provider = aws_ecs_capacity_provider.ecs_capacity_provider_resource.name # 사용할 용량 공급자의 이름을 지정한다.
}
}
- outputs.tf
output "capacity_provider_arn" {
value = aws_ecs_capacity_provider.ecs_capacity_provider_resource.arn
}
output "capacity_provider_name" {
value = aws_ecs_capacity_provider.ecs_capacity_provider_resource.name
}
- variables.tf
variable "name" {
description = "The name of the capacity provider."
type = string
}
variable "auto_scaling_group_arn" {
description = "ARN of the Auto Scaling group."
type = string
}
variable "maximum_scaling_step_size" {
description = "Maximum step size of scaling."
type = number
default = 1
}
variable "minimum_scaling_step_size" {
description = "Minimum step size of scaling."
type = number
default = 1
}
variable "status" {
description = "Status of the managed scaling (ENABLED or DISABLED)."
type = string
default = "ENABLED"
}
variable "target_capacity" {
description = "Target capacity for scaling."
type = number
default = 100
}
variable "cluster_name" {
description = "ECS Cluster 이름"
}
variable "base" {
description = "Default Capacity Provider Strategy의 base"
default = 1
}
variable "weight" {
description = "Default Capacity Provider Strategy의 weight"
default = 100
}
2-4. root 경로의 main.tf에서 생성한 모듈 사용하기
- 용량 공급자 모듈은 위에서 먼저 작성한 auto scaling group 모듈을 가져다 사용한다. 그리고 아직은 선언하지 않은 ecs 클러스터도 연결해 준다. (추후 이어지는 시리즈에서 ecs클러스터 생성방법 또한 소개할 예정이다.)
# ecs 용량 공급자 생성
module "{원하는 모듈명}" {
source = "{용량 공급자 서브모듈 경로}"
name = "{모듈이름}"
auto_scaling_group_arn = {asg arn 적기 -> 모듈로 선언했으니 모듈에서 arn 접근하기}
maximum_scaling_step_size = 1
minimum_scaling_step_size = 1
status = "ENABLED"
target_capacity = 100
cluster_name = {ecs 클러스터명}
base = 1
weight = 100
}
지금까지 이어진 시리즈의 진행상황은 다음과 같다.
3. 시리즈 진행상황
3-1. 이전 시리즈부터 지금까지 이어진 내용은 다음과 같다.
- 테라폼에 제공자를 aws로 설정
- vpc와 subnet을 생성하는 모듈을 생성
- Auto scaling group을 생성하는 모듈 생성
- Capacity Provider를 생성하는 모듈 생성
다음 포스트에서는 ECS 클러스터, 태스크 정의, 서비스 생성을 할 예정이다. 지금 ASG와 Capacity provider를 사용한 코드를 보면 멤버, 레시피만 존재한다. 우리 팀의 프로젝트 특성상 Zipkin서버에서 사용 중인 ECS는 ASG를 사용하지 않는다. 그 이유에 대해서는 다음 시리즈에서 설명하도록 하겠다,
다음 포스트 👇🏻👇🏻
'AWS > 테라폼(Terraform)' 카테고리의 다른 글
실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기 (3) | 2023.12.18 |
---|---|
실전! 테라폼 적용기 [추가설명] - dynamic 블록 사용하기 (0) | 2023.12.18 |
실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축 (0) | 2023.12.16 |
실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화 (1) | 2023.12.09 |
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기 (0) | 2023.12.07 |