Amazon EC2 Auto Scaling
사용 설명서

Amazon SQS에 따른 조정

이 단원에서는 Amazon Simple Queue Service(Amazon SQS) 대기열의 변화하는 요구 사항에 따라 Auto Scaling 그룹을 조정하는 방법을 보여 줍니다. Amazon SQS는 지속적이고 사용 가능한 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다. Amazon SQS에 대해 익숙하지 않을 경우 Amazon Simple Queue Service 개발자 안내서를 참조하십시오.

Amazon SQS 대기열의 활동에 따른 조정에 대해 고려할 경우 다음과 같은 여러 시나리오가 있습니다. 사용자가 이미지를 업로드하고 그러한 이미지를 온라인으로 사용하는 웹 앱을 예로 들어 보겠습니다. 각 이미지를 게시하려면 먼저 크기를 변경하고 인코딩해야 합니다. 이 앱은 일반적인 업로드 양을 처리하도록 구성된 Auto Scaling 그룹에서 EC2 인스턴스를 실행합니다. 인스턴스 수준을 항상 최신으로 유지하기 위해 비정상 인스턴스는 종료되고 교체됩니다. 앱은 이미지의 원시 비트맵 데이터를 Amazon SQS 대기열에 처리를 위해 저장하고, 이미지를 처리한 후, 사용자가 볼 수 있는 처리된 이미지를 게시합니다.

이 아키텍처는 이미지 업로드 수가 항상 일정할 경우 잘 작동합니다. 업로드 수준이 변경되면 어떻게 될까요? 업로드가 예측 가능한 일정으로 늘어나거나 줄어들면 시간과 날짜를 지정하여 조정 활동을 수행하도록 할 수 있습니다. 자세한 내용은 Amazon EC2 Auto Scaling의 예약된 조정 단원을 참조하십시오. Auto Scaling 그룹을 조정하는 보다 동적인 방법은 정책별 조정으로, 조정 프로세스를 제어하는 파라미터를 정의할 수 있습니다. 예를 들어, 평균 업로드 수가 특정 수준에 도달하면 EC2 인스턴스의 플릿을 확장하도록 요청하는 정책을 생성할 수 있습니다. 변화하는 조건에 따라 조정할 경우에 유용하지만 이러한 조건이 언제 바뀔지는 알 수는 없습니다.

이러한 구성을 위해 세 가지 방법을 사용할 수 있습니다.

  • SQS 대기열의 메시지를 처리하기 위해 EC2 인스턴스를 관리하는 Auto Scaling 그룹.

  • Auto Scaling 그룹의 EC2 인스턴스당 대기열의 메시지 수를 측정하여 Amazon CloudWatch 전송되는 사용자 지정 지표.

  • 사용자 지정 지표와 목표값에 따라 조정하도록 Auto Scaling을 구성하는 대상 추적 정책. CloudWatch 경보는 조정 정책을 호출합니다.

다음 다이어그램은 이 구성의 아키텍처를 보여 줍니다.

 대기열 아키텍처 다이어그램을 사용한 Amazon EC2 Auto Scaling

효과적인 지표와 목표값 선택

Amazon SQS 대기열의 메시지 수에 따라 필요한 인스턴스 수를 정하면 간편합니다. 하지만 플릿의 인스턴스 수는 메시지를 처리하는 데 걸리는 시간이나 애플리케이션에 허용되는 지연 시간(대기열 지연) 등과 같은 여러 요인의 영향을 받습니다.

