핵심 한 줄
파이프라인을 처음 진짜로 돌리자 세 군데가 터졌다. AWS가 한글 보안그룹 설명을 거부하고, 존재하지 않는 SSM 문서명으로 배포가 전부 실패하고, macOS 기본 bash가 멀티라인 스크립트의 개행을 뭉갰다. 셋 다 코드 리뷰·
terraform validate로는 안 걸리고 실행해봐야만 드러나는 종류였다.
시리즈 — 부하가 드러낸 설계
1. 한글이 보안그룹을 막았다
terraform apply. VPC가 뜨고, 서브넷, IGW, NAT Gateway까지 순조롭게 만들어지더니 — 보안그룹에서 멈췄다.
Error: creating Security Group: InvalidParameterValue:
Value (VPC 내부 사설 IP 통신 전용...) for parameter GroupDescription is invalid.
Character sets beyond ASCII are not supported.
보안그룹 description에 한글을 썼다. AWS의 CreateSecurityGroup은 GroupDescription에 non-ASCII를 거부한다. terraform validate는 통과했다 — 이건 문법이 아니라 런타임 AWS API 제약이라 apply 때만 드러난다.
주석은 한글이어도 된다. AWS API로 넘어가는 필드만 ASCII면 된다. description을 영문으로 바꿨다. NAT까지 이미 만들어진 채로 멈췄으니, 고치고 재apply하면 이어서 인스턴스를 만든다.
2. 존재하지 않는 문서로 명령을 쐈다
인스턴스 9대가 떴다. ssm-deploy.sh로 배포. 그런데 전 role이 실패했다.
An error occurred (InvalidDocument) when calling the SendCommand operation:
Document with name AWS-RunShellCommand does not exist.
SSM으로 셸 명령을 보내는 관리형 문서 이름을 AWS-RunShellCommand로 알고 있었다. 그런 문서는 없다. 진짜 이름은 AWS-RunShellScript다. 그런데 스크립트가 에러를 삼키고 있어서(|| true) “배포 완료”처럼 보였다 — 실제론 아무것도 안 올라갔는데.
aws ssm list-documents --filters Key=Owner,Values=Amazon Key=DocumentType,Values=Command
# → AWS-RunShellScript, AWS-RunPowerShellScript, ...이름 한 단어. 그런데 이걸 잡기까지, “왜 컨테이너가 하나도 안 뜨지?”를 한참 헤맸다. 에러를 삼키면 실패가 성공처럼 보인다 — 그게 더 비쌌다.
3. 개행이 뭉개졌다
문서명을 고쳤더니 이번엔 원격 스크립트가 첫 줄에서 죽었다.
line 1: set: IMAGE_NS=camelia9999: invalid option name
멀티라인 셸 스크립트를 aws ssm send-command --parameters commands=... 쇼트핸드로 넘겼는데, 개행이 뭉개져 set -e와 export IMAGE_NS=...가 한 줄로 붙어버렸다. set이 IMAGE_NS=...를 옵션으로 해석하려다 터진 것.
고침은 쇼트핸드 대신 완전한 JSON을 넘기는 것:
params=$(jq -n --arg s "$script" '{commands: [$s]}')
aws ssm send-command --parameters "$params" ...여기에 하나 더 얹혀 있었다. 이 스크립트는 role→compose 매핑에 bash 연관배열(declare -A) 을 썼는데, macOS 기본 bash는 3.2라 연관배열을 지원하지 않는다.
line 27: infra: unbound variable
case 문으로 바꿨다. 두 문제 다 “다른 환경(원격 리눅스 / 로컬 macOS)에서 실행”해야만 나오는 것들이다.
4. validate가 못 잡는 것들
세 버그의 공통점 —
실행만이 드러내는 결함
한글 SG description은
terraform validate가 통과시킨다(런타임 API 제약). 틀린 SSM 문서명은 컴파일러가 없다(문자열). bash 개행/버전은 그 셸에서 실제로 돌려야 안다. 정적 검사가 초록이어도 파이프라인은 터질 수 있다.
이게 이 시리즈의 축소판이다. 서문에서 말한 “코드 리뷰가 못 보는 것을 부하가 본다”가, 여기선 애플리케이션이 아니라 배포 파이프라인 자체에 적용됐다. 실행해봐야 안다.
세 번 터지고 나서야 9대에 스택이 다 올라갔다. 이제 진짜 부하를 걸 차례다. 그런데 첫 baseline에서 나온 190 rps라는 숫자가, 알고 보니 용량이 아니었다.