아키텍처 문서에서 가장 빠르게 변하는 데이터는 무료 티어(free-tier) 수치입니다. 따라서 아래 워크숍에서는 모든 '무료 토큰' 또는 '무료 서버' 항목을 사실이 아닌 날짜가 찍힌 관찰 기록으로 다룹니다. 이 과정을 마치면 세 가지 파일—클레임 원장(claims ledger), 엔드포인트가 실제로 보고하는 내용을 기록하는 프로브(probe), 그리고 클레임이 만료되면 실패하도록 설정된 CI 게이트(CI gate)—를 갖게 됩니다. 총 소요 시간은 70분이며, 이 결과물은 세션 종료 후에도 계속 작동합니다.
문제는 클레임 자체가 아니라 누락된 타임스탬프입니다
무료 티어는 조용히 바뀝니다. 할당량 페이지가 변경 로그 없이 재작성되거나, 유휴(idle) 중지 정책이 시간 단위에서 분 단위로 바뀌고, '무료' 티어가 각주에 카드 요구 사항을 추가하는 식입니다. 이러한 사건들 중 어느 것도 빌드를 깨뜨리지는 않으며, 바로 이 점 때문에 고객 앞에서 데모가 실패할 때까지 아무도 알아차리지 못합니다.
일반적인 해결책은 '더 열심히 조사하라'는 것인데, 이는 확장성이 없습니다. 확장 가능한 해결책은 스케줄링된 재검증(scheduled re-verification)입니다. 모든 클레임에 읽은 날짜, 읽은 URL, 그리고 최대 허용 연령을 포함시키는 것입니다. 이 연령이 초과되면 사용자가 알기 전에 파이프라인이 먼저 문제를 제기합니다.
실습 예제: 무료 모델 접근 및 무료 서버 옵션
MonkeyCode는 우리가 실습 예제로 사용하는 프로젝트입니다. 왜냐하면 이 서비스가 두 가지 형태의 클레임을 결합하고 있기 때문입니다. 하나는 모델을 호출하여 검증하는 무료 모델 접근이고, 다른 하나는 무언가를 배포하고 모니터링하여 검증하는 무료 서버 옵션입니다. 운영자(operator)에 따르면 현재 무료 티어에는 천만 단위의 토큰 할당량이 포함되어 있으며, 이 프로젝트는 오픈 소스로 배포됩니다. 이 두 가지 모두 클레임이므로, 아래 실습의 핵심 목표인 출처에서 다시 읽어야 하는 것입니다.
공개 정보: 본 문서는 MonkeyCode의 제품 아웃리치(product outreach)의 일환으로 작성되었습니다.
시작하기 전에 솔직하게 고지할 점이 두 가지 있습니다. 여기에 있는 스크립트는 일반적인 HTTP API를 기준으로 작성된 템플릿이며, 이 글을 준비하면서 MonkeyCode의 엔드포인트에 대해 실행해 본 것이 아니므로 출력 결과는 직접 생성하고 신뢰하셔야 합니다. 그리고 무료 티어 숫자는 날짜가 첨부되지 않은 상태로는 계약서, 슬라이드덱, 또는 고객 대상 약속에 포함되어서는 안 됩니다.
사전 준비 및 설정 (5분, 시계 시작 전)
- Python 3.11 이상 버전; 스크립트는 표준 라이브러리만 사용하므로 CI 이미지가 작게 유지됩니다.
- 환경 변수로 내보내진 API 키를 사용하며,
claims.json이나 git에는 절대 포함하지 않습니다.
- CI 러너가 있는 저장소와 루트에 위치한
claims.json 파일에 대한 쓰기 접근 권한이 필요합니다.
- 벤더의 공식 가격 책정 페이지나 문서 페이지에서 브라우저 탭을 하나 열어두고, 관련 블로그 게시물에서는 하지 않습니다.
일정
| 분 | 섹션 | 출력 결과 |
|---|
| 0-5 | 설정 확인 | python -V, 키 내보내기 |
| ... | | |
연습 1: 마케팅 문구를 검증 가능한 문구로 바꾸기 (8분)
테스트할 수 없는 주장은 신뢰할 수 없는 주장입니다. 각 문장을 스크립트가 통과(pass) 또는 실패(fail)를 반환할 수 있을 때까지 다시 작성한 다음, 해당 내용을 읽은 페이지를 첨부하세요.
- 약함: "관대한 무료 티어".
- 검증 가능: "무료 티어에는 토큰 할당량이 포함되어 있으며, 현재 수치는 가격 책정 페이지에 게시되어 있습니다".
- 약함: "무료 서버 포함".
- 검증 가능: "배포 대상이 비용 없이 존재하며, 문서에서 유휴 인스턴스가 중단되는지 여부와 그 후 얼마나 시간이 지나야 하는지를 명시하고 있습니다."
확인할 수 없는 것을 적어보세요. 그러한 항목들은 가치 있는 것들입니다. 왜냐하면 그것들이 우리가 가정하는 것이 아니라 실제로 알고 있는 경계를 표시하기 때문입니다.
연습 2: 원장(ledger) 인코딩하기 (12분)
claims.json은 의도적으로 지루한 JSON 형식입니다. YAML 파싱을 사용하게 되면, 최소 CI 이미지에서 실행되어야 하는 모든 곳에 종속성을 추가하게 되기 때문입니다.
[
{
"id": "free-token-allowance",
...
두 URL을 실제로 읽은 페이지로 대체하고, 의도적으로 표현을 모호하게 유지하세요. 원장(ledger)에는 클레임의 형태가 기록되고, 특정 숫자는 다시 읽는 소스에 존재합니다.
실습 3: 엔드포인트가 보고하는 내용을 탐색 (20분)
이 프로브는 하나의 질문에 답합니다. 즉, 서비스가 현재 자신에 대해 무엇을 말하는지입니다. 이 프로브는 상태(status), 지연 시간(latency), 그리고 사용량 필드(usage fields)를 기록하며, 절대로 당신을 대신하여 추측하지 않습니다.
#!/usr/bin/env python3
"""엔드포인트가 자신에 대해 보고하는 내용을 기록합니다. 추가 전용 JSONL 형식입니다."""
import json, os, pathlib, time, urllib.request, urllib.error
...
이 코드를 두 번 실행하고 행들을 비교하세요. 유휴 기간(idle window) 이후의 첫 번째 호출은 콜드 패스(cold path)를 측정하고, 두 번째 호출은 웜 패스(warm path)를 측정합니다. 이 둘을 단일 지연 시간 숫자로 병합하는 것이 팀들이 크기 차이가 나는 잘못된 대시보드를 갖게 되는 방식입니다.
만약 응답에 사용량 필드가 나타나지 않는다면, 그것은 실패가 아니라 발견 사항(finding)입니다. {"usage_fields": {}}를 기록하고, 허용량(allowance)을 콘솔에서만 확인할 수 있다는 점을 메모하세요. 이는 아직 자동 모니터링이 불가능하다는 의미입니다.
실습 4: 오래된 클레임으로 빌드 실패시키기 (12분)
#!/usr/bin/env python3
"""기록된 클레임 중 하나라도 max_age_days보다 오래되었다면 0이 아닌 값으로 종료합니다."""
import json, pathlib, sys
...
이를 CI에 단일 단계로 연결하고, 같은 명령을 매주 예약 실행하여 조용한 릴리스 브랜치에서도 경고가 발생하도록 만드세요.
- name: Free-tier claims are still fresh
run: python scripts/check_claims.py claims.json
이 게이트(gate)가 작동하는지 증명하려면, verified_at 중 하나를 60일 전 날짜로 설정하고 빌드가 빨간색으로 변하는 것을 지켜보세요. 그런 다음 실제 페이지를 다시 읽고 오늘 날짜로 되돌리세요.
실습 5: 공급업체별이 아닌 워크로드별로 결정하기 (10분)
| 워크로드 | 무료 등급으로 허용되는가? | 기록해야 하는 이유 |
|---|
| 가짜 데이터를 사용한 프로토타입, 개발자 2명 | 예 | 매월 재검증만 하면 충분함 |
| ... | | |
| 사용하는 워크로드로 표를 채우고, 판결(verdict)과 같은 행에 결정적인 문장을 작성하세요. 이유 없이 "예"라고 적힌 표는 3개월 후 검토 과정에서 아무도 방어하지 못할 표입니다. | | |
실습해 볼 가치가 있는 실패 모드
- 빈 본문이 포함된 200 OK. 상태 코드만으로는 증거가 될 수 없습니다. 페이로드(payload)를 구문 분석하고 바이트 수를 기록하세요.
- 시간대 편차(Timezone drift).
verified_at을 단순 날짜로 저장하고, 절대로 네이티브 datetime을 사용하지 말고 날짜끼리 비교하세요.
- 출처로서의 블로그 게시물. 할당량(quota)을 인용한 튜토리얼은 형식이 좋은 루머일 뿐입니다. 문서 페이지 자체를 인용하세요.
- 조용한 정책 변경(Silent policy change). 게이트는 사람이 페이지를 다시 읽을 때만 이를 포착합니다. 오래된 행(stale row)은 버그가 아니라 작업(task)입니다.
- 지나치게 적극적인 탐색(Probing too eagerly). 운동(exercise)당 한 번의 호출이면 충분합니다. 신선도 게이트(freshness gate)는 부하 테스트(load test)가 아닙니다.
이 접근 방식을 사용해서는 안 되는 경우
계약상의 가동 시간 수치, 데이터 처리 계약서, 또는 감사자(auditor)를 위한 증거가 필요한 경우, 어떤 종류의 무료 등급도 잘못된 기반(substrate)이며 그 어떤 원장(ledger)도 이를 고칠 수 없습니다. 팀이 매월 15분간 재검토하는 것을 약속할 수 없다면, 이 게이트는 모두가 무시하게 되는 조용한 소음이 될 것입니다. 그리고 만약 통합(integration)이 다음 주에 삭제할 임시 스크립트라면, 원장은 건너뛰고 대신 댓글에 날짜를 작성하세요.
다른 모든 사람들에게도 패턴은 동일합니다. 유료 등급, 속도 제한(rate limits), 지역별 가용성, 그리고 지원 중단 공지(deprecation notices) 모두 무료 등급과 같은 일정으로 감가됩니다.
지켜야 할 것
세 개의 파일, 하나의 표, 그리고 고객보다 먼저 빨간색으로 변하는 빌드입니다. 이 운동들은 의도적으로 작게 만들어졌기 때문에, 여기에서 시작한 무료 등급 수치를 포함하여 다음 달에 문서가 무엇이라고 말하든 다시 실행할 수 있습니다.
만약 이 세션을 팀 단위로 진행한다면, 나중에 비교할 아티팩트는 여러분의 claims.json 파일입니다. 아무도 거짓으로 표현할 수 없었기 때문에 삭제한 행들이 보통 토론에서 가장 흥미로운 부분입니다.