해결 방법은 인스턴스당 백로그 지표와 목표값을 사용하여 원하는 인스턴스당 허용 백로그를 유지하는 것입니다. 이 값은 다음과 같이 계산할 수 있습니다.

  • 인스턴스당 백로그: 인스턴스당 백로그를 확인하려면 Amazon SQS 지표 ApproximateNumberOfMessages를 사용하여 SQS 대기열의 길이(대기열에서 가져올 수 있는 메시지 수)를 확인합니다. 이 값을 플릿의 실행 용량(Auto Scaling 그룹에서 상태가 InService인 인스턴스 수)으로 나눠서 인스턴스당 백로그를 산출합니다.

  • 인스턴스당 허용되는 백로그: 목표값을 확인하려면 먼저 애플리케이션에서 허용할 수 있는 지연 시간을 계산하십시오. 그런 다음 이 허용 지연 시간 값을, EC2 인스턴스가 메시지를 처리하기 위해 소요하는 평균 시간으로 나눕니다.

이 예제에서는 현재 ApproximateNumberOfMessages가 1500개이고 플릿의 실행 용량이 10입니다. 각 메시지의 평균 처리 시간 0.1초이고 가장 긴 허용 지연 시간이 10초인 경우, 인스턴스당 허용 가능한 백로그는 10/0.1인 100입니다. 즉, 목표 추적 정책의 목표값은 100입니다. 인스턴스당 백로그가 현재 150(1500/10)이므로, 플릿은 5개의 인스턴스를 추가하여 목표값 비율을 유지합니다.

다음은 사용자 지정 지표를 만들고, Auto Scaling 그룹이 해당 수치에 따라 조정을 수행하도록 구성하는 목표 추적 조정 정책을 생성하는 예제입니다.

AWS CLI를 사용하여 Amazon SQS에 맞게 조정

다음 단원에서는 AWS CLI를 사용하여 SQS 대기열의 자동 조정을 설정하는 방법을 설명합니다. 이 절차에서는 대기열(표준 또는 FIFO), Auto Scaling그룹, 대기열을 사용하는 애플리케이션에서 실행 중인 EC2 인스턴스가 이미 있는 것으로 가정합니다.

1단계: CloudWatch 사용자 지정 지표 만들기

AWS 계정의 지표를 확인하여 사용자 지정 계산 지표를 생성함으로써 앞 단원에서 추천한 인스턴스당 백로그 지표를 계산하고 이 수치를 1분 간격으로 CloudWatch에 게시합니다.

가능한 경우, 사용률 변화에 신속하게 대응하기 위해 지표를 1분 간격(세부 모니터링)으로 조정해야 합니다. 주기를 5분으로 하면 응답 시간이 느려질 뿐만 아니라 오랜 시간이 지난 측정치 데이터를 기준으로 조정하게 됩니다. Amazon EC2 인스턴스는 기본 모니터링, 즉 5분 주기로 인스턴스의 측정치 데이터를 사용하도록 기본적으로 활성화되어 있습니다. 하지만 세부 모니터링을 활성화하여 인스턴스의 측정치 데이터를 가져오는 주기를 1분으로 바꿀 수 있습니다.

CloudWatch 사용자 지정 지표를 만들려면

  1. SQS get-queue-attributes 명령을 사용하여 대기열에서 대기 중인 메시지 수(ApproximateNumberOfMessages)를 확인할 수 있습니다.

    aws sqs get-queue-attributes --queue-url https://sqs.us-west-2.amazonaws.com/123456789/MyQueue --attribute-names ApproximateNumberOfMessages
  2. 그룹의 실행 용량(InService 수명 주기 상태의 인스턴스 수)을 확인하려면 describe-auto-scaling-groups 명령을 사용합니다. 이 명령은 Auto Scaling 그룹의 인스턴스와 해당 수명 주기 상태를 반환합니다.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names MyAutoScalingGroup
  3. ApproximateNumberOfMessages 지표를 플릿의 실행 용량 지표로 나눠서 인스턴스당 백로그를 계산합니다.

  4. AWS CLI 또는 API를 사용하여 결과를 CloudWatch 사용자 지표로 1분마다 게시합니다. 사용자 지정 지표는 지표 이름과 선택한 네임스페이스를 사용하여 정의됩니다. 사용자 지정 지표를 위한 네임스페이스는 "AWS/"로 시작할 수 없습니다. 사용자 지정 지표 게시에 대한 자세한 내용은 Amazon CloudWatch 사용 설명서사용자 지정 지표 게시를 참조하십시오.

    다음은 CLI put-metric-data 명령의 예입니다.

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace --unit None --value 20

