Amazon ECS용 사용자 지정 지표를 사용한 고급 예측 확장 정책

Amazon ECS용 사용자 지정 지표를 사용한 고급 예측 확장 정책

예측 확장(predictive scaling) 정책에는 사전 정의된 지표나 사용자 지정 지표를 사용할 수 있어요. CPU, 메모리 같은 사전 정의된 지표가 애플리케이션 부하를 충분히 설명하지 못할 때 사용자 지정 지표가 유용합니다.

출처: 문서

본문

사용자 지정 지표로 예측 확장 정책을 만들 때는 AWS가 제공하는 다른 CloudWatch 지표를 지정할 수 있어요. 또는 직접 정의해 게시하는 지표를 지정할 수도 있습니다. 지표 수학(metric math)을 사용해 기존 지표를 집계하고 변환해 AWS가 자동으로 추적하지 않는 새 시계열로 만들 수도 있어요. 예를 들어 데이터의 값을 새 합계나 평균으로 계산해 결합하는 것을 집계(aggregating)라고 하며, 그 결과 데이터를 집계치(aggregate)라고 합니다. 다음 섹션은 정책의 JSON 구조를 구성하는 방법에 대한 모범 사례와 예시를 포함합니다.

사전 요구 사항

예측 확장 정책에 사용자 지정 지표를 추가하려면 cloudwatch:GetMetricData 권한이 있어야 해요.

AWS가 제공하는 지표 대신 자신의 지표를 지정하려면 먼저 지표를 CloudWatch에 게시해야 합니다. 자세한 내용은 Amazon CloudWatch 사용자 가이드의 사용자 지정 지표 게시(Publishing custom metrics)를 참고하세요.

자신의 지표를 게시한다면 최소 5분 빈도로 데이터 포인트를 게시하세요. 데이터 포인트는 필요한 기간(period)의 길이에 따라 CloudWatch에서 가져옵니다. 예를 들어 부하 지표 사양은 시간별 지표를 사용해 애플리케이션의 부하를 측정해요. CloudWatch는 각 1시간 기간 안에 속하는 타임스탬프가 있는 모든 데이터 포인트를 집계해 어떤 1시간 기간에 대한 단일 데이터 값을 제공합니다.

모범 사례

다음 모범 사례는 사용자 지정 지표를 더 효과적으로 사용하는 데 도움이 됩니다:

  • 부하 지표 사양(load metric specification)에 가장 유용한 지표는 Auto Scaling 그룹 전체의 부하를 나타내는 지표예요.
  • 확장할 때 확장 지표 사양(scaling metric specification)에 가장 유용한 지표는 태스크당 평균 처리량 또는 사용률 지표입니다.
  • 대상 사용률(target utilization)은 확장 지표 유형과 일치해야 해요. 예를 들어 CPU 사용률을 사용하는 정책 구성에서 이는 대상 백분율입니다.
  • 이러한 권장 사항을 따르지 않으면 시계열의 예측된 미래 값이 잘못될 가능성이 높아요. 데이터가 올바른지 검증하려면 콘솔에서 예측된 값을 볼 수 있습니다. 또는 예측 확장 정책을 만든 후 GetPredictiveScalingForecast API 호출이 반환하는 LoadForecast 객체를 검사할 수도 있어요.
  • 예측 확장이 실제로 확장을 시작하기 전에 예측을 평가할 수 있도록 예측 확장을 forecast only 모드로 구성할 것을 강력히 권장합니다.

제한 사항

  • 하나의 지표 사양에서 최대 10개 지표의 데이터 포인트를 쿼리할 수 있어요.
  • 이 제한을 위해 하나의 식(expression)은 하나의 지표로 계산됩니다.

사용자 지정 지표가 있는 예측 확장 정책 트러블슈팅

