Circuit Breaker를 이용한 숨은 ECS 배포 실패 방지
Source: Dev.to
위에 제공된 링크만으로는 번역할 실제 텍스트가 포함되어 있지 않습니다. 번역을 원하는 본문을 복사해서 여기 붙여 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.
개요
AWS Elastic Container Service (ECS)는 배포 회로 차단기라는 내장 기능을 제공하여 서비스 배포를 보다 안전하고 탄력적으로 만들도록 설계되었습니다.
회로 차단기는 배포 중 작업의 상태를 지속적으로 모니터링하고, 새로 시작된 작업이 정상 상태가 되지 못하면 자동으로 변경 사항을 롤백합니다. 이를 활성화하면 실패한 배포가 서비스가 저하되거나 비활성화된 상태로 남는 것을 방지할 수 있습니다.
이 보호 장치가 없으면 배포 실패가 쉽게 눈에 띄지 않을 수 있습니다. 예를 들어, 새 작업이 시작되지 않거나 헬스 체크를 통과하지 못하면 서비스는 여전히 실행 중인 것처럼 보이지만 실제로는 중단된 상태일 수 있습니다. 이러한 무음 실패는 워크로드에 따라 데이터 손실, 재정적 손실 또는 운영상의 문제를 초래할 수 있습니다.
이 글에서는 다음과 같은 내용을 단계별로 살펴보겠습니다.
- Terraform을 사용하여 ECS 배포 회로 차단기를 활성화하기.
- EventBridge를 통해 배포 실패를 관찰하기.
- 실시간 알림을 Slack으로 전송하기.
ECS 배포 회로 차단기가 중요한 이유
- 자동 롤백 – 실패한 배포가 마지막으로 정상으로 확인된 서비스 리비전으로 되돌아갑니다.
- 가시성 향상 – 배포가 실패하거나 롤백될 때마다 ECS가 구조화된 이벤트를 발생시킵니다.
- 운영 오버헤드 감소 – 실패가 즉각적인 수동 개입 없이 자동으로 완화됩니다.
이들을 함께 적용하면 결함이 있는 배포로 인한 프로덕션 사고 위험을 크게 줄일 수 있습니다.
Terraform으로 서킷 브레이커 활성화
배포 서킷 브레이커는 ECS 서비스 정의에 직접 포함시킬 수 있습니다. Terraform에서는 deployment_circuit_breaker 블록을 사용하여 설정합니다:
resource "aws_ecs_service" "default" {
name = "tuve"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.default.arn
desired_count = 2
deployment_circuit_breaker {
enable = true
rollback = true
}
# … other service settings …
}
이 구성을 적용하면 새 작업이 정상 상태에 도달하지 못할 경우 ECS가 자동으로 배포를 중단하고 롤백합니다.
활성화된 후에는 AWS Management Console에서 Deployment circuit breaker가 켜져 있음을 명확히 표시합니다.

배포 실패 관찰
자동 롤백은 유용하지만 가시성도 마찬가지로 중요합니다.
ECS 배포 회로 차단기가 트리거되면, ECS는 다음 detail type을 사용하여 Amazon EventBridge에 이벤트를 전송합니다:
ECS Deployment State Change
이벤트 페이로드 예시
{
"version": "0",
"id": "ddca6449-b258-46c0-8653-e0e3aEXAMPLE",
"detail-type": "ECS Deployment State Change",
"source": "aws.ecs",
"account": "111122223333",
"time": "2020-05-23T12:31:14Z",
"region": "eu-central-1",
"resources": [
"arn:aws:ecs:eu-central-1:111122223333:service/default/servicetest"
],
"detail": {
"eventType": "ERROR",
"eventName": "SERVICE_DEPLOYMENT_FAILED",
"deploymentId": "ecs-svc/123",
"updatedAt": "2020-05-23T11:11:11Z",
"reason": "ECS deployment circuit breaker: task failed to start."
}
}
모니터링해야 할 주요 필드
| 필드 | 설명 |
|---|---|
| eventName | SERVICE_DEPLOYMENT_FAILED 또는 SERVICE_DEPLOYMENT_ROLLBACK_COMPLETED |
| reason | 배포가 실패한 이유에 대한 사람이 읽을 수 있는 설명 |
| resources | 영향을 받은 ECS 서비스의 ARN(들) |
| updatedAt | 실패 이벤트의 타임스탬프 |
이러한 필드를 추적하면 배포 문제를 몇 시간 뒤에 발견하는 것이 아니라 즉시 확인할 수 있습니다.
AWS 콘솔에서 배포 롤백
AWS Management Console은 롤백 활동에 대한 명확한 가시성을 제공합니다. 배포가 실패한 후 Deployments 탭에 롤백 상태와 대상 서비스 리비전이 표시됩니다.