애플리케이션에서 해당 지표를 생성하면 데이터가 CloudWatch로 전송됩니다. 이 지표는 CloudWatch 콘솔에서 볼 수 있습니다. AWS Management 콘솔에 로그인한 후 CloudWatch 페이지로 이동합니다. 지표 페이지를 탐색하거나, 검색 상자를 사용하여 지표를 검색하는 방법으로 지표를 볼 수 있습니다. 지표를 보는 방법은 Amazon CloudWatch 사용 설명서사용 가능 지표 보기를 참조하십시오.

2단계: 조정 정책 만들기

이제, 조건이 변경될 때 Auto Scaling 그룹에서 무엇을 수행할지를 지시하는 조정 정책을 만들어 보겠습니다.

조정 정책을 생성하려면

  1. 다음 명령을 사용하여 홈 디렉터리의 config.json 파일에 조정 정책에 대한 목표값을 지정합니다.

    TargetValue에, 인스턴스당 허용 백로그 지표를 계산하여 입력합니다. 이 값을 계산하려면 보통 지연 시간 값을 확인하여, 이 값을 메시지를 처리하는 데 걸리는 평균 시간으로 나눕니다.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Statistic":"Average", "Unit":"None" } }
  2. put-scaling-policy 명령과, 전 단계에서 만든 config.json 파일을 사용하여 조정 정책을 만듭니다.

    aws autoscaling put-scaling-policy --policy-name MyScalingPolicy --auto-scaling-group-name MyAutoScalingGroup --policy-type TargetTrackingScaling --target-tracking-configuration file://~/config.json

    이 정책은 확장과 축소에 대해 한 개씩 두 개의 경보를 생성합니다. 또한 CloudWatch에 등록된 정책의 Amazon 리소스 이름(ARN)을 반환합니다. CloudWatch는 지표가 위반될 때마다 이 이름을 사용하여 조정 기능을 호출합니다.

3단계: 조정 정책 테스트

SQS 대기열의 메시지 수를 늘린 다음 Auto Scaling 그룹에서 추가 EC2 인스턴스를 시작했는지 확인하여 확장 정책을 테스트할 수 있습니다. 마찬가지로 SQS 대기열의 메시지 수를 줄인 다음 Auto Scaling 그룹에서 EC2 인스턴스를 종료했는지 확인하여 축소 정책을 테스트할 수 있습니다.

확장 정책을 테스트하려면

  1. 자습서: Amazon SQS 대기열로 메시지 전송의 단계를 수행하여 대기열에 메시지를 추가합니다. 인스턴스당 백로그 지표가 목표값을 초과하도록 대기열의 메시지 수를 늘려야 합니다.

    변경 사항에 따라 CloudWatch 경보가 발생하기까지 몇 분 정도 걸릴 수 있습니다.

  2. describe-auto-scaling-groups 명령을 사용하여 그룹에서 인스턴스를 시작했는지 확인합니다.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name MyAutoScalingGroup

축소 정책을 테스트하려면

  1. 자습서: Amazon SQS 대기열로 메시지 전송의 단계를 수행하여 대기열에서 메시지를 제거합니다. 인스턴스당 백로그 지표가 목표값 미만이 되도록 대기열의 메시지 수를 줄여야 합니다.

    변경 사항에 따라 CloudWatch 경보가 발생하기까지 몇 분 정도 걸릴 수 있습니다.

  2. describe-auto-scaling-groups 명령을 사용하여 그룹에서 인스턴스를 종료했는지 확인합니다.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name MyAutoScalingGroup

목표 추적에 대한 자세한 내용은 Amazon EC2 Auto Scaling의 대상 추적 조정 정책 단원을 참조하십시오.