사용자 앱을 Workload 계정의 인프라 Space에 배포하는 워크플로입니다 (ADR-009).
플랫폼 백엔드가 workflow_dispatch로 실행하고, 단계마다 백엔드 콜백으로 진행 상황을 보냅니다.
| job | 하는 일 | 비밀값 |
|---|---|---|
| prepare | 입력값 검사, prepare(실행 ID)·build 콜백 |
서명 키 |
| build | 사용자 레포를 커밋 SHA로 받아 Docker 이미지 빌드 | 없음 (사용자 코드가 실행되는 곳) |
| deploy | 이미지를 Workload ECR에 올리고 템플릿으로 plan·apply, 자원별 콜백, 사이트 확인(verify) |
서명 키, Workload 키 |
| report | 최종 결과 콜백 (실패·취소 포함) | 서명 키 |
deploy job 순서: State 버킷·ECR 준비(처음 한 번 자동 생성) → 이미지 업로드(같은 앱·커밋이면 재사용) → 구성 값 준비(scripts/plan.py) → terraform plan → 자원 목록 콜백 → terraform apply → 서비스가 이번 revision으로 도는지 확인 → 앱 주소가 HTTP 200을 줄 때까지 확인.
| Workload 자원 | 이름 |
|---|---|
| State 버킷 | sbh-workload-demo-s3-tfstate-921810471078, 앱별 키 apps/<application_id>/terraform.tfstate |
| 이미지 저장소 | sbh-workload-demo-ecr-apps, 태그 <application_id>-<commit_sha> (덮어쓰기 금지) |
deployment_id, application_id(24자 이하), repo(owner/name, public), commit_sha(40자), infra_id, compute(지금은 ecs-fargate만), plan_id(백엔드 구성안), test_plan(시험용), callback_url(비우면 콜백 생략).
plan_id가 있으면 백엔드GET /api/plans/{plan_id}(plan_id 문자열을 서명)에서 템플릿 이름·값·인프라 값을 받습니다.- 백엔드 연결 전 시험할 때는
plan_id를 비우고test_plan에 백엔드 응답과 같은 모양을 넣습니다. 예:{"values": {"container_port": 8000}, "infra": {"vpc_id": "...", "public_subnet_ids": ["...", "..."]}}. 템플릿을 적지 않으면ecs-fargate/basic입니다.
Actions → Destroy → application_id를 두 번 입력. 그 앱의 Terraform State에 있는 자원을 모두 지웁니다(ALB 비용이 계속 나가므로 시험 후 실행). Deploy와 같은 그룹이라 배포 중에는 기다렸다가 실행됩니다.
POST https://sbh.howon.me/api/deployments/{deployment_id}/callback, 헤더 X-Hub-Signature-256: sha256=<본문 HMAC-SHA256>.
본문은 status, step, message와 run_id(첫 콜백), url(성공), reason(실패). 형식은 백엔드 API 명세 9-3, 9-4절을 따릅니다.
deploy 단계에서 status=deploying, step=deploy와 함께 resources 배열을 보냅니다.
- apply 전에 한 번:
terraform show -json의 모든 자원 (state는pending, 바뀌지 않는 자원은done) - apply 중에 자원마다: 시작하면
in_progress, 끝나면done, 실패하면failed+reason
{"status": "deploying", "step": "deploy", "message": "aws_lb.app 완료",
"resources": [{"address": "aws_lb.app", "type": "aws_lb", "action": "create", "state": "done"}]}action은 create, update, replace, delete, no-op 중 하나입니다. 화면은 type으로 서버·저장소·연결 같은 분류를 묶으면 됩니다.
| 이름 | 용도 | 상태 |
|---|---|---|
DEPLOY_CALLBACK_SECRET |
콜백 서명 키. 플랫폼 Parameter Store /sbh/platform/demo/backend/DEPLOY_CALLBACK_SECRET와 같은 값 |
등록됨 (2026-10-02) |
WORKLOAD_AWS_ACCESS_KEY_ID, WORKLOAD_AWS_SECRET_ACCESS_KEY |
Workload 계정 키(정호원님 발급). deploy·destroy에서만 사용, 계정 921810471078이 아니면 멈춤 |
등록됨 (2026-10-02) |
SANDBOX_AWS_ACCESS_KEY_ID, SANDBOX_AWS_SECRET_ACCESS_KEY |
Sandbox 계정 키(정호원님 발급). 구성안 infra.aws_account_id가 635738234799일 때만 사용, 그 계정이 아니면 멈춤 |
미등록 |
구성안 infra.aws_account_id로 배포할 계정을 고릅니다. 없으면 Workload입니다. 목록에 없는 계정은 거절합니다(scripts/plan.py의 ACCOUNTS).
| 계정 | 번호 | State 버킷 | 이미지 저장소 |
|---|---|---|---|
| Workload | 921810471078 |
sbh-workload-demo-s3-tfstate-921810471078 |
sbh-workload-demo-ecr-apps |
| Sandbox | 635738234799 |
sbh-sandbox-s3-tfstate-635738234799 |
sbh-sandbox-ecr-apps |
버킷과 저장소는 그 계정에 처음 배포할 때 자동으로 만듭니다. 내리기(destroy)는 앱 ID만 받으므로 Workload 버킷에서 앱 기록을 먼저 찾고, 없으면 Sandbox에서 찾습니다.
- 1단계: 입력값, build job, 콜백
- 2단계:
templates/ecs-fargate/basic/Terraform 양식 - 자원별 콜백 (deploy job에 연결)
- 3단계: Workload 연결 (코드 작성 완료, Workload 키 등록 후 첫 실행)
- 4단계: 백엔드 연결
- 5단계: 검증
스크립트 확인: python scripts/callback.py --self-test, python scripts/plan.py --self-test