AWS Cloud School 13기 109일차

Forever 김·2026년 6월 8일

AWS Cloud School

목록 보기
98/116

2026-06-08

Today

  • Backend 빌드 504 트러블슈팅 → 2단 방어 적용 — Gradle CDN(services.gradle.org) 일시 504로 push-image 실패. (A) docker/build-push-action + gha 레이어 캐시(type=gha,mode=max)로 배포본·의존성 재다운로드 제거, (B) Dockerfile gradlew 지수 백오프 재시도(최대 5회, 기본은 1회만 시도). PR 머지 → push-image 통과(2m26s) 검증
  • deploy-prod 헬스체크 실패 근본원인 규명 + 해결prod-app:3이 ELB 헬스체크 실패로 exit 143, 19분 행. 원인 = healthCheckGracePeriodSeconds=0 + 앱 부팅 85s → unhealthy(90s)가 healthy(115s)보다 먼저 도달해 부팅 중 종료. 앱 버그 아님(보안·경로 코드 확인). 테라폼팀이 grace 0→180 수정(commit c0e34ae) → prod-app:4 COMPLETED → deploy-prod 첫 end-to-end 성공(run 27124735282, 8m16s) = Backend Phase 2 자동배포 최초 성공
  • 레포 최신화 + RDS 재생성 결정 — 전 레포 pull, Frontend 최신화. RDS는 storage 50→20 축소·16.14→18.3 메이저 업글이라 삭제 후 재생성(신규 리소스)으로 진행 결정
  • PR 템플릿 작성·머지 + terraform apply 확인 — Backend A/B 개선 커밋·푸시, PR 템플릿대로 작성 후 머지
  • Route53 레코드 현황 점검 — zone Z00909163J12BPCLO45XR, 레코드 8개(A alias·NS·SOA·ACM 검증 CNAME) 확인. www.farmily.info 등록 검증. PROJECT_CONTEXT에 레코드 표 + ⚠️ACM 검증 CNAME 삭제 금지 경고 추가
  • 도메인 end-to-end 검증https://www.farmily.info/@youngwoo-strawberry 3단 체인(CloudFront SPA fallback → public API → 데이터) 확인. 실제 공개 API 경로 = /api/v1/public/farms/{handle} (코드 확인 후 정정)

Notes

남은 CI/CD 작업 (정리)

우선작업상태
🔴 시한Node20 액션 deprecation 대응(6/16 강제 Node24) + SonarCloud QG SHA핀(checkout·setup-java) 동시 처리착수 필요
🟡 의존Backend deploy-dev job 추가dev 인프라 apply 대기
🟡 의존Infra terraform.yml(plan/apply 자동화)미작성
🟢 보안Secrets Manager 마이그레이션(ECS env 평문 → KMS)앱팀 협업
⚪ 외부Mobile google-services.json EAS 주입앱팀 파일 대기

Learned

  • exit 143 = 128 + 15 = SIGTERM — 컨테이너가 스스로 죽은 게 아니라 외부(ECS/ELB)가 종료시킨 것. 크래시(코어덤프)와 구분해서 "왜 죽였나"(헬스체크 실패)를 봐야 함. 앱 로그만 보면 정상인데 죽는 이유가 여기 있었음
  • healthCheckGracePeriodSeconds는 부팅시간 > unhealthy 도달시간일 때 필수 — grace=0이면 등록 직후부터 헬스체크 카운트 시작. interval 30s × unhealthy threshold 3 = 90s에 첫 실패 확정인데, 앱 부팅이 85s + healthy 도달 115s라 부팅 끝나기 전에 unhealthy로 죽는 레이스. grace는 "부팅 유예 시간"이라 부팅시간보다 넉넉히(180s) 잡아야 함
  • deregistration_delay(기본 300s)가 실패 태스크 수명을 설명 — 헬스체크 실패로 빠지는 태스크도 커넥션 드레이닝 5분을 기다림 → 실패 태스크가 5분간 살아있는 것처럼 보이는 이유
  • gha 캐시는 branch-scopedtype=gha는 GitHub Actions Cache(무료 10GB, LRU·7일 evict) 사용. 브랜치별로 캐시가 분리돼 feat/main이 서로 캐시를 안 탐 → main 첫 빌드는 캐시 미스 감안
  • Route53 ACM 검증 CNAME은 절대 삭제 금지 — 인증서 갱신(renewal)에 계속 쓰임. 삭제하면 자동 갱신 실패 → 인증서 만료 위험

Prompt(회고)

  • deploy-prod 19분 행을 보고 처음엔 앱 버그를 의심했는데, exit 143(SIGTERM)·헬스체크 타임라인·부팅 로그를 교차검증하니 타이밍 레이스였다. 증상(컨테이너 죽음)이 아니라 종료 신호의 출처를 먼저 봤어야 빨랐다. 앞으로 ECS 배포 실패는 exit code → 헬스체크 이벤트 → 부팅 타임라인 순으로 본다.
  • 공개 API 경로를 추측으로 /profiles/...라 했다가 401, 코드 확인 후 /public/farms/...로 정정. 앱 내부 로직은 임의 단정 말고 코드 확인이 맞았다. 인프라 관점에서도 검증 경로를 코드에 맞춰야 도메인 end-to-end가 신뢰성 있다.
profile
나를 한줄로

0개의 댓글