SageMaker Async Inference는 ApproximateBacklogSizePerInstance로 Scale-to-Zero가 가능하다
·수정 2026.05.04·수정 1회
요약
- SageMaker Async Inference 엔드포인트는
min-capacity=0으로 등록하면 백로그가 없을 때 인스턴스를 0개까지 축소할 수 있다. - Target Tracking Scaling은
ApproximateBacklogSizePerInstance메트릭과TargetValue=1로 동작시키는 것이 표준 패턴이다. - CloudWatch 알람의 Dimensions에
VariantName을 넣으면INSUFFICIENT_DATA상태가 되어 autoscaling이 멈춘다 —EndpointName만 넣어야 한다.
본문
Async Inference 핵심 메트릭
| 메트릭 | 설명 |
|---|---|
ApproximateBacklogSize |
대기 중인 총 요청 수 |
ApproximateBacklogSizePerInstance |
인스턴스당 대기 중인 요청 수 (스케일링 기준) |
HasBacklogWithoutCapacity |
인스턴스 0개인데 백로그가 있으면 1 |
ApproximateBacklogSizePerInstance가 Scale-to-Zero 정책의 핵심. TargetValue=1은 인스턴스당 백로그 1개를 목표로 한다는 의미.
1단계: Scalable Target 등록
aws application-autoscaling register-scalable-target \
--service-namespace sagemaker \
--resource-id "endpoint/<ENDPOINT_NAME>/variant/AllTraffic" \
--scalable-dimension "sagemaker:variant:DesiredInstanceCount" \
--min-capacity 0 \
--max-capacity 2 \
--region ap-northeast-2
min-capacity=0이 핵심. 이게 있어야 인스턴스를 0까지 줄일 수 있다.
2단계: Target Tracking Scaling Policy
aws application-autoscaling put-scaling-policy \
--service-namespace sagemaker \
--resource-id "endpoint/<ENDPOINT_NAME>/variant/AllTraffic" \
--scalable-dimension "sagemaker:variant:DesiredInstanceCount" \
--policy-name "scale-on-backlog" \
--policy-type "TargetTrackingScaling" \
--target-tracking-scaling-policy-configuration '{
"TargetValue": 1.0,
"CustomizedMetricSpecification": {
"MetricName": "ApproximateBacklogSizePerInstance",
"Namespace": "AWS/SageMaker",
"Dimensions": [
{"Name": "EndpointName", "Value": "<ENDPOINT_NAME>"}
],
"Statistic": "Average"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 300
}' \
--region ap-northeast-2
| 파라미터 | 권장값 |
|---|---|
TargetValue |
1.0 |
ScaleOutCooldown |
30-60초 |
ScaleInCooldown |
120-300초 |
함정: Dimensions에 VariantName을 넣지 말 것
올바른 설정 (EndpointName만):
"Dimensions": [
{"Name": "EndpointName", "Value": "utterance-embedding-service-dev"}
]
잘못된 설정 (VariantName 포함):
"Dimensions": [
{"Name": "EndpointName", "Value": "utterance-embedding-service-dev"},
{"Name": "VariantName", "Value": "AllTraffic"}
]
VariantName을 추가하면 CloudWatch 알람이 메트릭과 매칭되지 않아 INSUFFICIENT_DATA 상태가 된다. 결과적으로 ALARM이 절대 트리거되지 않아 autoscaling이 멈춘다.
동작 흐름
요청 없음 (백로그=0) → AlarmLow → ScaleInCooldown → 인스턴스 0개
요청 도착 (백로그>0) → AlarmHigh → ScaleOutCooldown → 인스턴스 1개
디버깅 명령어
# 현재 인스턴스 수
aws sagemaker describe-endpoint \
--endpoint-name <ENDPOINT_NAME> \
--query 'ProductionVariants[0].{Current:CurrentInstanceCount,Desired:DesiredInstanceCount}'
# 알람 상태 (INSUFFICIENT_DATA면 Dimensions 설정 의심)
aws cloudwatch describe-alarms \
--alarm-name-prefix "TargetTracking-endpoint/<ENDPOINT_NAME>" \
--query 'MetricAlarms[*].{Name:AlarmName,State:StateValue}'
알람 상태:
OK: 정상 (임계값 이내)ALARM: 트리거됨 (스케일링 실행)INSUFFICIENT_DATA: 메트릭 매칭 실패 (Dimensions 오설정 가능성)
환경별 권장 설정
| 환경 | Min | Max | TargetValue | ScaleOut | ScaleIn |
|---|---|---|---|---|---|
| dev | 0 | 1 | 1.0 | 30초 | 120초 |
| qa | 0 | 2 | 1.0 | 60초 | 300초 |
참고
함께 읽기 좋은 글
- enhanced Container Insights는 TaskId로 series를 폭증시키지만 CloudWatch proration이 비용을 수렴시킨다
- 버퍼풀을 더 줄여도 되는지는 IOPS 천장 여유가 아니라 피크 ReadLatency로 판단한다
- AWS Secrets Manager 변경자는 CloudTrail PutSecretValue로 추적한다
- Docker Buildx provenance는 이미지를 OCI Index로 만들어 SageMaker와 Lambda에서 깨진다
- ECS Exec SSM Agent는 readonlyRootFilesystem에서 동작하지 않는다