실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성

2023. 12. 18. 00:43·DevOps/테라폼(Terraform)
반응형
 
 

이번에는 Auto Scaling Group과 Capacity Provider를 테라폼 모듈로 생성하자

📌 서론

이전 포스트에서 vpc와 subnet을 설정했고 EC2 런치 템플릿을 모듈로 생성했다. 이렇게 생성한 EC2 런치 템플릿은 ASG에 의해 사용되어 인스턴스의 생성을 관리해 주고, 용량 공급자(Capacity Provider)는 ASG와 연결되어 인스턴스의 스케일링을 관리하는 데 도움을 준다. ASG는 EC2 런치 템플릿을 바탕으로 EC2 인스턴스의 생성 및 관리를 담당하며, 용량 공급자는 이런 ASG를 활용해 ECS 환경에서의 자동 스케일링을 조절한다.
이렇게 설정된 ASG는 ECS 클러스터와 연결되어, ECS에서 실행되는 컨테이너들이 적절한 자원을 가진 인스턴스에서 실행될 수 있도록 해준다. 이 과정에서 ASG의 스케일링 정책과 ECS의 태스크 관리 기능이 서로 협력하게 된다.

 

이 글을 이해하기 위해서는 이전 포스트를 꼭 확인하도록 하자👇🏻👇🏻

 

실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축

지금부터 실제 사이드 프로젝트에 적용시킨 테라폼 코드를 알아보자 테라폼을 실전에 적용하면서 많은 것을 배웠지만 주로 한국보다는 외국 블로그나 커뮤니티에 필요했던 자료가 존재했던 것

curiousjinan.tistory.com

 

network 및 ASG와 Provider 설정
network 및 ASG와 Provider 설정

 

 

 

 

EC2 Launch Template을 사용하는 오토 스케일링 그룹(ASG)에 대해 자세히 알아보자


 

 

1. 오토스케일링 그룹(Auto Scaling group) 모듈 생성하기

1-1. Auto Scaling Group 이해하기

  • Auto Scaling Group(ASG)의 기능은 EC2 인스턴스들의 집합을 관리해 주는 건데, 트래픽이나 사용량에 따라 인스턴스의 수를 자동으로 조절해 준다. ASG를 설정할 때 EC2 런치 템플릿을 사용하여 인스턴스가 어떻게 생성될지 규정할 수 있다.

autoscailingGroup
autoscailingGroup

 

1-2. aws 콘솔에서 asg설정하는 방법

  • aws 콘솔에서 asg가 설정되는 과정을 직접 확인해보고 싶다면 ecs클러스터 생성을 해보면 된다. ecs 클러스터 생성 페이지에서 EC2 인스턴스를 선택하면 "Auto Scaling 그룹"을 설정할 수 있다.

aws 콘솔에서 ECS 클러스터 생성하는 과정
aws 콘솔에서 ECS 클러스터 생성하는 과정

 

 

 

 

이제 ASG를 설정하는 테라폼 코드를 작성해보자



 

1-3. Auto Scaling group 코드 작성

  • 우선 테라폼에서 autoscaling_group서브모듈을 생성하고 내부 폴더의 구조를 잡아준다. (main, outputs, variables).tf 파일 생성한다.

 

서브모듈 패키지 구조
서브모듈 패키지 구조

 

  • main.tf

테라폼 asg 코드
테라폼 asg 코드

# 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에서 생성한 모듈 사용하기

ASG 모듈 사용
ASG 모듈 사용

 

# 오토 스케일링 그룹 생성
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 인스턴스)의 수를 자동으로 관리해 주는 도구다. 예를 들어, 애플리케이션이 더 많은 트래픽을 받을 때, 용량 공급자는 더 많은 서버를 자동으로 추가해서 부하를 분산시키고, 트래픽이 줄어들면 서버 수를 줄인다.

capacity-provider
capacity-provider

 

 

2-2. 용량 공급자(Capacity Provider)와 ASG의 연결

  • 용량 공급자는 특정 ASG와 연결되어 동작한다. 이 연결을 통해 ECS 클러스터에서 실행되는 서비스의 컴퓨팅 자원 요구사항에 맞춰 EC2 인스턴스의 수를 자동으로 조절하게 된다. (ECS 클러스터는 용량 공급자와 연결되어 있다.)
  • 용량 공급자는 ASG의 Scaling링 규칙을 사용하여, 서비스의 부하와 트래픽 변화에 따라 인스턴스를 추가하거나 제거한다. 예를 들어, ECS 서비스가 더 많은 리소스를 필요로 할 때, 용량 공급자는 ASG에게 EC2 인스턴스를 더 생성하도록 지시하고, 반대로 리소스 사용량이 줄면 인스턴스를 줄인다.

오토스케일링 그룹과 용량공급자 연결

 

2-3. 코드 작성하기

테라폼 capacity provider 코드 작성
테라폼 capacity provider 코드 작성

 

  • 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클러스터 생성방법 또한 소개할 예정이다.)

capacity provider 모듈 사용
capacity provider 모듈 사용

 

# 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. 이전 시리즈부터 지금까지 이어진 내용은 다음과 같다.

  1. 테라폼에 제공자를 aws로 설정
  2. vpc와 subnet을 생성하는 모듈을 생성
  3. Auto scaling group을 생성하는 모듈 생성
  4. Capacity Provider를 생성하는 모듈 생성

 

 

 

다음 포스트에서는 ECS 클러스터, 태스크 정의, 서비스 생성을 할 예정이다. 지금 ASG와 Capacity provider를 사용한 코드를 보면 멤버, 레시피만 존재한다. 우리 팀의 프로젝트 특성상 Zipkin서버에서 사용 중인 ECS는 ASG를 사용하지 않는다. 그 이유에 대해서는 다음 시리즈에서 설명하도록 하겠다,



 

 

다음 포스트 👇🏻👇🏻

 

실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기

이번 포스트에서는 ECS를 실행시키기 위해 필요한 (cluster, service, task)를 구성해 보자 이전 포스트의 게시글을 읽고 와야 내용이 이어지니 보고 오시는 것을 추천합니다! 실전! 테라폼 적용기3편 -

curiousjinan.tistory.com

 

반응형

'DevOps > 테라폼(Terraform)' 카테고리의 다른 글

실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기  (3) 2023.12.18
실전! 테라폼 적용기 [추가설명] - dynamic 블록 사용하기  (0) 2023.12.18
실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축  (0) 2023.12.16
실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화  (2) 2023.12.09
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기  (0) 2023.12.07
'DevOps/테라폼(Terraform)' 카테고리의 다른 글
  • 실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기
  • 실전! 테라폼 적용기 [추가설명] - dynamic 블록 사용하기
  • 실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축
  • 실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화
Stark97
Stark97
문의사항 또는 커피챗 요청은 링크드인 메신저를 보내주세요! : https://www.linkedin.com/in/writedev/
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (249) N
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (6)
      • MSA (15)
      • DDD (12)
      • gRPC (9)
      • Apache Kafka (18)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
      • 채팅 서비스 (1) N
      • AI 탐험대 (1)
      • 팀 Pulse (0)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성
상단으로

티스토리툴바