CloudFront 캐시 무효화(Invalidation) 완벽 가이드 — S3 파일 교체 후 즉시 반영하는 방법

S3 버킷에 파일을 덮어썼는데 CloudFront는 여전히 구버전을 서빙하고 있다. 배포 직후 사용자 신고가 들어오고, 콘솔을 열어보면 S3에는 분명 새 파일이 올라가 있다. 이 상황에서 필요한 것이 CloudFront 캐시 무효화(Invalidation) 다 — 엣지 로케이션에 남아있는 캐시 객체를 강제로 만료시켜 다음 요청 시 오리진에서 최신 버전을 가져오게 만드는 메커니즘이다. TL;DR — CloudFront 캐시 무효화 핵심 요약 상황 권장 방법 비용 특정 파일 1~수십 개 교체 경로 지정 Invalidation 월 1,000 경로 무료, 초과 시 유료 전체 캐시 일괄 초기화 /* 와일드카드 Invalidation 1개 경로로 카운트되나 모든 객체 무효화 배포 파이프라인 자동화 CLI / SDK Invalidation 호출 동일 과금 구조 근본적 캐시 충돌 방지 파일명 버전닝(캐시 버스팅) 무료 — Invalidation 불필요 정가 및 무료 한도는 변경될 수 있으므로 AWS CloudFront 공식 요금 페이지 에서 확인하라. CloudFront 캐시가 동작하는 방식 — 왜 S3를 바꿔도 즉시 반영되지 않는가 CloudFront는 전 세계 엣지 로케이션에 콘텐츠 사본을 저장한다. 사용자 요청이 들어오면 엣지가 먼저 로컬 캐시를 확인하고, 캐시 히트면 오리진(S3)에 전혀 접근하지 않고 응답한다. 캐시 항목은 TTL(Time To Live)이 만료되거나 명시적으로 무효화될 때까지 유지된다. S3에 파일을 덮어써도 엣지 캐시의 TTL이 남아있는 한 CloudFront는 오리진을 다시 조회하지 않는다. TTL은 오리진의 Cache-Control 헤더 또는 CloudFront 배포 설정의 'Default TTL'로 결정된다. 기본값이 24시간이면 최대 하루 동안 구버전이 서빙될 ...

AWS SES 샌드박스 모드: 고객에게 이메일이 안 가는 이유와 프로덕션 전환 방법

SES로 내 계정 이메일로는 잘 보내지는데, 실제 고객 이메일 주소로는 전송이 안 된다. 처음 SES를 설정할 때 가장 많이 마주치는 상황이다. 원인은 단순하다 — AWS SES는 모든 신규 계정을 기본적으로 샌드박스(Sandbox) 모드 로 시작하며, 이 상태에서는 발신과 수신 모두 사전 검증된 이메일 주소로만 제한된다. TL;DR — SES 샌드박스 모드 핵심 요약 항목 샌드박스 모드 프로덕션 모드 수신자 제한 검증된 이메일/도메인만 가능 임의의 수신자 가능 일일 발송 한도 200건/일, 1건/초 요청에 따라 증가 가능 발신자 주소 검증된 이메일/도메인만 가능 검증된 이메일/도메인만 가능 바운스/컴플레인 처리 시뮬레이터로 테스트 가능 실제 피드백 루프 필요 전환 방법 — AWS Support 케이스 제출 정확한 한도 수치는 AWS 공식 문서에서 확인하라. 리전별, 계정별로 다를 수 있다. SES 샌드박스 모드가 작동하는 방식 AWS가 샌드박스를 두는 이유는 명확하다. 이메일 인프라는 스팸 발송자들이 가장 먼저 노리는 대상이고, 새로 생성된 AWS 계정에서 대량 스팸이 발송되면 SES 전체의 IP 평판이 훼손된다. 샌드박스는 그 방어선이다. 샌드박스 상태에서 SES가 이메일을 수락하는 조건은 두 가지다. 발신자 주소(From)가 SES에 검증된 이메일 또는 도메인이어야 하고, 수신자 주소(To) 역시 검증된 이메일 또는 도메인에 속해야 한다. 두 조건 중 하나라도 어긋나면 SES는 메시지 전송을 거부한다. graph TD A["이메일 발송 요청"] --> B{"발신자 주소 검증 여부"} B -- "미검증" --> C["SES 거부 (발신자 오류)"] B -- "검증됨...

EC2 인스턴스 시작 시 스크립트 자동 실행: User Data 완전 가이드

EC2 인스턴스를 띄울 때마다 Nginx 설치, 환경 변수 설정, 애플리케이션 배포를 수동으로 반복하고 있다면, User Data를 제대로 활용하지 못하고 있는 것이다. 이 글은 EC2 User Data 를 사용해 인스턴스 최초 부팅 시 셸 스크립트를 자동 실행하는 방법을 실제 운영 관점에서 정리한다. TL;DR — EC2 User Data 핵심 요약 항목 내용 실행 시점 인스턴스 최초 부팅 시 1회 (기본값) 실행 주체 root 권한으로 실행됨 스크립트 시작 반드시 #!/bin/bash 또는 #!/bin/sh 포함 로그 위치 /var/log/cloud-init-output.log 콘솔 입력 위치 인스턴스 시작 마법사 → '고급 세부 정보' → 'User Data' CLI 파라미터 --user-data file://userdata.sh 크기 제한 최대 16KB (일반 텍스트 기준) EC2 User Data가 동작하는 방식 User Data는 cloud-init 데몬이 처리한다. 인스턴스가 처음 부팅될 때 cloud-init은 EC2 인스턴스 메타데이터 서비스(IMDS)에서 User Data를 가져와 실행한다. 스크립트가 #!/bin/bash 로 시작하면 셸 스크립트로 처리되고, #cloud-config 로 시작하면 cloud-init 네이티브 YAML 형식으로 처리된다. 중요한 점은 기본적으로 최초 1회만 실행된다는 것이다. 인스턴스를 재시작해도 User Data는 다시 실행되지 않는다. 매 부팅마다 실행하려면 별도 설정이 필요하다. sequenceDiagram participant EC2 as EC2 인스턴스 participant IMDS as 메타데이터 서비스 participant CI as cloud-init ...

SNS 이메일 알림이 안 올 때 — 구독 확인 링크부터 점검하라

SNS 토픽을 만들고 이메일 구독까지 등록했는데 알림이 하나도 안 온다. 가장 먼저 의심해야 할 건 코드도 IAM도 아니다 — 구독 확인(Subscription Confirmation) 이메일을 클릭했는지 여부다. 이 단계를 건너뛰면 SNS는 메시지를 발행해도 해당 엔드포인트로 전달하지 않는다. TL;DR — SNS 이메일 알림 미수신 핵심 체크리스트 점검 항목 확인 방법 조치 구독 상태가 'PendingConfirmation' AWS 콘솔 또는 CLI로 구독 목록 조회 확인 이메일의 링크 클릭 또는 재발송 확인 이메일이 스팸함에 있음 수신 이메일함 스팸 폴더 확인 스팸 해제 후 링크 클릭 토픽에 메시지가 실제로 발행되지 않음 CloudWatch 지표 NumberOfMessagesSent 확인 Publish API 또는 콘솔에서 테스트 메시지 발행 구독 필터 정책이 메시지를 차단 구독 속성의 FilterPolicy 확인 필터 정책 제거 또는 메시지 속성 추가 잘못된 이메일 주소로 구독 등록 구독 엔드포인트 값 확인 구독 삭제 후 올바른 주소로 재등록 SNS 이메일 구독의 동작 원리 SNS 이메일 알림이 왜 안 오는지 이해하려면 구독 생성부터 메시지 전달까지의 흐름을 알아야 한다. SNS는 이메일 엔드포인트를 등록할 때 즉시 활성화하지 않는다. 반드시 수신자가 확인 이메일의 링크를 클릭해야 구독이 'Confirmed' 상태로 전환된다. 이 설계는 동의 없이 타인의 이메일로 메시지를 보내는 것을 방지하기 위한 것이다. sequenceDiagram participant User as 사용자 participant SNS as Amazon SNS participant Email as 이메일 수신함 User->>SNS: subscr...

AWS KMS 완전 이해: S3 버킷 암호화에 AWS 관리형 키 vs CMK, 어떤 걸 써야 할까?

S3 버킷에 암호화를 적용하려고 콘솔을 열었을 때, 'AWS 관리형 키(aws/s3)'와 '고객 관리형 키(CMK)' 두 가지 선택지 앞에서 멈춰본 경험이 있을 것이다. 단순히 '암호화만 되면 되는 거 아닌가?'라고 생각했다가, 나중에 KMS API 호출 비용 청구서를 받고 당황하거나, 감사 요건을 충족하지 못해 다시 설계를 뒤집는 상황이 실제로 발생한다. AWS KMS 키 유형 선택은 보안 정책, 운영 복잡도, 비용 모두에 직접적인 영향을 미친다. TL;DR: AWS 관리형 키 vs 고객 관리형 키 (CMK) 핵심 비교 항목 AWS 관리형 키 (aws/s3) 고객 관리형 키 (CMK) 키 생성 주체 AWS가 자동 생성 사용자가 직접 생성 키 정책 제어 불가 (AWS 관리) 완전 제어 가능 키 로테이션 제어 AWS 자동 관리 (1년) 사용자 설정 가능 교차 계정 접근 불가 키 정책으로 허용 가능 월 키 관리 비용 무료 키당 월 $1 (대칭 키 기준) API 호출 비용 발생 (요청당 과금) 발생 (요청당 과금) CloudTrail 감사 제한적 모든 키 사용 이벤트 기록 Bucket Key 지원 지원 지원 AWS KMS가 S3 암호화에서 동작하는 방식 S3의 SSE-KMS 암호화는 봉투 암호화(envelope encr...

RDS Multi-AZ 이점 완전 정리: 고가용성, 페일오버, 그리고 성능 오해

프로덕션 RDS 인스턴스를 처음 설정할 때 Multi-AZ 옵션을 보고 '이거 켜면 성능도 좋아지겠지?'라고 생각했다면, 그 가정이 장애 대응 중에 당신을 배신할 수 있다. Multi-AZ는 고가용성과 페일오버 를 위한 기능이지, 읽기 성능 향상을 위한 기능이 아니다. TL;DR: RDS Multi-AZ 핵심 요약 항목 Multi-AZ 동작 목적 고가용성 및 자동 페일오버 스탠바이 인스턴스 직접 접근 불가 (읽기/쓰기 모두 차단) 읽기 성능 향상 없음 — 읽기 스케일아웃은 Read Replica 사용 쓰기 성능 영향 동기 복제로 인한 소폭 지연 가능 페일오버 소요 시간 일반적으로 60~120초 (공식 보장 없음) 데이터 내구성 동기 복제로 RPO ≈ 0 자동 백업 스탠바이에서 수행 (프라이머리 I/O 영향 감소) RDS Multi-AZ가 실제로 하는 일 Multi-AZ를 활성화하면 AWS는 다른 가용 영역(AZ)에 스탠바이 인스턴스를 자동으로 프로비저닝한다. 프라이머리 인스턴스에 쓰기가 발생하면 Amazon RDS는 동기식 블록 수준 복제를 통해 스탠바이에 데이터를 미러링한다. 애플리케이션은 항상 프라이머리 엔드포인트 하나만 바라본다. 여기서 핵심은 동기(synchronous) 복제 라는 점이다. 프라이머리가 트랜잭션을 커밋하기 전에 스탠바이에도 기록이 완료되어야 한다. 이 구조 덕분에 페일오버 시 데이터 손실이 없지만, 반대로 스탠바이는 항상 '대기 중'이지 '서비스 중'이 아니다. graph LR App["애플리케이션"] -->|"단일 엔드포인트 (DNS)"| Primary["프라이머리 인스턴스 AZ-A"] Primary -->|"동기 ...

API Gateway CORS 오류 완전 해결 가이드: 콘솔 설정부터 Lambda 응답 헤더까지

프론트엔드에서 API Gateway를 호출했을 때 CORS 오류 가 발생하면, 대부분의 엔지니어는 콘솔에서 'Enable CORS' 버튼 하나만 누르면 해결된다고 생각한다. 실제로는 그 버튼이 절반의 작업만 처리하고, 나머지 절반은 Lambda 함수 응답에서 직접 헤더를 반환해야 한다 — 이 사실을 모르면 콘솔 설정 후에도 동일한 오류가 반복된다. TL;DR — API Gateway CORS 오류 핵심 요약 구분 내용 문제 원인 브라우저 preflight OPTIONS 요청에 CORS 헤더 누락, 또는 실제 응답에 헤더 없음 콘솔 설정 역할 OPTIONS 메서드 Mock 응답에 CORS 헤더 추가 + 배포 필요 Lambda 역할 GET/POST 등 실제 메서드 응답에 직접 CORS 헤더 포함해야 함 필수 헤더 Access-Control-Allow-Origin, Access-Control-Allow-Headers, Access-Control-Allow-Methods 자주 놓치는 것 콘솔 설정 후 Stage 재배포 누락 CORS가 API Gateway에서 동작하는 방식 브라우저는 크로스 오리진 요청을 보내기 전에 먼저 preflight 요청 을 OPTIONS 메서드로 전송한다. 서버가 이 OPTIONS 요청에 올바른 CORS 헤더로 응답해야 브라우저가 실제 요청을 허용한다. API Gateway에서 이 흐름을 이해하지 못하면 설정이 반쪽짜리가 된다. API Gateway REST API에서 CORS는 두 개의 독립된 레이어에서 처리된다. 첫 번째는 OPTIONS preflight — API Gateway가 Lambda를 호출하지 않고 Mock 통합으로 직접 응답한다. 두 번째는 실제 메서드(GET, POST 등) 응답 — Lambda 함수가 응답 본문과 함께 CORS 헤더를 직접 ...