Amazon Web Services 한국 블로그

Amazon ECS 클러스터 자동 스케일링 정식 출시 (서울 리전 포함)

Amazon Elastic Container Service(ECS) 클러스터에 대한 자동 스케일링(Auto Scaling)을 정식 출시합니다.

이 신규 기능은 클러스터 스케일아웃의 속도 및 안정성을 높이고, 클러스터에 유지되는 예비 용량을 제어하는 기능을 제공하며, 클러스터를 스케일인할 때 인스턴스 종료를 자동으로 관리하여 클러스터 조정 경험을 개선합니다.

ECS 클러스터 Auto Scaling을 활성화하려면 용량 공급자라고 하는 새 ECS 리소스 유형을 생성해야 합니다. EC2 ASG(Auto Scaling 그룹)에 용량 공급자를 연결할 수 있습니다. ECS 용량 공급자를 ASG에 연결하고 ECS 클러스터에 용량 공급자를 추가하면 클러스터에서 ECS의 2가지 새로운 기능을 사용하여 ASG를 자동으로 조정할 수 있습니다.

  1. 관리형 조정에는 ASG에 자동으로 생성되는 조정 정책과 이 조정 정책에 사용되는 새로운 조정 지표(용량 공급자 예약)가 포함됩니다.
  2. 관리형 인스턴스 종료 보호는 ASG에서 스케일인이 발생할 때 컨테이너 인식 인스턴스 종료를 지원합니다.

고객은 이러한 새로운 기능을 사용하여 Amazon ECS 클러스터의 스케일인 및 스케일아웃 시기와 방식을 효과적으로 제어할 수 있습니다.

용량 공급자 예약
용량 공급자 예약이라는 이름의 새 지표는 클러스터의 모든 ECS 워크로드(기존 워크로드, 새 워크로드 및 워크로드 크기 변경 포함)에 필요한 클러스터 리소스의 총 비율을 측정합니다. 조정 정책은 이 지표를 사용하여 CPU 또는 메모리 예약 지표를 사용할 때보다 더 빠르고 더 안정적으로 스케일아웃을 시작할 수 있습니다. 고객은 클러스터의 예비 용량을 예약할 때도 이 지표를 사용할 수 있습니다. 예비 용량을 예약하면 새 인스턴스가 시작될 때까지 기다리지 않고 필요할 때 즉시 더 많은 컨테이너를 실행할 수 있습니다.

관리형 인스턴스 종료 보호
인스턴스 종료 보호는 ECS 조정 정책에서 스케일인 시 종료할 수 있는 인스턴스를 제어하여 실행 중인 컨테이너의 중단을 최소화하는 데 사용됩니다. 이러한 개선된 기능은 운영 비용을 낮추고 ECS에서 실행되는 컨테이너 인스턴스의 가용성을 높이는 데 도움이 됩니다.

고객에게 제공하는 이점
ECS에서 조정 가능한 컨테이너 워크로드를 실행하는 고객은 주로 지표 기반 조정 정책을 사용하여 ECS 클러스터를 자동으로 조정합니다. 이러한 조정 정책은 평균 클러스터 CPU 및 메모리 예약 비율 같은 일반적인 지표를 사용하여 클러스터 인스턴스를 추가하거나 제거해야 하는 시기를 결정합니다.

이러한 정책은 단일 워크로드 또는 느리게 스케일아웃되는 워크로드를 실행하는 클러스터에 적합합니다. 그러나 동일한 클러스터에서 여러 워크로드를 실행하거나 빠르게 스케일아웃되는 워크로드를 실행하는 고객은 클러스터 조정 시 문제를 경험할 가능성이 더 높습니다. 이상적으로는 현재 클러스터가 수용할 수 없을 정도로 워크로드 크기가 증가하면 클러스터를 더 큰 크기로 스케일아웃하는 정책이 트리거되어야 합니다.

기존 지표는 컨테이너와 관련된 지표가 아니고 이미 사용 중인 워크로드만 고려하기 때문에 이 작업이 느리거나 불안정하게 수행될 수 있습니다. 또한 조정 정책이 클러스터에서 컨테이너가 실행되는 위치를 알 수 없으므로 스케일인 시 불필요하게 컨테이너를 종료하게 될 수 있습니다. 이러한 문제는 컨테이너 워크로드의 가용성을 저해할 수 있습니다. 오버프로비저닝, 사용자 지정 도구 또는 수동 개입 같은 완화 수단은 종종 더 높은 운영 비용으로 이어집니다.

ECS 자동 스케일링 시작하기
이 새로운 기능을 보다 확실히 이해하려면 예제를 살펴보는 것이 좋을 듯 합니다.

AWS Management Console, AWS CLI 또는 Amazon ECS API를 사용하여 Amazon ECS 클러스터 Auto Scaling을 설정하고 구성할 수 있습니다. 터미널을 열고 클러스터를 생성하겠습니다.

먼저, 파일 2개를 생성합니다. 첫 번째 파일인 demo-launchconfig.json은 Auto Scaling 그룹에 포함될 Amazon Elastic Compute Cloud(EC2) 인스턴스에 대한 인스턴스 구성을 정의합니다.

{
    "LaunchConfigurationName": "demo-launchconfig",
    "ImageId": "ami-01f07b3fa86406c96",
    "SecurityGroups": [
        "sg-0fa5be8c3749f3aa0"
    ],
    "InstanceType": "t2.micro",
    "BlockDeviceMappings": [
        {
            "DeviceName": "/dev/xvdcz",
            "Ebs": {
                "VolumeSize": 22,
                "VolumeType": "gp2",
                "DeleteOnTermination": true,
                "Encrypted": true
                }
        }
    ],
    "InstanceMonitoring": {
        "Enabled": false
    },
    "IamInstanceProfile": "arn:aws:iam::365489315573:role/ecsInstanceRole",
    "AssociatePublicIpAddress": true
}

