우당탕탕

AWS SES로 이메일 발송 구현하며 겪은 비용과 설정 문제 해결기 본문

Tech/AWS

AWS SES로 이메일 발송 구현하며 겪은 비용과 설정 문제 해결기

모찌모찝 2026. 8. 4. 18:29

AWS SES로 이메일 발송 기능을 구현하다가 생각보다 비용과 설정 문제로 삽질을 꽤 했어요. 특히 실제 운영 환경에 적용하려니 이메일 발송 한도, 요금 계산, 스팸 필터 우회 같은 부분에서 막힌 게 많았거든요.

이 글에서는 AWS SES 기본 세팅부터 비용 구조까지, 그리고 제가 직접 겪은 대표적인 문제와 그 해결법을 상세하게 공유하려고 해요. 비용 비교 표도 만들었으니 AWS SES 도입 고민하시는 분께 현실적인 도움이 될 거예요.

개발 환경 / 버전 정보

제가 사용한 환경은 AWS SES (서울 리전 ap-northeast-2) 기반이고, 개발은 Node.js 18로 SMTP 프로토콜을 사용했어요.

AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 이미지

AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보

AWS SES 핵심 비용 구조 알아보기

사실 AWS SES는 저렴하지만 한도와 추가 비용 부분에서 헷갈리기 쉬워요. 기본적으로 월 62,000건(62,000개의 이메일)을 무료로 보내고, 그 이상부터는 건당 요금이 붙습니다.

항목 무료 한도 추가 요금 (USD 기준) 한국 원화 환산 (약 1,300원/USD)
이메일 발송 (SMTP/API) 62,000건 / 월 $0.10 / 1,000건 약 130원 / 건
데이터 전송 (송신 메일 크기 1MB 당) - $0.12 / GB 약 156원 / MB

제가 직접 계산해보니까 월 10만 건을 넘게 보낼 경우 대략 약 4,880원의 추가 비용이 발생하더라고요. (이메일 수수료 + 데이터 전송 포함)

AWS SES 이메일 발송 기본 구현 방법

제가 처음에 만든 가장 기본 예제는 Node.js에서 Nodemailer를 이용해 SMTP로 SES에 연결하는 방식이었어요. 이렇게 하면 API 키 없이도 간단하게 구현할 수 있거든요.

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  host: 'email-smtp.ap-northeast-2.amazonaws.com', // 서울 리전
  port: 465,
  secure: true, // SSL
  auth: {
    user: process.env.AWS_SES_SMTP_USER, // SMTP 사용자 이름
    pass: process.env.AWS_SES_SMTP_PASS, // SMTP 비밀번호
  },
});

async function sendEmail() {
  let info = await transporter.sendMail({
    from: 'your_verified_email@example.com',
    to: 'recipient@example.com',
    subject: 'AWS SES 테스트 이메일',
    text: 'AWS SES를 통한 이메일 발송 테스트입니다!',
  });
  console.log('메시지 전송 완료: %s', info.messageId);
}

sendEmail().catch(console.error);

이 코드는 AWS에서 발급받은 SMTP 자격증명으로 SES 서버에 접속해 이메일을 보냅니다. 여기서 중요한 점은 이메일 보내는 주소가 SES에서 반드시 검증(verified)되어 있어야 한다는 거예요.

AWS SES로 이메일 발송 구현하면서 겪은 이슈 직접 정리한 자료

AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보

여기서 많이 막혔던 SES 발송 한도와 정책

사실 이 부분이 제일 까다로웠는데, SES 기본 계정은 샌드박스 모드라서 하루 최대 200건, 분당 1건 제한이 걸려있거든요. 그래서 바로 운영용으로 못 쓰고, AWS 지원 신청해서 샌드박스 해제를 요청해야 했어요.

AWS Support에 아래 양식으로 요청했더니 48시간 내에 반영해줬는데, 답변 예시는 이렇습니다.

Subject: Request to move out of SES sandbox

Hello AWS Support,

We would like to move our SES account out of the sandbox environment for production use.
Our use case involves transactional emails sent to our customers.

Thank you,
Your Name

이 과정을 몰라서 한동안 이메일 발송량 초과로 실패가 많이 났고, 로그에 아래 같은 에러가 찍혔었거든요.

MessageRejected: Email address is not verified. (Service: AmazonSimpleEmailService; Status Code: 400;)

이 에러 메시지는 검증되지 않은 이메일 또는 도메인에서 보내려 할 때 발생합니다. 그래서 도메인 인증(DKIM, SPF 설정 포함)은 반드시 선행하는 게 좋아요.

저는 이렇게 도메인 인증과 DKIM 설정했어요

