본문으로 건너뛰기

AWS 아키텍처

⚠︎ 지난 판 — 2026-07-31. 현재 판은 여기다. 이 문서는 그때의 기록이고 고치지 않는다.

이 판은 사이트 버저닝을 보이려고 채운 자리다. 그날 실제로 쓰인 문서가 아니고, 앞뒤 판에서 끌어와 재구성했다. 지우거나 진짜 기록으로 갈아끼워도 된다.

갱신일 2026-07-31 · 기준: heymoa-infra Terraform + EC2 실측 Terraform이 만드는 것과 사람이 손으로 하는 것을 갈라 적는다.

확인한 사실

계정 110080810555, 리전 ap-northeast-2. terraform/environments/prod가 소유하는 범위다.

리소스
VPC · subnet10.30.0.0/16, public 1 + private data 2(AZ 2개). NAT Gateway 없음
EC2t4g.small ARM64 1대, EIP 고정, lifecycle.ignore_changes = [ami, user_data]
인바운드80·443만. SSH 22도 8080도 열지 않는다 — 접속은 SSM
user_dataSSM Agent 설치·기동뿐. Docker·Git·Nginx·Certbot은 접속 후 사람이 설치
RDSheymoa-prod-postgres, db.t4g.small, Single-AZ, 백업 7일, publicly_accessible=false
RDS 접근EC2 보안그룹에서 오는 5432만. IP CIDR 허용 없음
IAMEC2 Role에 AmazonSSMManagedInstanceCore + 그 Secret 하나의 GetSecretValue
stateS3 heymoa-prod-terraform-state-110080810555, use_lockfile = true

쓰지 않는 것도 코드가 말한다 — ALB·ACM·NAT Gateway·SSH key가 없고, module/tfvars 분리도 하지 않았다.

2026-07-26 판에서 미확인이던 것 중 풀린 것

무엇이 판에서 확인한 것
heymoa-ai가 어디에 뜨나같은 EC2에 compose로 함께 뜬다. 별도 인스턴스가 아니다
heymoa_ai databaseRDS가 만드는 것은 heymoa 하나. heymoa_ai는 접속해서 손으로 만들고 CREATE EXTENSION vector도 거기서 돈다
heymoa-web 호스팅Vercel. 저장소에 vercel.json이 없고 프로젝트 설정에만 있다

배포와 롤백

dev push에서 GitHub Actions가 OIDC로 역할을 맡아 SSM으로 배포한다 (ADR 0004).

server에는 롤백 경로가 없다. deploy.sh에 이전 이미지 캡처가 없고 ddl-auto: validate라, 파괴적 마이그레이션 뒤에 옛 JAR을 올리면 컨테이너가 아예 안 뜬다. 앞으로만 고칠 수 있다.

ai는 다르다. 마이그레이션을 컨테이너 교체보다 먼저 돌리고 헬스체크가 실패하면 앱만 되돌린다.

설계 전제

  • 한 대를 손으로 굴린다. EC2 안의 Git·Docker·Nginx·Certbot은 Terraform 밖이고, ignore_changes가 AMI 갱신으로 인스턴스가 교체되는 것을 막는다.
  • DB 비밀번호를 코드가 갖지 않는다. RDS가 Secret을 만들고 회전하며, EC2는 IAM Role로 읽는다.
  • 공개 진입은 Cloudflare A 레코드 → EIP → EC2의 Nginx 하나뿐이다. 앱 컨테이너는 127.0.0.1에만 바인딩한다.
  • MVP 비용 상한을 낮게 잡았다. 월 약 $62.

미확인

무엇지금 아는 것
RDS 삭제 보호deletion_protection = false, skip_final_snapshot = true. 실사용자 데이터가 생기면 둘 다 뒤집기로만 적혀 있다
관측 스택infra 레포에 Prometheus·Loki·Grafana compose가 있으나 이전 서버 템플릿이다. 지금 붙어 있는지 확인 못 했다
Langfuse 운영 키넣으면 전사 원문이 외부로 나간다. .env.prod를 봐야 한다