엔지니어링


CloudWatch 와 Terraform을 활용하여 ECS Auto Scaling 설정하기

한국신용데이터
2023-02-24
조회수 186



안녕하세요. 한국신용데이터(KCD) 뱅킹팀에서 백엔드 개발을 맡고 있는 Roy(권순오)입니다.

KCD 뱅킹팀에서는 Spring boot + Kotlin + Terraform + AWS ECS Fargate 기반의 신규 서버를 구성하였고 이를 바탕으로 캐시노트 내에 사업자대출비교서비스를 22년 12월에 오픈하였습니다.

이번에 공유드릴 내용은 프로젝트 내에서 사용하고 있는 CloudWatch 서비스와 Terraform을 활용하여 ECS Auto Scaling을 설정하는 방법에 대해 공유해 보려고 합니다.

KCD에서는 여러 모니터링 툴을 사용하고 있지만 그중에서 CloudWatch의 metric alarm을 사용하면 alarm이 발생하는 지표일 때 쉽게 Auto Scaling을 일으킬 수 있기에 metric alarm을 기준으로 Auto Scaling 설정을 진행하였습니다.

인프라에 대한 설정을 Terraform으로 작성하고 있는 만큼 Terraform 코드 위주로 설명을 드리겠습니다. (Autoscaling 세팅에 집중하여 설명하는 만큼 Terraform의 기본 문법 및 설명은 생략합니다.)


코드 분석

먼저 application-autoscaling 서비스가 사용할 IAM role을 생성합니다.

resource "aws_iam_role" "ecs_autoscale" {
name = "testproject-ecs-autoscale-iam-role"

assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Autoscaling",
"Effect": "Allow",
"Principal": {
"Service": "application-autoscaling.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}

생성한 IAM role에 ECS 서비스를 위한 AmazonEC2ContainerServiceAutoscaleRole 정책을 부여합니다.

resource "aws_iam_role_policy_attachment" "ecs_autoscale" {
role = aws_iam_role.ecs_autoscale.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceAutoscaleRole"
}

다음으로 ECS 타겟의 Autoscaling을 구성에 대한 aws_appautoscaling_target 리소스를 작성합니다.

resource "aws_appautoscaling_target" "ecs_target" {
min_capacity = 2
max_capacity = 6
resource_id = "service/clusterName/serviceName"
role_arn = aws_iam_role.ecs_autoscale.arn
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"

depends_on = [
aws_ecs_service.was
]
}

확장 가능한 대상의 최소 /최대 용량, 리소스 정보를 작성하고 위에서 생성한 Autoscaling IAM role을 연결합니다.

다음으로 Scale out 정책을 추가합니다.

resource "aws_appautoscaling_policy" "ecs_policy_scale_out" {
name = "scale-out"
policy_type = "StepScaling"
resource_id = aws_appautoscaling_target.ecs_target.resource_id
scalable_dimension = aws_appautoscaling_target.ecs_target.scalable_dimension
service_namespace = aws_appautoscaling_target.ecs_target.service_namespace

step_scaling_policy_configuration {
adjustment_type = "PercentChangeInCapacity"
cooldown = 1
metric_aggregation_type = "Average"

step_adjustment {
metric_interval_lower_bound = 0
scaling_adjustment = 50
}
}
}

ECS 타겟이 어떠한 방식으로 Autoscaling할지를 정하는 정책으로 현재 용량의 50%를 Scale out 하도록 지정하였습니다.

다음으로는 어떤 경우 위 Scale out 설정을 사용할지 기준이 되는 aws_cloudwatch_metric_alarm 리소스를 작성합니다.

aws_cloudwatch_metric_alarm는 Cloudwatch metric 수치를 기반으로 경보를 생성하는 설정으로 경보가 발생할 때 어떤 액션을 취할지를 정할 수 있습니다.

현재 구성에서는 SNS를 통해 지정된 이메일로 경보 내용을 보내주고 위에 구성한 Autoscaling을 시작하도록 action을 설정하였습니다.

resource "aws_cloudwatch_metric_alarm" "cpu_alert" {
alarm_name = "testproject-cpu-alert"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "2"
threshold = "70"
datapoints_to_alarm = "2"
insufficient_data_actions = []
alarm_actions = [var.alarm_sns_arn[terraform.workspace], aws_appautoscaling_policy.ecs_policy_scale_out.arn]

metric_query {
id = "cpualert"
expression = "mm1m0 * 100 / mm0m0"
return_data = "true"
}

metric_query {
id = "mm1m0"

metric {
metric_name = "CpuUtilized"
namespace = "ECS/ContainerInsights"
period = "30"
stat = "Sum"

dimensions = {
ClusterName = aws_ecs_cluster.ecs_cluster.name
ServiceName = aws_ecs_service.was.name
}
}
}

metric_query {
id = "mm0m0"

metric {
metric_name = "CpuReserved"
namespace = "ECS/ContainerInsights"
period = "30"
stat = "Sum"

dimensions = {
ClusterName = aws_ecs_cluster.ecs_cluster.name
ServiceName = aws_ecs_service.was.name
}
}
}
}

위 metric alarm은 cpu 지표를 모니터링하는 alarm으로 30초 간격으로 cpu 사용률을 측정하여 70프로가 넘는 경우 alarm 상태를 경보로 변경하는 코드입니다.

Get Roy’s stories in your inbox

Join Medium for free to get updates from this writer.


Subscribe

경보 상태로 변경되는 경우 alarm_actions에 설정된 이메일로 메일을 발송하고 Autoscaling을 시작합니다.


결과 리뷰

그럼 구성된 Autoscaling 결과를 보도록 하겠습니다.

제일 먼저 IAM role 이 추가된 모습입니다.

role에는 위에서 ECS Autoscaling을 위한 AmazonEC2ContainerServiceAutoscaleRole 정책이 추가되었습니다.

application-autoscaling 서비스가 해당 역할을 사용할 수 있게 신뢰할 수 있는 엔터티로추가되어 있습니다.


다음으로는 Cloudwatch의 경보가 추가된 모습입니다.

추가된 경보에는 metric 지표가 정상 상태에서 경보 상태로 변경될 경우 지정된 이메일로 메일을 발송하고 50% 용량을 추가하는 scale-out 작업이 추가되어 있습니다.

scale-out 작업이 추가된 모습을 ECS 서비스에서도 확인이 가능합니다.

(scale-out 외의 정책들도 추가해두었지만 경보와 연결해놓지는 않았습니다.)


마치며

Cloudwatch와 Terraform을 이용해 서비스에 간단하게 Autoscaling을 적용해 보았습니다.

Terraform이라는 강력한 도구를 통해 코드만으로 AWS에 Autoscaling을 적용할 수 있음을 확인할 수 있었습니다.

이 부분은 AWS 콘솔에서 일일이 관리할 수도 있습니다. 하지만 Terraform을 사용하여 코드에서 한꺼번에 관리하면 상당한 비용 절감을 누릴 수 있다고 생각합니다.

긴 글 읽어주셔서 감사합니다.


References

Terraform Registry

Edit description

registry.terraform.io







0 0

월간 인기글