AWS SES 콘솔에서 도메인 추가 후 DNS 제공 값을 DNS 관리 콘솔에 입력했는데, 특히 DKIM 레코드는 3개가 나와서 모두 등록해야 하더라고요.

  • TXT 타입 SPF 레코드: v=spf1 include:amazonses.com ~all 추가
  • CNAME 타입 DKIM 3개 레코드 등록
  • 도메인 검증 완료 후 이메일 발송 가능

DNS 전파 시간이 길면 24시간 이상 걸릴 수도 있는데, 저는 약 2시간 만에 인증이 되어 놀랐어요. 콘솔에서 검증 상태 확인하는 것도 꼭 하세요.

AWS SES로 이메일 발송 구현하면서 겪은 이슈 참고 사진

AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보

AWS SES와 타사 이메일 서비스 비용 비교

저도 비용 때문에 고민 많았는데, 보편적으로 많이 쓰는 SendGrid, Mailgun과 비교표를 만들어 보니까 확실히 AWS SES가 가성비는 뛰어나더라고요.

서비스 무료 한도 (월) 추가 요금 (1,000건 기준) 한국 원화 환산 (약 1,300원/USD) 특징
AWS SES 62,000건 $0.10 약 130원 리전별 가격 변동, SMTP 지원, 낮은 비용
SendGrid (Essentials) 40,000건 $14.95 / 50,000건 약 388원 추가 기능 많으나 비용 높음
Mailgun (Foundation) 5,000건 $0.80 / 1,000건 약 1,040원 기능 대비 가격 높음

이걸 보니까 월 10만 건 기준으로 SendGrid가 AWS SES보다 약 3배 이상 비싼 셈이고, Mailgun은 훨씬 더 비쌌어요. 그래서 비용 최적화가 목표라면 AWS SES가 압도적이더라고요.

여기서 삽질했던 부분과 해결 과정

이메일 발송 중에 가장 자주 마주친 문제는 "MessageRejected"와 "ThrottlingException" 에러였어요. 특히 후자는 발송 속도를 너무 빠르게 해서 SES 제한에 걸릴 때 나오는 에러였죠.

ThrottlingException: Rate exceeded
    at AmazonSimpleEmailService.sendRawEmail (AWS SDK)

처음에는 무작정 재시도 로직만 넣었는데, 발송 속도 제한을 전혀 고려하지 않아서 실패가 계속 났어요. 그래서 SES 대시보드에서 현재 발송 한도를 확인하고, 초당 최대 건수를 조절하는 로직을 넣기로 했습니다.

// 발송량 제한 고려한 간단한 지연 함수
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function sendManyEmails(emails) {
  for (const email of emails) {
    try {
      await sendEmail(email);
      await delay(50); // 20건/초 제한 맞추기
    } catch (error) {
      console.error('발송 실패:', error);
    }
  }
}

이렇게 초당 20건 정도로 발송 제한 속도를 맞추니 오류가 거의 없어졌고 안정적으로 돌아갔어요.

심화: 메일 콘텐츠와 스팸 필터 이슈도 주의하세요

이메일 내용도 중요했는데, HTML 구조가 너무 복잡하거나 링크가 의심스러우면 AWS SES가 자체적으로 스팸으로 분류할 수도 있더라고요. 그래서 메일 내용은 최대한 심플하게 만들었고, 링크는 반드시 HTTPS로 시작하는 인증된 주소만 넣었어요.

그리고 이메일 수신자 도메인을 미리 검증하거나 피드백 루프를 모니터링하는 것도 운영에 큰 도움이 됩니다.

자주 물어보시는 것들

Q. AWS SES 무료 한도는 꼭 서울 리전도 동일한가요?

A. 대체로 SES 무료 한도는 리전에 따라 거의 동일하지만, 데이터 전송 비용은 리전마다 조금씩 다르니 콘솔에서 꼭 확인하세요.

Q. SES 샌드박스 해제는 얼마나 걸리나요?

A. 보통 1~2일 안에 처리되는데, 요청 시 작성한 용도와 이메일 양식이 적절해야 빨리 승인됩니다.

Q. SES 대신 다른 서비스 쓰면 비용 차이가 얼마나 나나요?

A. 위 비용 비교표를 참고해주세요. 특히 대량 발송 시 AWS SES가 월등히 저렴합니다.

AWS SES는 정말 비용 경쟁력이 좋고 AWS 생태계와 연동하기도 편해서, 비용과 설정 문제만 잘 해결하면 최고의 이메일 발송 서비스가 될 수 있어요. 저처럼 막히는 지점이 있으면 이 내용을 참고해서 한 번에 뚫으시길 바랄게요.

Comments