테라폼을 이용해서 ECS Cluster를 생성할 때 필수적인 용량 공급자(capacity provider)를 알아보자
1. 용량 공급자란?
기존에 AWS Console을 사용해서 ECS Cluster를 생성하던 경우에는 용량 공급자가 무엇인지 모를 수 있다.
용량 공급자는 AWS ECS 클러스터에서 컨테이너 태스크가 실행될 때 사용할 컴퓨팅 리소스(예: EC2 인스턴스, Auto Scaling 그룹)를 어떻게 관리할지 결정하는 역할을 한다. 간단히 말해, 용량 공급자는 태스크가 실행되는 '환경'을 설정하고 관리하는 규칙이라고 생각할 수 있다.
AWS Management Console을 통해 ECS 클러스터를 생성할 때, 대부분의 설정은 AWS가 자동으로 처리한다. 이는 사용자가 복잡한 설정에 대해 걱정하지 않고도 클러스터를 쉽게 만들 수 있도록 해준다. 즉, 용량 공급자와 같은 세부 사항은 AWS가 내부적으로 기본값을 사용하여 설정한다.
반면, 테라폼을 사용하여 클러스터를 구축할 때는, 이러한 세부 사항을 코드로 명시적으로 정의해야 한다. 테라폼은 '인프라스트럭처를 코드로 관리(Infrastructure as Code)'하는 도구로, 모든 설정을 코드로 작성하여 인프라를 생성하고 관리한다. 이 과정에서 용량 공급자와 같은 세부 설정을 사용자가 직접 정의하고 조절해야 한다.
테라폼을 사용하는 주된 이유 중 하나는 클러스터의 모든 측면을 정확하게 제어할 수 있다는 점에 있다. 이는 사용자가 복잡한 요구 사항이나 특정한 설정을 필요로 할 때 특히 유용하다. 사용자는 테라폼을 통해 세부적인 인프라 구성을 완전히 관리할 수 있으며, 이로 인해 보다 맞춤화된 인프라 구축이 가능해진다.
또한, 테라폼은 인프라 구축의 재현성을 제공한다. 코드를 사용하여 인프라를 구축함으로써, 동일한 설정으로 여러 번의 인프라를 구축할 수 있다. 이러한 접근 방식은 일관된 환경 구축과 관리에 매우 중요하며, 오류 가능성을 줄이고 예측 가능한 결과를 보장한다.
테라폼의 또 다른 중요한 이점은 투명성이다. 모든 구성 요소가 코드로 표현되어 인프라에 대한 변경 사항과 설정이 명확하고 투명하게 기록되며, 이는 팀원 간의 협업과 인프라의 이해를 증진시킨다. 팀원들은 코드를 통해 인프라의 현재 상태와 변화 과정을 명확하게 파악할 수 있다.
마지막으로, 테라폼은 자동화와 통합 측면에서도 큰 장점을 가진다. 테라폼은 다양한 CI/CD 도구와의 통합이 용이하며, 이를 통해 인프라의 관리와 업데이트를 자동화할 수 있다. 이는 개발 및 운영 팀의 효율성을 크게 향상시키며, 더 빠르고 안정적인 인프라 업데이트를 가능하게 한다.
결국, 테라폼을 사용하여 ECS 클러스터를 구축할 때 용량 공급자 설정은 사용자가 수동으로 수행해야 하는 중요한 단계이다. 이는 AWS Management Console에서의 자동화된 접근 방식과 다르며, 사용자에게 더 많은 제어 권한과 투명성을 제공한다. 이러한 접근 방식은 복잡한 환경을 효율적으로 관리하고, 일관된 인프라 구축을 가능하게 한다.
2. 테라폼으로 ECS를 생성할 때 순서
테라폼으로 ECS를 생성할때 헷갈리지 않도록 순서를 정해서 모듈을 작성해 보도록 하자
테라폼을 사용하여 AWS ECS(Elastic Container Service) 환경을 구축할 때, 일반적으로 권장되는 순서는 다음과 같다:
1. ECS 클러스터(Cluster)
첫 번째 단계는 ECS 클러스터를 생성하는 것이다. 클러스터는 컨테이너 태스크와 서비스가 실행되는 기반을 제공하는 논리적인 환경이다. 이 클러스터는 컨테이너화된 애플리케이션을 실행하기 위한 기반이 되므로, 이를 먼저 설정하는 것이 중요하다.
2. 용량 공급자(Capacity Provider)
클러스터가 만들어진 후, 다음 단계는 용량 공급자를 설정하는 것이다. 용량 공급자는 클러스터 내에서 실행되는 태스크가 EC2 인스턴스나 Auto Scaling 그룹을 어떻게 사용할지를 정의한다. 이 과정은 클러스터가 필요로 하는 컴퓨팅 리소스를 효율적으로 관리하는 데 핵심적인 역할을 한다.
3. 태스크 정의(Task Definition)
태스크 정의는 ECS에서 실행될 컨테이너의 세부 설정을 포함하며, 사용할 이미지, 할당될 CPU와 메모리 양, 환경 변수 등을 정의한다. 이 단계는 후속 단계에서 생성될 서비스가 참조할 기반이 되므로 중요하다.
4. ECS 서비스(Service)
마지막 단계는 ECS 서비스를 생성하는 것이다. 서비스는 앞서 정의된 태스크 정의에 따라 컨테이너 태스크를 실행하고, 필요에 따라 태스크의 수를 관리한다. 서비스는 애플리케이션의 지속적인 가용성을 보장하며, 태스크의 실행과 관리를 담당한다.
이러한 순서로 진행하는 이유는 각 단계가 서로 의존하기 때문이다. 클러스터가 없으면 용량 공급자가 참조할 대상이 없고, 용량 공급자가 없으면 서비스가 리소스를 효율적으로 관리할 수 없다. 또한, 태스크 정의 없이는 서비스가 어떤 태스크를 실행해야 할지 결정할 수 없다. 이 순서는 ECS 환경을 효율적으로 구축하는 데 있어 가장 논리적인 접근 방식이다.
그러나!!!! 사실 리소스를 생성할 때 이렇게 순서를 지키지 않아도 된다.
테라폼은 '의존성 그래프(dependency graph)'를 사용하여 리소스 간의 의존성을 파악하고, 이를 기반으로 적절한 순서로 리소스를 생성하거나 변경한다. 따라서 사용자가 모듈을 어떤 순서로 정의하든, 테라폼은 plan 또는 apply 단계에서 자동으로 최적의 순서를 결정한다.
AWS ECS 환경을 테라폼으로 구축할 때, 주요 구성 요소들(클러스터, 용량 공급자, 태스크 정의, 서비스)은 여전히 중요하지만, 이들을 정의하는 순서는 테라폼의 자동 의존성 해결 능력 때문에 크게 중요하지 않다. 예를 들어, 서비스 정의가 태스크 정의를 참조하더라도, 테라폼은 태스크 정의가 먼저 생성되도록 자동으로 조정한다.
따라서, 각 구성 요소의 역할과 중요성에 초점을 맞추면서도, 순서에 대한 걱정은 할 필요가 없다. 테라폼은 이러한 의존성을 자동으로 관리해주므로, 사용자는 각 구성 요소의 설정에 더 집중할 수 있다.
# 예시: ECS 클러스터, 용량 공급자, 태스크 정의, 서비스를 정의하는 테라폼 코드
resource "aws_ecs_cluster" "example_cluster" {
name = "example-cluster"
// 클러스터 설정
}
resource "aws_ecs_capacity_provider" "example_capacity_provider" {
name = "example-capacity-provider"
// 용량 공급자 설정
depends_on = [
aws_ecs_cluster.example_cluster
]
}
resource "aws_ecs_task_definition" "example_task_definition" {
family = "example-task-definition"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = "256"
memory = "512"
// 태스크 정의 설정
}
resource "aws_ecs_service" "example_service" {
name = "example-service"
cluster = aws_ecs_cluster.example_cluster.id
task_definition = aws_ecs_task_definition.example_task_definition.arn
// 서비스 설정
}
이 코드 예시에서 depends_on을 사용하여 명시적으로 의존성을 지정할 수도 있지만, 테라폼은 대부분의 경우 자동으로 이러한 의존성을 파악하여 처리한다. 따라서 사용자는 각 리소스의 세부 설정에 집중하며 코드를 작성할 수 있다.
3. 용량 공급자, launch template, auto scaling의 생성 순서
위에서 각 리소스가 어떤 순서로 설정되었는지 확인했으니 이제 ECS클러스터가 사용할 용량 공급자를 설정해 보자
ECS 클러스터를 생성한 후 용량 공급자를 설정하는 과정에서 Launch Template과 Auto Scaling 그룹의 내부적인 생성 순서와 관계는 다음과 같다:
1. ECS 클러스터 생성
가장 먼저 ECS 클러스터를 생성한다. 이 클러스터는 컨테이너 태스크와 서비스가 실행되는 논리적인 환경을 제공합니다. 클러스터는 컨테이너화된 애플리케이션을 실행하기 위한 기반이 된다.
2. Launch Template 생성
ECS 클러스터를 생성한 후, Launch Template을 생성한다. Launch Template은 EC2 인스턴스를 시작할 때 필요한 구성 정보(예: 인스턴스 유형, AMI, 네트워크 설정 등)를 정의한다. Launch Template은 Auto Scaling 그룹에 의해 사용되므로, 오토 스케일링 그룹을 생성하기 전에 준비되어야 한다.
3. Auto Scaling 그룹 생성
Launch Template이 준비되면, Auto Scaling 그룹을 생성한다. 오토 스케일링 그룹은 EC2 인스턴스들을 관리하고, 필요에 따라 인스턴스 수를 자동으로 조절한다. Auto Scaling 그룹은 Launch Template을 참조하여 인스턴스를 어떻게 생성할지 결정한다.
4. 용량 공급자 설정
마지막으로, ECS 클러스터에 용량 공급자를 설정한다. 용량 공급자는 클러스터와 Auto Scaling 그룹 간의 연결을 정의하고, 클러스터 내 태스크가 EC2 인스턴스를 어떻게 사용할지를 결정한다. 이 설정 과정에서 용량 공급자는 이미 생성된 Auto Scaling 그룹을 참조한다.
AWS ECS의 경우, 용량 공급자, Launch Template, Auto Scaling 그룹과 같은 리소스들 간의 의존성은 분명 존재한다. 클러스터는 기본 환경을, Launch Template은 EC2 인스턴스 설정을 제공하며, Auto Scaling 그룹은 이를 기반으로 인스턴스를 관리한다. 마지막으로, 용량 공급자는 이 모든 구성 요소를 연결하여 효과적인 리소스 관리를 가능하게 한다. 하지만 테라폼 코드 내에서 이러한 리소스들을 어떤 순서로 정의하든, 테라폼은 plan과 apply 단계에서 이 의존성을 파악하고 자동으로 최적의 생성 순서를 결정한다.
4. 용량 공급자의 필요성과 역할
각 항목의 관계를 파악해보자.
ECS 클러스터와 EC2 인스턴스의 연결
ECS 클러스터는 여러 컨테이너 태스크를 실행하기 위한 논리적인 환경이다. 이 클러스터 내에서 ECS 서비스와 태스크가 실행되는데, 실제로 이 태스크들이 실행되는 물리적인 리소스가 바로 EC2 인스턴스다. 즉, ECS 클러스터는 '어떤 일을 할 것인가'를 정의하고, EC2 인스턴스는 '그 일을 수행할 자원'을 제공한다.
Auto Scaling 그룹의 역할
Auto Scaling 그룹은 EC2 인스턴스들을 그룹으로 관리하면서, 필요에 따라 자동으로 인스턴스의 수를 늘리거나 줄일 수 있다. 예를 들어, 웹사이트에 방문자가 많아져 추가 컴퓨팅 리소스가 필요할 때, Auto Scaling은 자동으로 더 많은 EC2 인스턴스를 생성하여 부하를 분산시킨다. 반대로, 트래픽이 감소하면 필요하지 않은 인스턴스를 자동으로 제거하여 비용을 절감할 수 있다.
용량 공급자의 핵심 기능
용량 공급자는 이러한 ECS 클러스터와 EC2 인스턴스(또는 Auto Scaling 그룹) 간의 연결을 관리한다. 이를 통해 ECS 서비스가 필요에 따라 EC2 인스턴스를 효율적으로 사용하도록 한다. 예를 들어, ECS 서비스에 태스크가 추가되어야 할 때, 용량 공급자는 필요한 만큼의 EC2 인스턴스를 Auto Scaling 그룹을 통해 제공한다. 이렇게 하면 ECS 태스크가 실행될 충분한 리소스가 항상 보장된다.
ECS 클러스터, 용량 공급자, Launch Template, 그리고 Auto Scaling 그룹의 생성과 설정은 ECS 환경을 효율적으로 구축하고 관리하는 데 필수적이다. 이들 각각의 구성 요소는 서로 의존적이며, 이를 통해 클라우드 환경에서의 유연한 리소스 관리가 가능해진다. 용량 공급자는 특히 ECS와 EC2 간의 브릿지 역할을 하여, 클러스터의 태스크 실행 요구와 EC2 인스턴스의 리소스 제공 사이의 균형을 맞추는 중요한 역할을 한다.
이제 실제로 ECS 클러스터를 생성하는 모듈을 코드로 구현해보자
5. ECS 클러스터(cluster) 모듈
이 모듈을 /modules/ecs_cluster라는 디렉토리에 만들었다고 가정하자.
main.tf 파일에는 실제 리소스를 생성하는 코드가 포함된다. 여기서는 aws_ecs_cluster 리소스를 생성한다.
resource "aws_ecs_cluster" "cluster" {
name = var.cluster_name
}
"resource"
테라폼에서 리소스를 정의하는 키워드이다.
"aws_ecs_cluster" "cluster"
"aws_ecs_cluster"는 테라폼에 의해 사전에 정의된 리소스 타입이다. 이것은 테라폼 사용자가 임의로 정하는 이름이 아니라, 테라폼과 AWS 프로바이더가 함께 제공하는 고유한 식별자다. 테라폼에서 AWS 리소스를 관리하기 위해 특정 리소스 타입을 사용하려면, 이러한 정의된 리소스 타입을 사용해야 한다. "aws_ecs_cluster"는 테라폼에서 AWS의 Elastic Container Service 클러스터를 생성하고 관리하기 위해 특별히 지정된 타입이다.
"cluster"는 이 리소스에 대한 참조 이름으로 사용자 정의 변수명이라고 생각하면 된다.
name = var.cluster_name
클러스터의 이름을 설정한다. var.cluster_name은 variables.tf에서 정의된 변수를 참조한다.
outputs.tf 파일은 생성된 리소스의 정보를 출력하는 데 사용된다.
output "ecs_cluster_name" {
value = aws_ecs_cluster.cluster.id
}
output
출력 값을 정의하는 키워드이다.
"ecs_cluster_name"
출력 값의 이름이다.
value = aws_ecs_cluster.cluster.id
생성된 ECS 클러스터의 ID 값을 출력한다. 이 ID는 다른 Terraform 모듈이나 리소스에서 참조될 수 있다.
variables.tf 파일은 Terraform 코드에서 사용될 변수들을 정의한다.
variable "cluster_name" {
description = "Name of the cluster"
}
variable
변수를 정의하는 키워드이다.
"cluster_name"
변수의 이름이다.
description
변수에 대한 설명을 제공한다. 여기서는 클러스터의 이름을 설명하는 문자열이다.
ECS Cluster를 생성하는 모듈을 작성했다면, 이제 용량 공급자를 생성하는 모듈을 작성해보자.
6. 용량 공급자 (capacity provider) 모듈
이 모듈을 /modules/ecs_capacity_provider 디렉토리에 만들었다고 가정하자.
main.tf 파일에서 정의한 AWS ECS 용량 공급자 관련 리소스에 대해 설명하겠다.
이 파일은 두 가지 주요 부분으로 구성되어 있다: aws_ecs_capacity_provider와 aws_ecs_cluster_capacity_providers
aws_ecs_capacity_provider와 aws_ecs_cluster_capacity_providers 두 리소스는 AWS ECS(Elastic Container Service)에서 용량 공급자를 설정하는 데 사용되지만, 각각 다른 역할을 한다. 이들의 차이점을 명확히 이해하면 각 리소스가 어떻게 활용되는지 더 잘 파악할 수 있다.
aws_ecs_capacity_provider 리소스
이 리소스는 개별 용량 공급자를 생성하고 구성하는 데 사용된다. 용량 공급자는 ECS 클러스터와 연결된 Auto Scaling 그룹을 관리하는 방법을 정의한다. 여기서는 Auto Scaling 그룹의 ARN, 매니지드 스케일링 설정(최대/최소 스케일링 단계, 상태, 타겟 용량 등)을 지정한다. 즉, 이 리소스는 용량 공급자 자체의 세부 설정을 담당한다.
aws_ecs_cluster_capacity_providers 리소스
이 리소스는 특정 ECS 클러스터에 하나 이상의 용량 공급자를 연결하는 데 사용된다. 즉, 이미 생성된 용량 공급자를 특정 ECS 클러스터와 연결하여, 해당 클러스터가 어떤 용량 공급자를 사용할지 정의한다. 여기서는 클러스터 이름, 연결할 용량 공급자의 이름, 그리고 클러스터 내에서 용량 공급자가 사용될 기본 전략(예: base, weight)을 설정한다. (현재 코드에서는 바로 위에 정의된 aws_ecs_capacity_provider 리소스를 기반으로 한다.)
간단히 말해, aws_ecs_capacity_provider는 용량 공급자의 세부 설정을 정의하는 반면, aws_ecs_cluster_capacity_providers는 이러한 용량 공급자를 특정 클러스터에 연결하고, 클러스터 내에서 어떻게 사용될지 정의하는 역할을 한다. 두 리소스는 서로 보완적으로 작동하여 ECS 클러스터가 효율적으로 리소스를 관리하고 스케일링할 수 있도록 한다.
# 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
managed_scaling {
maximum_scaling_step_size = var.maximum_scaling_step_size
minimum_scaling_step_size = var.minimum_scaling_step_size
status = var.status
target_capacity = var.target_capacity
}
}
}
# 특정 ECS 클러스터에 하나 이상의 용량 공급자를 연결하는 데 사용된다.
resource "aws_ecs_cluster_capacity_providers" "ecs_cluster_capacity_providers" {
cluster_name = var.cluster_name
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
}
}
aws_ecs_capacity_provider 리소스
이 리소스는 ECS 클러스터에 대한 개별 용량 공급자를 정의한다. 용량 공급자는 클러스터에서 실행되는 태스크에 필요한 컴퓨팅 리소스를 제어한다.
- name: 용량 공급자의 이름을 설정한다. 이 값은 var.name 변수에서 제공된다.
- auto_scaling_group_provider 블록:
- auto_scaling_group_arn: ECS 클러스터 연결에 사용할 Auto Scaling 그룹의 Amazon Resource Name(ARN)을 지정한다. 이 값은 var.auto_scaling_group_arn 변수에서 설정된다.
- managed_scaling 블록:
- maximum_scaling_step_size: Auto Scaling이 한 번에 수행할 수 있는 최대 스케일링 단계 크기(최대 인스턴스 수)를 정의한다.
- minimum_scaling_step_size: 최소 스케일링 단계 크기(최소 인스턴스 수)를 설정한다.
- status: 매니지드 스케일링의 상태를 설정한다 (예: "ENABLED" 또는 "DISABLED"). 매니지드 스케일링은 AWS ECS가 클러스터의 태스크 수에 따라 Auto Scaling 그룹의 EC2 인스턴스 수를 자동으로 조절하는 기능아다. "ENABLED"는 이 기능을 활성화하고, "DISABLED"는 비활성화한다.
- target_capacity: Auto Scaling 그룹의 용량 비율을 결정한다. 이 값은 Auto Scaling 그룹이 유지하려고 하는 EC2 인스턴스의 타겟 용량을 백분율로 나타낸다. 이를 통해 Auto Scaling 그룹의 스케일링 동작이 어떻게 이루어질지를 조절할 수 있다.
💡 target_capacity 백분율에 대해서
1. 값이 100일 경우:
Auto Scaling 그룹은 가능한 최대 용량까지 EC2 인스턴스를 확장하려고 시도한다. 즉, 그룹에 정의된 최대 인스턴스 수까지 인스턴스를 늘리려고 한다.
2. 값이 80일 경우:
Auto Scaling 그룹은 최대 용량의 80%를 유지하려고 시도한다. 예를 들어, 그룹의 최대 인스턴스 수가 10개라면, Auto Scaling은 약 8개의 인스턴스를 활성 상태로 유지하려고 한다. 이는 트래픽이 증가하더라도 일부 여유 용량을 남겨두고자 할 때 유용하다.
3. 값이 50일 경우:
Auto Scaling 그룹은 최대 용량의 50%를 유지하려고 시도한다. 이는 더 보수적인 리소스 관리 전략을 나타낸다. 최대 인스턴스 수가 10개인 경우, Auto Scaling은 약 5개의 인스턴스를 활성 상태로 유지하려고 한다.
- target_capacity 설정은 Auto Scaling 그룹의 반응성과 리소스 사용 효율성 사이의 균형을 조절하는 데 중요하다.
- 낮은 target_capacity 값은 리소스를 절약하고, 높은 값은 더 나은 성능과 빠른 대응을 위해 더 많은 리소스를 사용하려는 의도를 반영한다.
- 이 값은 실제 트래픽 패턴과 예상되는 로드에 따라 조정될 수 있으며, ECS 서비스의 요구 사항과 조직의 리소스 관리 정책에 맞게 설정해야 한다.
aws_ecs_cluster_capacity_providers 리소스
이 리소스는 특정 ECS 클러스터에 하나 이상의 용량 공급자를 연결하는 데 사용된다.
- cluster_name: 연결할 ECS 클러스터의 이름을 지정한다. 이 값은 var.cluster_name 변수에서 제공된다.
- capacity_providers: 연결할 용량 공급자의 이름을 배열로 설정한다. 여기서는 클러스터가 사용할 수 있는 용량 공급자의 '풀(pool)'을 정의한다. (지금 코드에서는 위에서 생성한 aws_ecs_capacity_provider.ecs_capacity_provider_resource.name을 사용한다.)
- default_capacity_provider_strategy 블록:
- 이 블록은 클러스터에서 태스크 또는 서비스를 시작할 때 기본적으로 사용할 용량 공급자 전략을 정의한다. 이 설정은 클러스터에서 새로운 태스크나 서비스를 시작할 때 자동으로 적용된다.
- base: 용량 공급자 전략에서 "base" 값은 ECS 서비스가 항상 실행해야 하는 최소 태스크 수를 나타낸다. 예를 들어, base를 1로 설정하면, 해당 용량 공급자를 사용하는 서비스는 항상 최소한 하나의 태스크를 실행하게 된다.
- weight: "weight" 값은 여러 용량 공급자가 있는 경우 각 용량 공급자에 할당되는 태스크의 상대적 비중을 정의한다. 예를 들어, 한 용량 공급자의 weight가 다른 용량 공급자보다 두 배 높으면, 첫 번째 공급자는 두 번째 공급자보다 두 배 많은 태스크를 받는다.
- capacity_provider: 사용할 용량 공급자의 이름을 지정한다.
이 코드는 AWS ECS 환경에서 용량 공급자를 설정하고 관리하는 데 필수적인 구성을 제공한다. 용량 공급자는 ECS 클러스터와 Auto Scaling 그룹 간의 연결을 관리하며, 클러스터의 리소스 사용을 최적화하는 데 중요한 역할을 한다.
테라폼 코드에서 aws_ecs_capacity_provider와 aws_ecs_cluster_capacity_providers를 별도의 리소스로 정의한 것에 대해 좀 더 명확히 설명해 보겠다.
이 두 리소스는 서로 다른 역할을 하지만, 한 테라폼 구성에서 함께 사용되어 AWS ECS 환경을 완성한다. 이들이 별도로 정의되어야 하는지, 아니면 하나로 통합될 수 있는지에 대한 내용도 포함하면서 설명해보겠다.
aws_ecs_capacity_provider와 aws_ecs_cluster_capacity_providers의 역할
aws_ecs_capacity_provider 리소스
이 리소스는 특정 용량 공급자를 생성하고 구성한다. 여기서 구성하는 것은 Auto Scaling 그룹과의 연결, 스케일링 정책 등이 포함된다. 기본적으로, 이 리소스는 "용량 공급자라는 개체를 만들고, 이 개체가 어떻게 동작할지"를 정의한다.
aws_ecs_cluster_capacity_providers 리소스
이 리소스는 이미 생성된 용량 공급자를 특정 ECS 클러스터와 연결한다. 즉, "이 용량 공급자를 어느 클러스터에 사용할 것인가"를 결정한다. 클러스터와 용량 공급자 간의 연결을 설정하고, 클러스터 내에서 용량 공급자의 사용 방식(예: 기본 전략)을 정의한다.
별도 리소스로 정의한 이유
테라폼에서 aws_ecs_capacity_provider와 aws_ecs_cluster_capacity_providers를 별도의 리소스로 정의하는 방식은 몇 가지 중요한 이유 때문이다.
먼저, 용량 공급자를 만드는 것과 클러스터에 연결하는 것은 서로 다른 작업이기 때문에 이를 명확하게 구분하는 것이 중요하다. 용량 공급자는 서버와 같은 컴퓨팅 자원을 어떻게 관리할지 정하는 역할을 하고, 클러스터와 연결하는 과정에서는 이러한 용량 공급자가 실제로 어떤 클러스터에 적용될지를 결정한다. 이런 방식으로 각각의 역할이 분명해지고, 코드의 목적과 기능이 더 잘 드러난다.
또한, 같은 용량 공급자를 여러 클러스터에 재사용할 수 있는 유연성을 제공한다. 이는 특히 큰 시스템이나 여러 환경에서 동일한 설정을 적용할 때 매우 유용하다. 이렇게 하면 특정 설정을 한 번만 정의하고, 다양한 클러스터에서 그대로 사용할 수 있어 코드의 재사용성과 효율성이 증가한다.
마지막으로, 각 리소스를 별도로 정의함으로써 코드 관리가 더 쉬워진다. 용량 공급자를 먼저 만들고, 그 후에 이를 클러스터와 연결하는 순서가 명확해지기 때문에 코드의 의존성 관리가 간편해진다. 이러한 접근 방식은 복잡한 시스템을 구축하고 관리할 때 발생할 수 있는 오류를 줄이고, 코드의 이해와 유지보수를 쉽게 만들어 준다.
이 두 리소스를 별도로 구분하는 것은 ECS 클러스터를 효율적으로 관리하기 위한 최적의 방법이다. 이 구조를 통해 AWS ECS 환경을 더 명확하고 유연하게 관리할 수 있으며, 코드의 재사용성과 관리의 용이성을 높일 수 있다. 이러한 접근 방식은 테라폼의 설계 철학에 맞게 AWS ECS의 구조를 잘 반영하고 있다.
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
}
"capacity_provider_arn"
생성된 용량 공급자의 Amazon Resource Name(ARN)을 출력값으로 제공한다. aws_ecs_capacity_provider.ecs_capacity_provider_resource.arn을 통해 해당 용량 공급자의 ARN을 참조한다. 이는 테라폼이 생성한 용량 공급자의 고유 식별자를 나타낸다.
"capacity_provider_name"
생성된 용량 공급자의 이름을 출력값으로 제공한다. aws_ecs_capacity_provider.ecs_capacity_provider_resource.name을 통해 용량 공급자의 이름을 참조한다. 이 이름은 테라폼 구성에서 var.name 변수를 통해 지정한 이름과 동일하다.
이러한 출력값은 테라폼 구성에서 생성된 리소스에 대한 중요한 정보를 제공한다. 예를 들어, 다른 테라폼 모듈이나 외부 시스템에서 이 용량 공급자를 참조할 때, 이 ARN이나 이름을 사용할 수 있다. output을 정의함으로써 테라폼 사용자는 구성의 결과물을 더 쉽게 확인하고 관리할 수 있다.
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
}
이 변수들은 테라폼 구성에서 ECS 클러스터 및 관련 리소스의 동작 방식을 정의하는 데 필수적이다. 사용자는 이 변수들을 통해 ECS 환경을 자신의 요구 사항에 맞게 세밀하게 조절할 수 있다.
이제 지금까지 만든 모듈을 사용하는 루트 디렉토리의 main.tf 파일을 작성해보자
7. 루트 디렉토리의 main.tf
이 코드는 위에서 설명한 ECS 클러스터, 용량 공급자, Launch Template, Auto Scaling 그룹 등을 포함할 것이다. 아래 예제는 간단한 구조를 가지고 있으며, 실제 사용 환경에 맞게 조정이 필요할 수 있다.
provider "aws" {
region = "ap-northeast-2" // AWS 리전 설정
}
module "network_module" {
source = "./modules/network" // 네트워크 모듈 경로
vpc_id = "vpc-1234abcd" // 사용할 VPC의 ID
subnet_ids = ["subnet-5678efgh", "subnet-9012ijkl"] // 사용할 서브넷 ID들
}
output "vpc_id_used" {
value = module.network_module.vpc_id
}
output "subnet_ids_used" {
value = module.network_module.subnet_ids
}
# EC2 런치 템플릿 설정 - 테스트용
module "test_launch_template" {
source = "./ec2_launch_template"
name_prefix = "test-ec2"
image_id = "ami-0abcdef1234567890"
instance_type = "t2.micro"
key_name = "test-keypair"
vpc_security_group_ids = ["sg-0123456789abcdef0"]
iam_instance_profile = "testInstanceRole"
ec2_instance_name = "ec2_test"
user_data_file = "test_user_data.sh"
}
# 테스트용 오토 스케일링 그룹 생성
module "test_asg" {
source = "./autoscaling_group"
vpc_subnets = ["subnet-12345678", "subnet-87654321", "subnet-12348765"]
launch_template_id = module.test_launch_template.launch_template_id
name_prefix = "test"
}
# ECS 용량 공급자 모듈 생성
module "ecs_capacity_provider" {
source = "./modules/ecs_capacity_provider"
name = "example-ecs-capacity-provider"
auto_scaling_group_arn = "arn:aws:autoscaling:example-region:123456789012:autoScalingGroup:example-asg-arn:autoScalingGroupName/example-asg"
maximum_scaling_step_size = 1
minimum_scaling_step_size = 1
status = "ENABLED"
target_capacity = 100
cluster_name = "example-ecs-cluster"
base = 1
weight = 100
}
# 테스트 ECS 클러스터 생성
module "ecs_member_cluster" {
source = "./modules/ecs_cluster"
cluster_name = "example-ecs-cluster"
}
이 코드는 AWS ECS 클러스터를 생성하고, 관련된 Launch Template과 Auto Scaling 그룹을 설정한다. 용량 공급자는 Auto Scaling 그룹을 참조하여 만들어지며, ECS 클러스터에 연결된다.
aws_launch_template와 aws_autoscaling_group 리소스는 예시 AMI ID와 서브넷 ID를 사용하고 있으며, 실제 환경에 맞게 변경해야 한다.
마지막으로 aws_ecs_cluster_capacity_providers 리소스를 통해 생성된 용량 공급자를 클러스터에 연결하고, 기본 용량 공급자 전략을 설정한다.
이렇게 ECS 클러스터와 용량 공급자를 살펴봤다. 다음에는 클러스터에 적용할 서비스와 태스크 정의를 생성하는 모듈을 살펴보자.
🔻 마지막 루트 디렉토리의 main.tf에서 사용된 launch template 모듈과 auto scaling 모듈이 궁금하다면?? 🔻
Terraform에서 Launch Template, 오토 스케일링 설정하기
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '개발자의 서랍'님의 블로그도 한번 봐주세요 :)
'테라폼(Terraform)' 카테고리의 다른 글
엉금엉금 테라폼 적용하기 (7) - 탄력적 IP와 DNS 연동해서 EC2 만들기 (0) | 2023.12.14 |
---|---|
엉금엉금 테라폼 적용하기 (6) - Dynamic 블록으로 AWS 서비스와 태스크 정의하기 (0) | 2023.12.13 |
엉금엉금 테라폼 적용하기 (4) - Terraform에서 Launch Template, 오토 스케일링 설정하기 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (3) - Terraform AWS Provider 및 VPC, Subnet 설정 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (2) - MacOS에서 테라폼 설치 및 terraform 명령어 사용법 (0) | 2023.12.08 |