본문으로 건너뛰기

운영 배포를 EC2 한 대 + SSM CD로 합니다

결정일상태원본
2026-07-26activeheymoa-ai/docs/decisions/2026-07-26-prod-deployment.md

heymoa-ai를 heymoa-app과 분리된 EC2에 올리고, dev push에서 GitHub Actions가 OIDC로 역할을 맡아 SSM으로 배포합니다. 설계 전문은 APP-192 spec에, 서빙 방식 근거는 serving에 있습니다. 여기에는 무엇을 정했고 언제 뒤집는가만 적습니다.

리소스 ID는 Linear 「AWS (아키텍처 / 비용 / 성능 / 권한)」 문서가 갖습니다. 두 곳에 적지 않습니다.

정한 것 넷

EC2를 분리했습니다. heymoa-app은 t4g.small 1 GiB인데 Spring 컨테이너가 이미 그 위에서 빌드까지 합니다. 여기에 Python 파이썬을 얹으면 빌드 피크에서 둘 다 위험해집니다. 분리 비용은 월 $12.7이고, 그중 $3.65는 퍼블릭 IPv4 요금입니다. private subnet에 두면 NAT가 월 $35이라 더 비쌉니다 — 이 판단은 Linear 문서가 ALB·NAT를 걷어낸 것과 같은 기준입니다.

RDS를 공유합니다. 같은 인스턴스 안에 heymoa_ai 데이터베이스를 따로 팠습니다. 인스턴스를 나누면 월 $18이 더 드는데 지금 데이터가 그만큼이 아닙니다.

DB 자격증명은 마스터를 씁니다. 전용 유저 heymoa_ai를 만드는 안을 먼저 잡았다가 접었습니다. 전용 유저는 회전이 안 붙어서 비밀번호를 사람이 관리해야 하는데, 그러면 회전을 쓰는 이유가 사라집니다. 대가로 ai가 postgres 데이터베이스까지 볼 수 있습니다.

시크릿을 컨테이너가 기동할 때 읽습니다. heymoa-server는 deploy.sh가 읽어 환경변수로 굳히는데, 그러면 7일마다 도는 회전 뒤 재연결 시점에 인증이 깨집니다. 기동할 때 읽으면 docker restart 하나로 회복됩니다.

안 한 것

ECR을 쓰지 않고 EC2에서 빌드합니다. 이미지 하나 때문에 레지스트리와 arm64 러너를 사는 값이 지금은 비쌉니다. IaC 도 쓰지 않았습니다 — 형상이 EC2 두 대와 RDS 하나뿐이라, 도구를 들이는 값이 콘솔에서 손으로 잡는 값보다 큽니다.

되돌리는 조건

신호그러면
EC2 빌드가 운영 컨테이너를 흔듦 (빌드 중 헬스체크 실패)ECR로 옮기고 EC2는 pull만 합니다
ai가 server 테이블을 실수로 건드림전용 유저를 만들고 회전은 Lambda로 직접 붙입니다
RDS가 CPU·커넥션에서 포화인스턴스를 나눕니다. pg_dump heymoa_ai 하나면 옮겨집니다
dev 인스턴스가 필요해짐APP_ENV=dev 분기가 이미 있습니다. compose와 시크릿만 추가합니다
인프라를 IaC 로 옮김실물을 import 하는 것부터 시작합니다. 지금 형상은 콘솔에만 있습니다

되돌릴 때 heymoa/ai/prod 시크릿과 OIDC provider는 그대로 둡니다. 둘 다 다른 결정에 얹혀 있지 않고, 지우면 다시 만드는 값이 더 큽니다.