사용자 지정 지표를 사용할 때 문제가 발생하면 다음을 권장합니다:

  • blue/green 배포에서 검색 표현식(search expression)을 사용하는 동안 문제가 발생하면, 부분 일치를 찾는 검색 표현식을 만들었고 정확히 일치하는 것이 아닌지 확인하세요. 또한 쿼리가 특정 애플리케이션에서 실행 중인 Auto Scaling 그룹만 찾고 있는지 확인해야 해요. 검색 표현식 구문에 대한 자세한 내용은 Amazon CloudWatch 사용자 가이드의 CloudWatch 검색 표현식 구문(CloudWatch search expression syntax)을 참고하세요.
  • put-scaling-policy 명령은 확장 정책을 만들 때 식을 검증합니다. 그러나 이 명령이 감지된 오류의 정확한 원인을 식별하지 못할 수도 있어요. 문제를 해결하려면 get-metric-data 명령 요청에 대한 응답에서 받는 오류를 트러블슈팅합니다. CloudWatch 콘솔에서 식을 트러블슈팅할 수도 있습니다.
  • MetricDataQueries가 SUM() 같은 수학 함수 없이 SEARCH() 함수만 자체적으로 지정하면 ReturnData에 false를 지정해야 해요. 검색 표현식은 여러 시계열을 반환할 수 있고, 식에 기반한 지표 사양은 하나의 시계열만 반환할 수 있기 때문입니다.
  • 검색 표현식에 포함된 모든 지표는 같은 해상도여야 해요.

지표 수학으로 지표를 결합하는 예측 확장 정책 예시(AWS CLI)

때때로 지표를 직접 지정하는 대신 그 데이터를 먼저 어떤 방식으로 처리해야 할 수도 있어요. 예를 들어 Amazon SQS 큐에서 작업을 가져오는 애플리케이션이 있고, 큐의 항목 수를 예측 확장의 기준으로 사용하고 싶을 수 있습니다. 큐의 메시지 수만으로는 필요한 인스턴스 수를 결정하지 못해요. 따라서 인스턴스당 백로그(backlog)를 계산하는 데 사용할 수 있는 지표를 만드는 데 더 많은 작업이 필요합니다.

다음은 이 시나리오에 대한 예측 확장 정책 예시입니다. 큐에서 검색할 수 있는 메시지 수인 Amazon SQS ApproximateNumberOfMessagesVisible 지표를 기반으로 확장·부하 지표를 지정합니다. 또한 Amazon EC2 Auto Scaling GroupInServiceInstances 지표와 수학 식을 사용해 확장 지표의 인스턴스당 백로그를 계산합니다.

aws application-autoscaling put-scaling-policy --policy-name my-sqs-custom-metrics-policy \
  --policy-type PredictiveScaling \
  --predictive-scaling-configuration file://config.json
  --service-namespace ecs \
  --resource-id service/MyCluster/test \
  "MetricSpecifications": [
    {
      "TargetValue": 100,
      "CustomizedScalingMetricSpecification": {
        "MetricDataQueries": [
          {
            "Label": "Get the queue size (the number of messages waiting to be processed)",
            "Id": "queue_size",
            "MetricStat": {
              "Metric": {
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Namespace": "AWS/SQS",
                "Dimensions": [
                  {
                    "Name": "QueueName",
                    "Value": "my-queue"
                  }
                ]
              },
              "Stat": "Sum"
            },
            "ReturnData": false
          },
          {
            "Label": "Get the group size (the number of running instances)",
            "Id": "running_capacity",
            "MetricStat": {
              "Metric": {
                "MetricName": "GroupInServiceInstances",
                "Namespace": "AWS/AutoScaling",
                "Dimensions": [
                  {
                    "Name": "AutoScalingGroupName",
                    "Value": "my-asg"
                  }
                ]
              },
              "Stat": "Sum"
            },
            "ReturnData": false
          },
          {
            "Label": "Calculate the backlog per instance",
            "Id": "scaling_metric",
            "Expression": "queue_size / running_capacity",
            "ReturnData": true
          }
        ]
      },
      "CustomizedLoadMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "load_metric",
            "MetricStat": {
              "Metric": {
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Namespace": "AWS/SQS",
                "Dimensions": [
                  {
                    "Name": "QueueName",
                    "Value": "my-queue"
                  }
                ],
              },
              "Stat": "Sum"
            },
            "ReturnData": true
          }
        ]
      }
    }
  ]
}

예시는 정책의 ARN을 반환합니다:

{
  "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-sqs-custom-metrics-policy",
  "Alarms": []
}