목차
수동 배포, 이제 그만 — GitHub Actions로 S3/CloudFront 배포 자동화하기
혹시 이런 경험 있으신가요? 프론트엔드 코드 수정하고, 빌드하고, AWS 콘솔 열고, S3에 파일 올리고, CloudFront 캐시 무효화(Invalidation)하고... 이 반복 작업을 매번 손으로 하다가 어느 순간 '내가 지금 뭘 하고 있나' 싶은 그 느낌. 저도 예전에 딱 그랬거든요.
13년 동안 인프라 일 하면서 느낀 건데, 반복 작업은 반드시 자동화해야 합니다. 사람이 하면 언젠가는 실수가 납니다. 저도 한 번은 CloudFront 캐시 무효화 깜빡해서 사용자들이 한참 동안 옛날 버전 보고 있었던 적 있어요. 그날 이후로 배포 자동화는 선택이 아니라 필수라고 생각하게 됐습니다.
오늘은 GitHub Actions를 활용해서 AWS S3와 CloudFront에 정적 웹사이트를 자동으로 배포하는 CI/CD 파이프라인을 처음부터 끝까지 만들어보겠습니다. React나 Vue, Next.js 정적 빌드 등 어떤 프레임워크든 적용할 수 있는 방법이에요.
▲ GitHub Actions → S3 업로드 → CloudFront 캐시 무효화로 이어지는 전체 배포 파이프라인 구조
GitHub Actions AWS 배포의 핵심 개념 — CI/CD, S3, CloudFront
일단 개념부터 간단히 정리하고 갈게요. 저도 처음엔 이 용어들이 뒤섞여서 헷갈렸거든요.
GitHub Actions란?
GitHub Actions는 GitHub에서 제공하는 CI/CD(지속적 통합/지속적 배포) 자동화 플랫폼입니다. 쉽게 말해서, 코드를 push하거나 PR을 올리는 등 특정 이벤트가 발생했을 때 미리 정의해둔 작업을 자동으로 실행해주는 도구예요. 빌드, 테스트, 배포까지 전부 코드로 관리할 수 있고, 무료 플랜도 꽤 넉넉해서 소규모 프로젝트엔 비용 걱정 없이 쓸 수 있습니다.
S3 + CloudFront 조합이 왜 좋은가?
AWS S3(Simple Storage Service)는 파일 저장소인데, 정적 웹사이트 호스팅 기능도 있어요. CloudFront는 AWS의 CDN(콘텐츠 전송 네트워크)으로, 전 세계 엣지 서버에 콘텐츠를 캐싱해서 사용자에게 빠르게 전달해줍니다. 이 둘을 조합하면 서버 없이도 빠르고 안정적인 웹사이트를 운영할 수 있어요. 저도 여러 프로젝트에서 이 구조를 썼는데, 정말 편하더라고요.
| 항목 | S3 단독 호스팅 | S3 + CloudFront |
|---|---|---|
| HTTPS 지원 | ❌ (별도 설정 복잡) | ✅ ACM 인증서 연동 |
| 글로벌 속도 | 단일 리전 기준 | CDN 엣지 캐싱으로 빠름 |
| 커스텀 도메인 | 제한적 | 자유롭게 가능 |
| 비용 | 저렴 | 약간 추가 (트래픽 기준) |
실제 프로덕션 환경이라면 S3 + CloudFront 조합을 강력 추천합니다. 오늘 가이드도 이 조합 기준으로 진행할게요.
사전 준비 — AWS IAM 권한 설정부터
GitHub Actions에서 AWS 리소스에 접근하려면 적절한 권한을 가진 IAM(Identity and Access Management) 사용자가 필요합니다. 여기서 많은 분들이 귀찮다고 AdministratorAccess 권한을 통째로 주는 경우가 있는데, 보안상 절대 권장하지 않아요. 최소 권한 원칙(Principle of Least Privilege)을 지켜야 합니다.
IAM 정책 만들기
AWS IAM 콘솔에서 아래 내용으로 커스텀 정책을 만들어주세요. S3 버킷 이름과 CloudFront Distribution ID는 본인 것으로 바꾸세요.
{\n "Version": "2012-10-17",\n "Statement": [\n {\n "Effect": "Allow",\n "Action": [\n "s3:PutObject",\n "s3:PutObjectAcl",\n "s3:DeleteObject"\n ],\n "Resource": "arn:aws:s3:::your-bucket-name/*"\n },\n {\n "Effect": "Allow",\n "Action": [\n "cloudfront:CreateInvalidation"\n ],\n "Resource": "arn:aws:cloudfront::YOUR-AWS-ACCOUNT-ID:distribution/YOUR-DISTRIBUTION-ID"\n }\n ]\n}
'IT > Cloud' 카테고리의 다른 글
| [Cloud] Terraform State 관리 완벽 가이드: S3, DynamoDB 활용 모범 사례 (0) | 2026.05.14 |
|---|---|
| [Cloud] GitHub Actions 모노레포: 매트릭스 빌드로 CI/CD 최적화하기 (0) | 2026.05.12 |
| [Cloud] Terraform AWS EKS 모듈 활용: 프로덕션 클러스터 배포 및 관리 가이드 (1) | 2026.05.12 |
| [클라우드 비용 관리] Terraform Cloud 비용 최적화: RUM 모델과 절감 전략 (0) | 2026.05.10 |
| [Cloud] Cloudflare Workers 실전 가이드: 서버리스 엣지 컴퓨팅 활용 전략 (1) | 2026.05.09 |
| [Cloud] Podman vs Docker: Rootless 컨테이너 보안 및 활용 가이드 (1) | 2026.05.09 |