내 앱은 '바이럴'되지 않았지만, 내 AWS 청구서는 바이럴되었습니다.
요약
AWS 비용이 예상보다 높게 청구된 원인을 Amazon Q와 Claude를 활용해 추적한 디버깅 사례입니다. 분석 결과, 실제 사용 모델과 비용 추적 도구의 데이터가 일치하지 않는 문제를 발견하고 해결 과정을 다룹니다.
핵심 포인트
- AWS 비용 추적 도구의 데이터가 실제 모델 사용량과 다를 수 있음
- Amazon Q와 같은 AI 도구의 정보를 맹신하지 말고 검증 필요
- IAM 정책을 통해 의도치 않은 고비용 모델 호출을 방지할 수 있음
- 도구가 검색한 정보는 신뢰하되, 기억하는 정보는 반드시 검증해야 함
그리고 바이럴이라는 건 0달러에서 31달러가 되었다는 뜻입니다.
Umami는 Clew Directive가 지난달에 14번의 방문을 기록했다고 알려주었습니다. AWS는 그 대가로 31달러를 내야 한다고 말했습니다. 이는 방문자당 2.21달러에 해당하며, 캘리포니아에서 가장 비싼 무료 학습 경로 (learning-path) 도구가 될 수준입니다.
스포일러를 하자면: 14명의 방문자, 31달러, 그리고 그중 단 한 명도 원인이 아니었습니다.
무언가 잘못되었습니다. Amazon Q, Claude, 그리고 몇 시간 동안 제 코드를 읽으며 이 문제를 어떻게 해결했는지 소개합니다. 앱은 무죄로 밝혀졌습니다.
Clew Directive란 무엇인가 (간략히)
개인화된 AI 학습 경로 (learning-path) PDF를 만들어주는 무료 스테이트리스 (stateless) 도구입니다. 목표와 학습 방식에 관한 4가지 질문으로 구성된 60초짜리 바이브 체크 (Vibe Check)를 수행하면, 검증된 무료 리소스들을 매핑하여 브리핑을 제공합니다. 계정 없음, 데이터베이스 없음, 페이월 (paywall) 없음, 귀하에 대해 저장되는 정보도 없습니다. Amazon Nova 위에서 실행되므로 운영 비용이 거의 들지 않으며, 그렇기에 31달러의 청구서는 말이 되지 않았습니다.
이 이름은 테세우스의 실타래 (clew)에서 따왔습니다. 미로에서 빠져나오는 길을 찾아주는 실타래 말입니다. 과장된 홍보보다는 더 명확한 방향을 제시합니다. clewdirective.com에서 확인하세요.
맞지 않는 숫자
12명의 방문자, 14번의 방문, 93%의 이탈률 (bounce rate), 평균 세션 시간 약 1분. Bing, Google, Yahoo, GitHub를 통한 유입. 미국, 인도, 네덜란드, 이집트, 에티오피아, 싱가포르에서의 방문자. 대부분은 인사를 하러 들른 크롤러 (crawlers)였습니다.
몇 명의 호기심 많은 인간과 봇 (bots)들의 행렬만으로는 한 달에 31달러가 나올 수 없습니다. 따라서 모든 방문이 엄청난 무언가를 수행했거나, 아니면 청구서가 방문과는 전혀 상관없는 것이었습니다.
대시보드는 정중하게 거짓말을 했습니다. Amazon Q 이야기
제 비용 추적기 (cost tracker)는 Clew Directive가 Claude Sonnet에서 실행되고 있다고 말했습니다. Sonnet은 비싼 모델입니다. 상황 종료, 맞죠?
저는 리포지토리 (repo)를 열었습니다. Clew Directive는 Sonnet을 실행하지 않습니다. Navigator 에이전트는 Amazon Nova 2 Lite를 실행합니다. Scout와 Curator는 Nova Micro를 실행합니다. IAM 정책은 Nova ARN에만 범위가 지정되어 있으므로, 이 함수들에서 Sonnet 호출이 발생하면 AccessDenied가 반환됩니다. 앱 구조상 물리적으로 Sonnet 비용을 청구할 수 없습니다.
계산 결과는 일치했습니다. Nova를 사용하여 전체 학습 경로(learning-path)를 생성하는 비용은 약 0.2센트입니다. 에이전트들이 각각 몇 번의 호출을 수행하며 확산된다고 하더라도, 14번의 방문은 점심값 정도의 금액으로 수렴합니다. 이 중 그 어떤 것도 31달러에 도달하게 만들 수 없습니다.
제가 하나 짚고 넘어가고 싶은 세부 사항이 있는데, 이는 전체 추적 과정의 분위기를 결정지었기 때문입니다. 모델을 잘못 분류했던 것과 동일한 어시스턴트인 Q는 Haiku의 가격을 실제 요율의 4분의 1 수준으로 인용하기도 했습니다. 그래서 제가 계속해서 되새긴 규칙은 이것입니다: 도구가 검색(retrieve)한 것은 신뢰하되, 도구가 기억(remember)하는 것은 검증하라. 이 둘은 서로 다른 것입니다.
더 나은 질문 던지기
질문은
다른 리포지토리(repo)가 불이 붙었습니다. vigil-crest입니다. 5월 23일에 생성되었고, 5월 24일에 4개의 커밋이 있었습니다. 그리고 저는 그것이 정확히 무엇인지 알고 있습니다. 왜냐하면 제가 그것에 관한 전체 기사를 작성하여 당연히 5월 24일에 게시했기 때문입니다.
Vigil Crest는 제가 텔레그램(Telegram)에서 대화하는 챌린지 분류(challenge-triage) 에이전트입니다. 이 에이전트는 실시간 DEV 챌린지 피드를 탐색하며 어떤 해커톤(hackathon)에 시간을 투자할 가치가 있는지 저에게 알려줍니다. 제가 직접 작성한 글에 따르면, 이 에이전트의 스택(stack)은 다음과 같습니다: Claude Sonnet 4.6을 실행하는 AWS Bedrock, 자격 증명(credentials)이 인스턴스 내에 남지 않도록 EC2 인스턴스 역할(role)을 통해 접근하며, 항상 켜져 있는 t3.micro에서 호스팅됩니다. CloudTrail이 저에게 제공한 정보와 대조해 보십시오: EC2 인스턴스에서 스트리밍 API(streaming API)를 통해 claude-sonnet을 호출하는 assumed role, vigil-crest-bedrock-role이 확인되었습니다. (전체 ARN을 붙여넣지는 않겠습니다. 계정 ID는 공개하지 않습니다.)
동일한 프로젝트. 동일한 인스턴스. 동일한 모델.
제가 그것을 출시했던 그 주말입니다.
따라서 28달러는 제가 제출 전 이틀 동안 그것을 두드려 만들며 사용한 Sonnet 기반의 vigil-crest 비용이었습니다. 각 분류(triage) 실행 시에는 방대한 컨텍스트(context), 에이전트 페르소나(persona), 스택 파일(stack file), 렌더링된 챌린지 피드를 캐시(cache)하며, 이후 턴(turn)을 거치며 이를 다시 읽습니다. 이것이 정확히 캐시 집약적인(cache-heavy) 형태입니다. 그것이 에이전트 자체의 테스트 실행이었든 제가 구축한 도구였든, 둘 다 해당 역할(role)을 가진 하나의 EC2 인스턴스에서 실행되었습니다. 실제 작업이었고, 가격도 정확히 책정되었으나, 단지 잘못된 프로젝트 항목으로 분류되었을 뿐입니다.
질문(Q)은 셜록(Sherlock)이었고, Claude는 반박하는 왓슨(Watson)이었습니다.
이 문제가 어떻게 해결되었는지 조명하고 싶습니다. 왜냐하면 어떤 도구도 혼자서 해결하지 못했고, 저 또한 혼자서 해결하지 못했기 때문입니다.
콘솔 내의 Amazon Q는 Claude가 가지지 못한 한 가지를 가지고 있습니다. 바로 건물에 들어갈 수 있는 열쇠입니다. Q는 저의 라이브 계정을 읽습니다. CloudTrail, Cost Explorer, 실제 배포된 설정(config), 단일 호출 뒤에 있는 IAM 주체(principal)까지 말이죠. 그것이 바로 승수 효과(force multiplier)입니다. 저는 CloudTrail을 암기하고 있지도 않고, 밤 9시에 모든 IAM 정책을 일일이 읽을 생각도 없습니다. Q는 범죄 현장을 조사하고 돌아와서 역할 이름(role name), 인스턴스, 타임스탬프, 모델을 단 몇 분 만에 찾아냈습니다. 이것은 그 어떤 추론(reasoning)으로도 대체할 수 없는 실무적인 작업(legwork)입니다.
하지만 접근 권한이 있다고 해서 반드시 올바른 결론에 도달하는 것은 아닙니다. Q는 깨끗한 증거를 추출해냈지만, 그 증거에 잘못된 이야기를 세 번이나 덧붙였습니다. "제어되지 않는 프로세스였습니다.", "당신의 앱이었습니다.", "애플리케이션 로그를 확인하세요." 매번 완벽한 데이터를 가져왔지만, 용의자는 틀렸습니다. 증거가 문제였던 것이 아니라, 그 위에 덧씌워진 서사(narrative)가 문제였습니다.
Claude는 제 계정을 전혀 볼 수 없었습니다. 대신 Claude가 할 수 있었던 일은 쉬운 이야지를 거부하고, 실제 코드와 수학적 근거를 통해 증거를 다시 검토하도록 밀어붙이는 것이었습니다. 리포지토리(repo)는 Nova를 가리키고 있었고, IAM은 Sonnet에 대해 AccessDenied(액세스 거부)를 나타내고 있었습니다. 토큰 형태는 앱이 아닌 에이전트(agent)를 나타냈습니다. 또한 Claude는 자신의 커밋(commit)만 볼 수 있고 배포(deployment)는 볼 수 없다고 명시적으로 말하며, 이 중 일부는 추론(inference)일 뿐이니 직접 확인해야 한다고 알려주었습니다. 자신의 지식이 어디서 멈추는지 알려주는 도구는, 확신에 찬 것처럼 들리는 도구보다 훨씬 가치가 있습니다.
결국 Q는 실제 현장에서 돋보기를 들고 있는 탐정이었고, Claude는 "그게 정말 논리적으로 맞나요?"라고 계속 질문을 던지는 왓슨(Watson)이었습니다. 반전은 이 사례에서 왓슨이 탐정에게 반기를 들었다는 점입니다. 셜록(Sherlock)은 열쇠를 가졌고, 왓슨은 의구심을 가졌습니다. 저는 그 둘을 서로 마주 보게 해야 했고, 그들이 내놓는 첫 번째 자신만만한 문장을 그대로 받아들이기를 거부해야 했습니다.
여기에 깔끔한 아이러니가 존재합니다. 청구서를 폭등시킨 에이전트인 Vigil Crest는 바로 이 아이디어, 즉 '자신이 얼마나 확신하는지 아는 판결이 확신에 찬 추측보다 낫다'는 개념을 바탕으로 구축되었습니다. 이 에이전트는 의도적으로 자신의 판단에 헤징(hedging, 위험 분산)을 합니다. 자신의 청구서 문제를 해결하는 것은 결국 제 도구들이 똑같은 일을 하도록, 즉 도구가 가져온 정보와 도구가 가정한 정보를 분리하도록 만드는 과정이었습니다. 에이전트의 설계 철학 자체가 스스로가 일으킨 사건을 해결하는 열쇠였습니다.
제가 배운 점들 (부디 도움이 되길 바라며)
청구서는 트래픽과 전혀 상관이 없었습니다. Umami는 클라이언트 사이드 JavaScript (client-side JavaScript)입니다. 제 스크립트를 실행하는 브라우저를 집계합니다. 봇(bot)을 볼 수 없고, API 호출을 볼 수 없으며, Bedrock 비용과는 아무런 관련이 없습니다. 저는 서로 관련 없는 두 숫자를 하나로 묶어 스스로를 겁먹게 만들었습니다.
프로젝트 레이블은 사실이 아니라 추측이었습니다. Bedrock 비용은 계정 수준(account-level)에서 청구됩니다. 호출한 대상의 태그(tag)를 상속받지 않습니다. Application Inference Profiles를 설정하고 이를 호출하지 않는 한, 모든 모델 비용은 "프로젝트 없음"으로 표시된 버킷에 쌓이며, 무언가가 이를 점유해야 합니다. 제 경우에는 Clew Directive가 추측에 의해 점유되었습니다.
당신을 괴롭히는 비용은 조용한 비용입니다. 31달러의 스프린트(sprint)는 끝났습니다. 6월 수치는 0달러입니다. 토큰 폭증(token burst)은 요란했고 스스로 제한적이었으며, 제가 노트북을 닫았을 때 종료되었습니다. 끝나지 않는 것은 Vigil Crest 아래에서 계속 돌아가는 EC2 인스턴스이며, 계속 켜져 있도록 설계되었기 때문에 시간당 비용이 청구됩니다. 작은 항상 켜져 있는(always-on) t3.micro는 저렴하지만, 저렴하고 잊혀진 비용이 바로 고정 비용(standing costs)이 몰래 다가오는 방식입니다. 무엇을 계속 실행하고 있는지, 그리고 왜 실행하는지 파악하십시오.
AI 도구들은 유용하면서도 동시에 틀렸습니다. Q는 CloudTrail과 Cost Explorer를 깔끔하게 읽었지만, 매번 제 앱을 탓하며 잘못된 이야기를 세 번이나 늘어놓았습니다. Claude는 잘못된 가격 책정을 잡아내고 리포지토리(repos)를 읽었지만, 여전히 커밋(commit)은 볼 수 있어도 배포(deployment)는 볼 수 없다는 점을 인정해야 했습니다. 실제 작업은 각 주장을 확신에 찬 문장이 아니라 소스(source)에 고정하는 것이었습니다. 검색(retrieval)을 신뢰하고, 회상(recall)을 검증하십시오.
그러니 아니요, Clew Directive는 바이럴되지 않았습니다. 14명의 사용자에게 서비스되었고 크롤러(crawlers) 무리에게 노출되었으며 비용은 거의 들지 않았습니다. 그것이 바로 이 프로젝트가 구축된 목적입니다.
청구서의 주인공은 EC2로 만든 트렌치코트를 입고 다음 프로젝트를 구축하고 있던 바로 저였습니다.
AWS에 전해주세요. 그것이 저였다는 것을 그들이 알기를 원합니다.
Clew Directive는 무료이며 오픈 소스입니다. clewdirective.com에서 AI 코스 미로를 벗어날 방법을 찾아보세요.
AI 보조. 인간 승인. NLP 기반.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기