이 뷰는 회로 차단기가 예상대로 작동했는지 확인하는 데 특히 유용합니다.
Slack에 배포 알림 전송
배포 실패를 즉시 인지할 수 있도록, ECS 배포 이벤트를 EventBridge와 Lambda 함수를 통해 Slack으로 라우팅할 수 있습니다.
전체 흐름: ECS → EventBridge → Lambda → Slack
Lambda 핸들러 예시 (Python)
import json
import urllib.request
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX"
def lambda_handler(event, context):
# Verify we have the right event type
if event.get("detail-type") != "ECS Deployment State Change":
return
detail = event.get("detail", {})
event_name = detail.get("eventName")
# Only act on failure or rollback completion events
if event_name not in (
"SERVICE_DEPLOYMENT_FAILED",
"SERVICE_DEPLOYMENT_ROLLBACK_COMPLETED",
):
return
# Extract useful information
resources = event.get("resources", [])
service_name = resources[0].split("/")[-1] if resources else "unknown"
reason = detail.get("reason", "Unknown")
updated_at = detail.get("updatedAt", "Unknown")
# Build Slack message
message = {
"text": f"*ECS Deployment Alert*\n"
f"*Service:* `{service_name}`\n"
f"*Event:* `{event_name}`\n"
f"*Reason:* {reason}\n"
f"*Time:* {updated_at}"
}
# Send to Slack
data = json.dumps(message).encode("utf-8")
req = urllib.request.Request(
SLACK_WEBHOOK_URL,
data=data,
headers={"Content-Type": "application/json"},
)
urllib.request.urlopen(req)
return {"statusCode": 200, "body": "Notification sent"}
EventBridge 규칙을 구성하여 ECS Deployment State Change 상세 유형과 일치하도록 하고, 해당 이벤트를 이 Lambda 함수로 전달합니다. 실패나 롤백이 발생하면 Lambda가 지정된 Slack 채널에 형식화된 메시지를 게시하여 팀에 즉시 가시성을 제공합니다.
TL;DR
- ECS 서비스에서
deployment_circuit_breaker를 활성화하세요 (위의 Terraform 예시 참고). - EventBridge를 사용하여
ECS Deployment State Change이벤트를 캡처하세요. - 해당 이벤트를 Lambda로 전달하여 Slack에 즉시 알림을 보내도록 하세요.
회로 차단기, EventBridge 모니터링 및 Slack 알림을 설정하면, 잘못된 배포를 자동으로 롤백하고 즉시 발생 사실을 알려주는 견고한 안전망을 갖게 됩니다.
send_slack_notification(
service=service_name,
reason=reason,
event_type=event_name,
timestamp=updated_at
)
EventBridge 규칙 (Terraform)
다음 EventBridge 규칙은 ECS 배포 이벤트를 필터링하고 이를 Lambda 함수로 전달합니다:
resource "aws_cloudwatch_event_rule" "ecs_deployment" {
name = "ecs-deployment-events"
event_pattern = jsonencode({
"source": ["aws.ecs"],
"detail-type": ["ECS Deployment State Change"],
"detail": {
"eventName": [
"SERVICE_DEPLOYMENT_FAILED",
"SERVICE_DEPLOYMENT_ROLLBACK_COMPLETED"
]
}
})
}
resource "aws_cloudwatch_event_target" "lambda" {
rule = aws_cloudwatch_event_rule.ecs_deployment.name
arn = aws_lambda_function.notification.arn
}
최종 결과
ECS 배포 회로 차단기를 활성화하고 Slack 알림을 추가한 후:
- 실패한 배포가 자동으로 롤백됩니다
- 무음 서비스 실패가 제거됩니다
- 배포 문제가 실시간으로 가시화됩니다
- ECS 서비스가 기본적으로 더 안전해집니다
자동 롤백과 실시간 알림을 결합함으로써 운영 위험을 크게 줄이고 ECS 배포에 대한 신뢰를 높일 수 있습니다.