03 / 07
알림 채널 구현
AWS Connect 전화, SNS SMS, Slack API, SES Email 4채널 병렬 알림 구현 상세
Multi-Channel
4채널 병렬 알림 구현
장애 발생 시 단일 채널에 의존하지 않고, 4개 채널로 동시에 알림을 발송하는 Fail-safe 구조를 구현했다.
| 채널 | 서비스 | 용도 | 특징 |
|---|---|---|---|
| 전화 | AWS Connect | 긴급 장애 즉시 인지 | 자동 음성 콜, 순차 발신 |
| SMS | AWS SNS | 문자 기반 알림 | Seoul → Tokyo 크로스 리전 |
| Slack | Slack API | 팀 채널 실시간 알림 | Bot Token + Channel ID |
| AWS SES | 상세 내용 기록 | 프로덕션 액세스, DKIM 인증 |
Channel 01
AWS Connect (전화 알림)
장애 발생 시 담당자에게 자동으로 음성 전화를 발신한다. AWS Connect의 StartOutboundVoiceContact API를 사용하여 구현했다.
Connect 인스턴스 구성
| 리전 | ap-northeast-2 (Seoul) |
| 인바운드 통화 | 비활성 |
| 아웃바운드 통화 | 활성 |
| 전화번호 유형 | TOLL_FREE (US) |
| 발신 번호 제약 | 한국에서 Connect 발신 번호 미발급 → 미국 Toll-Free 사용 |
Contact Flow (연락 흐름)
callBasedAlarmCloudWatch 알람 기반 아웃바운드 전화cloudWatchcallBasedAlarmCloudWatch 알람 기반 전화 (변형)callBasedAlarm02알람 기반 전화 (v2)StartOutboundVoiceContact API 호출
StartOutboundVoiceContactRequest request =
StartOutboundVoiceContactRequest.builder()
.contactFlowId(contactFlowId)
.instanceId(instanceId)
.queueId(queueId)
.destinationPhoneNumber(phoneNumber)
.build();
connectClient.startOutboundVoiceContact(request);비용 구조
아웃바운드 (한국)
$0.065/분
아웃바운드 (미국)
$0.0065/분
Toll-Free 번호
$0.12/번호/일
인스턴스/Flow 생성
무료
Connect Flow — 2가지 트리거 경로
CloudWatch 알람 기반 자동 전화
EC2 StatusCheckFailed, CPU 과부하 등 CloudWatch 알람 발생 시 Lambda가 Connect API를 호출하여 자동 전화 발신
AlertHub 모니터링 앱 기반 전화
자체 개발한 모니터링 앱(AlertHub)이 운영 서버 포트 상태를 2분 간격으로 점검하고, Timeout/오류 감지 시 직접 Connect API를 호출하여 전화 발신
Channel 02
AWS SNS (SMS 알림)
Seoul 리전은 SMS 발송을 지원하지 않으므로, Lambda를 통해 Tokyo 리전 SNS로 메시지를 포워딩하는 크로스 리전 구조를 설계했다.
크로스 리전 SMS 아키텍처
Tokyo SNS SMS 설정
| 리전 | ap-northeast-1 (Tokyo) |
| 샌드박스 상태 | Sandbox (등록된 번호만 발송 가능) |
| 월간 지출 한도 | $50 |
| SMS 단가 (한국) | $0.047/건 |
SMS 알림 대상 CloudWatch 알람
Seoul의 cloudwatch-alarm-topic에 연결된 알람들이 Tokyo를 경유하여 SMS로 전달된다.
애플리케이션 서버 — CPU, 메모리, 디스크
DB 서버 — CPU, 메모리, 디스크, SWAP
FTP 서버 (Windows) — CPU, 메모리, 다중 드라이브
배치 서비스 — 메모리
Lambda: sns-forward-to-tokyo 핵심 로직
# Seoul SNS에서 메시지 수신 → Tokyo SNS로 포워딩
sns_tokyo = boto3.client('sns', region_name='ap-northeast-1')
def lambda_handler(event, context):
message = event['Records'][0]['Sns']['Message']
alarm_info = json.loads(message)
# SMS에 적합한 길이로 가공 (160자 제한)
sms_message = f"[알람] {alarm_info['AlarmName']}"
sns_tokyo.publish(
TopicArn=TOKYO_TOPIC_ARN,
Message=sms_message
)Channel 03
Slack 알림
YAML 설정 기반으로 Slack Bot Token과 채널 ID를 지정하여 알림을 전송한다. 1분 단위 실시간 알림이 가능하며, ALARM/OK 양방향 알림으로 장애 발생과 해소를 모두 팀에 공유한다.
YAML 설정 예시
notification: by: slack token: xoxb-xxxx-xxxx-xxxx # Bot Token channel: C06XXXXXXXX # Channel ID
Slack 알림 활용 범위
Slack Attachment 메시지 형식
slack_message = {
'text': f'{emoji} *ECS Task Alert*',
'attachments': [{
'color': '#ff0000' if state == 'ALARM' else '#36a64f',
'fields': [
{'title': 'Alarm', 'value': alarm_name},
{'title': 'State', 'value': new_state},
{'title': 'Reason', 'value': reason[:200]},
]
}]
}Channel 04
AWS SES (Email 알림)
기존 사내 SMTP 기반 이메일 전송에서 AWS SES로 전환했다. 프로덕션 액세스를 활성화하여 샌드박스를 해제하고, 도메인 DKIM 인증으로 발송 신뢰도를 확보했다.
SES 계정 상태
| 프로덕션 액세스 | 활성화 (샌드박스 해제) |
| 24시간 발송 한도 | 50,000건 |
| 최대 발송 속도 | 14건/초 |
| 리전 | ap-northeast-2 (Seoul) |
기존 문제 (사내 SMTP)
- - 사내 SMTP 서버 지연 발생
- - AWS 환경에서 SMTP 차단 이슈
- - 안정성 보장 어려움
개선 (AWS SES)
- - AWS 환경에서 직접 전송
- - 도메인 DKIM 인증으로 신뢰도 확보
- - 발송 이력 추적 가능
SES를 사용하는 Lambda 함수
AWSConfigRulesMailProviderAWS Config 규칙 평가 HTML 보고서 (평일 매일 09:00 KST)health-ecs-email-notifyECS Task Retirement 대응 안내 메일 (BCC 다수 발송)CheckWindowSvrAppStatusWindows 서버 앱 상태 이상 시 알림Channel Architecture
채널 아키텍처 종합
AlertHub Core
notificationMethod 기반 채널 라우팅
AWS Connect
전화 발신 (Seoul)
AWS SNS
SMS (Seoul→Tokyo)
Slack API
Bot 메시지
AWS SES
이메일 (Seoul)
담당자 전화
담당자 휴대폰
팀 Slack 채널
담당자 메일함