운영 배포를 EC2 한 대 + SSM CD로 합니다
| 결정일 | 상태 | 원본 |
|---|---|---|
| 2026-07-26 | active | heymoa-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는 그대로 둡니다. 둘 다 다른 결정에
얹혀 있지 않고, 지우면 다시 만드는 값이 더 큽니다.