← 목록

Amazon SES 기반 이메일 알림 인프라 구축: 프로덕션 발송 체계와 Lambda 연동

SES 프로덕션 액세스 활성화, 도메인/이메일 Identity 인증, SMTP User 관리, Lambda 함수 연동까지 운영 환경의 이메일 알림 인프라 전체 구성

2024-08-01AWSSESMonitoringAutomation

배경

모니터링 시스템에서 발생하는 알림을 이메일로 전달하기 위해 Amazon SES를 도입했다. AWS Config 보고서, ECS Task Retirement 안내, Windows 서버 상태 이상 알림 등 다양한 Lambda 함수에서 SES를 통해 이메일을 발송한다.

초기에는 SES 샌드박스 환경에서 테스트했으나, 운영 환경에서는 인증된 수신자 외에도 메일을 보내야 하므로 프로덕션 액세스를 신청하여 샌드박스를 해제했다.


SES 계정 구성

프로덕션 액세스

항목상태
프로덕션 액세스활성화 (샌드박스 해제)
24시간 발송 한도50,000건
최대 발송 속도14건/초
리전ap-northeast-2 (Seoul)

샌드박스 해제를 위해 AWS Support에 사용 사례(모니터링 알림, 보고서 발송)를 설명하고 승인을 받았다.

Identity 인증

SES에서 메일을 발송하려면 발신자 주소가 인증된 Identity여야 한다. 도메인 단위 인증과 개별 이메일 인증을 병행했다.

도메인 인증 (DKIM)

도메인 소유권을 증명하기 위해 DNS에 DKIM CNAME 레코드를 등록한다. 도메인이 인증되면 해당 도메인의 모든 주소에서 발송이 가능하다.

# DNS에 등록할 DKIM CNAME 레코드 (3개)
[selector1]._domainkey.[domain] → [dkim-value].dkim.amazonses.com
[selector2]._domainkey.[domain] → [dkim-value].dkim.amazonses.com
[selector3]._domainkey.[domain] → [dkim-value].dkim.amazonses.com

개별 이메일 인증

도메인 인증이 어려운 외부 이메일(Gmail 등)은 개별 이메일 주소를 등록하고 인증 메일의 링크를 클릭하여 인증한다.


SMTP User (IAM)

애플리케이션에서 SMTP 프로토콜로 SES를 사용하는 경우, SES 전용 IAM User와 SMTP 자격증명이 필요하다.

SES 콘솔 → SMTP 설정 → SMTP 자격 증명 생성
→ IAM User 자동 생성 + SMTP 비밀번호 발급

운영 환경에서는 SMTP User를 주기적으로 교체하고, 미사용 구버전 키는 정리한다.

SMTP User의 Access Key는 일반 IAM Access Key와 다르게 SES SMTP 비밀번호로 변환되어 사용된다.


Lambda 함수 연동

SES를 사용하는 Lambda 함수들은 ses:SendEmail 또는 ses:SendRawEmail 권한이 필요하다.

AWSConfigRulesMailProvider

AWS Config 규칙 평가 결과를 HTML 보고서로 생성하여 매일 아침 발송한다.

import boto3
 
ses = boto3.client('ses', region_name='ap-northeast-2')
 
def send_report(html_body, date_str):
    ses.send_email(
        Source='[noreply-email]',
        Destination={
            'ToAddresses': ['[ops-team-email]']
        },
        Message={
            'Subject': {
                'Data': f'[사내 인프라] AWS Config 규칙 평가 결과 보고서 ({date_str})',
                'Charset': 'UTF-8'
            },
            'Body': {
                'Html': {
                    'Data': html_body,
                    'Charset': 'UTF-8'
                }
            }
        }
    )

health-ecs-email-notify

ECS Task Retirement 이벤트 발생 시 대응 안내 메일을 발송한다. BCC를 활용하여 관련 담당자 다수에게 동시 발송한다.

ses.send_email(
    Source='[ops-email]',
    Destination={
        'ToAddresses': ['[ops-email]'],
        'BccAddresses': ['[member-1]', '[member-2]', '[member-3]']
    },
    Message={
        'Subject': {'Data': '[안내] ECS Task Patching Retirement 예정'},
        'Body': {'Html': {'Data': html_body}}
    }
)

CheckWindowSvrAppStatus

Windows 서버의 FileReceiver 프로세스가 다운된 상태가 연속 감지되면 알림 메일을 발송한다.


IAM 권한 설계

Lambda 함수의 실행 역할에 SES 발송 권한을 부여한다.

{
  "Effect": "Allow",
  "Action": [
    "ses:SendEmail",
    "ses:SendRawEmail"
  ],
  "Resource": "arn:aws:ses:ap-northeast-2:[account-id]:identity/*"
}

보안을 강화하려면 Resource를 특정 Identity ARN으로 제한한다.


운영 시 고려사항

Bounce/Complaint 관리

SES 프로덕션 환경에서는 Bounce(반송)와 Complaint(스팸 신고) 비율을 관리해야 한다. 비율이 높아지면 SES 발송이 제한될 수 있다.

지표권장 기준
Bounce Rate5% 미만
Complaint Rate0.1% 미만

모니터링 알림은 내부 수신자에게만 발송하므로 Bounce/Complaint 위험은 낮지만, SES 콘솔의 Reputation Dashboard에서 주기적으로 확인한다.

발송 한도 모니터링

24시간 발송 한도(50,000건)에 근접하면 SES가 자동으로 Throttling한다. CloudWatch 메트릭 Send, Bounce, Complaint를 모니터링하여 이상 징후를 감지한다.


정리


배운 점

메일 발송은 기능이 아니라 평판 관리라는 걸 이때 배웠다. 코드에서 SES를 호출하는 건 한 줄이지만, 그 한 줄이 계속 동작하려면 도메인 인증과 Bounce 비율, 발송 한도를 계속 지켜봐야 한다. 보내는 일보다 보낼 수 있는 상태를 유지하는 일이 본체다.

샌드박스 해제를 신청하면서 한 가지가 분명해졌다. 알림 경로는 장애가 났을 때 가장 필요한데, 정작 그때는 손댈 수 없다는 점이다. 그래서 알림 인프라는 장애 대응 도구가 아니라 사전에 갖춰두는 기반 설비에 가깝다.

여기서 만든 발송 기반 위에 뒤의 알림들이 전부 얹혔다. AWS Config 기반 인프라 규정 준수 모니터링의 주간 보고서도, AWS Health Dashboard 모니터링 및 알림 자동화의 사전 공지도 결국 이 경로를 탄다.


이어 읽기