← 목록으로AWS

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

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

AWSSESMonitoringAutomation
2024-08-01

배경

모니터링 시스템에서 발생하는 알림을 이메일로 전달하기 위해 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 프로덕션 액세스 활성화로 샌드박스 제한 해제
  • 도메인 DKIM 인증 + 개별 이메일 인증으로 발송 신뢰도 확보
  • 3개 Lambda 함수에서 SES를 통해 Config 보고서, ECS Retirement 안내, Windows 서버 알림 발송
  • SMTP User 관리 및 주기적 키 로테이션 운영
  • 내부 수신자 대상이므로 Bounce/Complaint 위험 낮음