두 번째 파일은 demo-userdata.txt이며 각 EC2 인스턴스에 추가될 사용자 데이터를 포함합니다. 파일에 포함된 ECS_CLUSTER 이름은 앞으로 생성할 클러스터의 이름과 동일해야 합니다. 이 예에서 이름은 demo-news-blog-scale입니다.

#!/bin/bash
echo ECS_CLUSTER=demo-news-blog-scale >> /etc/ecs/ecs.config

create-launch-configuration 명령을 사용하여 앞서 생성한 파일 2개를 입력으로 전달합니다. 그러면 Auto Scaling 그룹에서 사용할 시작 구성이 생성됩니다.

aws autoscaling create-launch-configuration --cli-input-json file://demo-launchconfig.json --user-data file://demo-userdata.txt

다음으로, demo-asgconfig.json 파일을 생성하고 요구 사항을 정의합니다.

{
    "LaunchConfigurationName": "demo-launchconfig", 
    "MinSize": 0,
    "MaxSize": 100,
    "DesiredCapacity": 0,
    "DefaultCooldown": 300,
    "AvailabilityZones": [ 
        "ap-southeast-1c" ], 
    "HealthCheckType": "EC2", 
    "HealthCheckGracePeriod": 300, 
    "VPCZoneIdentifier": "subnet-abcd1234", 
    "TerminationPolicies": [ 
        "DEFAULT" 
    ],
    "NewInstancesProtectedFromScaleIn": true, 
    "ServiceLinkedRoleARN": "arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
} 

그런 다음 create-auto-scaling-group 명령에서 위의 파일을 입력으로 사용하여 demo-asg라는 Auto Scaling 그룹을 생성합니다.

aws autoscaling create-auto-scaling-group --auto-scaling-group-name demo-asg --cli-input-json file://demo-asgconfig.json

이제 용량 공급자를 생성할 수 있습니다. demo-capacityprovider.json 파일을 생성합니다. 여기서 managedTerminationProtection 속성을 ENABLED로 설정하는 것이 중요합니다.

{
    "name": "demo-capacityprovider", "autoScalingGroupProvider": {
    "autoScalingGroupArn": "arn:aws:autoscaling:ap-southeast-1:365489315573:autoScalingGroup:e9c2f0c4-9a4c-428e-b81e-b22411a52954:autoScalingGroupName/demo-ASG",
            "managedScaling": {
                "status": "ENABLED",
                "targetCapacity": 100,
                "minimumScalingStepSize": 1,
                "maximumScalingStepSize": 100
            },
            "managedTerminationProtection": "ENABLED"
    }
}

새로운 create-capacity-provider 명령에서 파일을 입력으로 사용하여 공급자를 생성합니다.

aws ecs create-capacity-provider --cli-input-json file://demo-capacityprovider.json

이제, 모든 구성 요소가 생성되었으니 마지막으로 클러스터를 생성할 수 있습니다. 용량 공급자를 추가하고 클러스터에 대한 기본 용량 공급자를 demo-capacityprovider로 설정합니다.

aws ecs create-cluster --cluster-name demo-news-blog-scale --capacity-providers demo-capacityprovider --default-capacity-provider-strategy<br />capacityProvider=demo-capacityprovider,weight=1

클러스터가 활성 상태로 이동할 때까지 기다려야 합니다. 다음 명령을 사용하여 클러스터 세부 정보를 가져옵니다.

aws ecs describe-clusters --clusters demo-news-blog-scale --include ATTACHMENTS

이제 클러스터가 설정되었으니 몇몇 작업을 등록할 수 있습니다. 우선, 작업 정의를 생성해야 합니다. 아래에 제가 생성한 demo-sleep-taskdef.json이라는 파일이 있습니다. 이 모든 정의가 하는 일은 무한한 잠을 자는 컨테이너를 정의하는 것입니다.

{
    "family": "demo-sleep-taskdef",
    "containerDefinitions": [
        {
            "name": "sleep",
            "image": "amazonlinux:2",
            "memory": 20,
            "essential": true,
            "command": [
                "sh",
                "-c",
                "sleep infinity"] 
        }],
    "requiresCompatibilities": [
        "EC2"] 
} 

그런 다음 register-task-definition 명령을 사용하여 작업 정의를 등록합니다.

aws ecs register-task-definition --cli-input-json file://demo-sleep-taskdef.json

마지막으로, 작업을 생성할 수 있습니다. 이 예에서는 방금 등록한 demo-sleep-taskdef:1 정의를 바탕으로 5개의 작업을 생성했습니다.

aws ecs run-task --cluster demo-news-blog-scale --count 5 --task-definition demo-sleep-taskdef:1

이제 인스턴스에서 아직 작업을 실행할 수 없으므로 작업은 프로비저닝 상태가 되고 용량이 제공되기를 기다립니다. 구성된 용량 공급자는 인스턴스가 시작되고 클러스터에 들어올 수 있도록 Auto Scaling 그룹을 스케일아웃합니다. 작업은 이 시점에서 인스턴스에 배치됩니다. 이전에는 없었던 진정한 “0에서 확장” 기능이 제공되는 것입니다.

주요 사항
이제 Amazon ECSAWS Auto Scaling이 제공되는 모든 리전에서 AWS ECS 클러스터 Auto Scaling을 사용할 수 있습니다. 최신 목록은 리전 표를 확인하십시오. 자세한 것은 기술 문서를 참고하시기 바랍니다.

– Martin