Bedrock Inference Profiles — 눈먼 상태에서 벗어나 AWS Bedrock 사용량을 상세하게 파악하기
요약
AWS Bedrock 사용량을 상세히 모니터링하고 비용 효율성을 높이기 위한 'Inference Profiles' 활용법을 소개합니다. S3와 CloudWatch를 통한 로깅부터 애플리케이션별 태그 지정까지 3단계 계층 구조를 통해 가시성을 확보하는 방법을 다룹니다.
핵심 포인트
- S3와 CloudWatch를 활용해 모든 Bedrock API 호출을 기록하여 기초 가시성 확보
- Application Inference Profiles를 사용하여 호출 주체(앱, 팀)별 태그 지정 가능
- 코드 변경 없이 프로필 ARN 교체만으로 상세한 비용 및 사용량 추적 구현
- Athena를 통해 특정 애플리케이션의 토큰 낭비 및 ROI 분석 가능
시작점: 가시성 제로
모든 조직은 현재 팀의 생산성을 높이고, 그 파급 효과로 제품의 품질을 개선하기 위해 Claude, Codex, Cursor, Cline 및 기타 수많은 훌륭한 도구들을 사용하고 있습니다. 이러한 도구의 대부분은 개발자 지향적이지만, 새로운 세대의 애플리케이션인 에이전트형 애플리케이션 (agentic applications)이 점점 더 많이 늘어나고 있습니다.
메뉴와 필터가 제대로 작동하지 않는 단순하고 미숙한 은행 앱을 클릭하며 사용하는 대신, 이제는 자연어로 대화하며 "이번 달 내 돈이 어디로 나가고 있지?"와 같은 질문을 할 수 있습니다. 이러한 기능은 제품이 제공하는 가치의 기준을 높이고 있습니다. AWS 컨설턴트로서 저의 경우, 이러한 에이전트형 기능의 대부분은 배후에서 AWS Bedrock에 의해 구동됩니다. 물론 다른 클라우드에서 각자의 LLM을 사용하거나, Ollama, 또는 원한다면 OpenAI나 Anthropic의 API 키를 직접 사용하여 구현할 수도 있습니다.
현재 귀하의 조직 내 여러 애플리케이션이 이미 AWS Bedrock을 사용하여 제품을 개선하고 있을 수 있습니다. 하지만 ROI (투자 대비 효율)를 인지하고 계신가요? 아니면 다음과 같은 질문에 답하지 못한 채 총 청구 금액만 보고 계신가요?
- 어떤 앱이 Claude를 가장 많이 호출하는가?
- Haiku로 충분한 상황에서 어떤 팀이 Opus에 토큰을 낭비하고 있는가?
- 어떤 애플리케이션이 어젯밤 루프를 돌며 사소한 작업에 40달러를 써버렸는가?
이 지점에서 Bedrock inference profiles가 도움이 됩니다. 이제 모든 계정과 리전에서 어떤 사용자와 애플리케이션이 어떤 모델을 사용하고 있는지, 그리고 비용이 얼마나 발생하는지를 확인할 수 있습니다. 정말 멋지지 않나요?
솔루션: 세 가지 계층
성격이 급한 빌더들을 위한 정보: GitHub Code
계층 1 — 모든 호출 캡처
이것은 기초 단계입니다. Bedrock에 모든 API 호출을 다음 두 곳에 기록하도록 설정합니다.
- S3 (
invocations/접두사) — 내구성이 높고 저렴하며, Athena로 쿼리가 가능함 - CloudWatch (
/aws/bedrock/invocations) — 실시간 모니터링 (tailing) 및 알림용
이제 CloudWatch에서 사용된 토큰을 포함하여 각 요청(request)과 응답(response)을 확인할 수 있습니다. 이 단계가 없다면 다른 모든 작업은 눈먼 상태가 됩니다. 계정/리전당 한 번씩 실행하세요.
Layer 2 — 모든 호출(invocation)에 식별자 태그 지정하기
이것이 핵심적인 통찰입니다. 로깅(Logging)만으로는 호출이 발생했다는 사실과 사용된 토큰 양은 알 수 있지만, 애플리케이션 관점에서 누가 호출했는지는 알 수 없습니다. 로그상에서는 동일한 모델에 대한 모든 호출이 동일하게 보입니다.
**애플리케이션 추론 프로필 (Application inference profiles)**이 이 문제를 해결합니다. 각 애플리케이션은 시스템 모델의 이름이 지정된 복사본인 프로필을 할당받으며, 다음과 같은 태그를 포함합니다:
tags: { app: "community-bank", team: "cto" }
애플리케이션은 자신의 modelId를 프로필 ARN으로 교체하기만 하면 됩니다. 필요한 변경 사항은 이것뿐입니다. 코드 변경 없이 설정만 바꾸면 됩니다. 프로필 ARN이 모든 로그 엔트리(log entry)에 흐르기 때문에, 이제 모든 토큰에는 앱과 팀의 식별자가 찍히게 됩니다.
이것으로 충분합니다. 이제 Athena로 이동하여 궁금한 질문들에 대한 답을 찾기 시작할 수 있습니다.
Layer 3 — Athena로 데이터 쿼리하기
식별자 스탬프가 찍힌 로그가 흐르기 시작하면, Athena는 S3 버킷을 쿼리 가능한 데이터 웨어하우스(warehouse)로 변환합니다:
- 앱별/일별 토큰 사용량
- 앱별 예상 비용 (USD)
- IAM 호출자별 지출 — 프로필을 통하지 않고 노트북에서 직접 Bedrock을 호출하는 개발자를 포착할 수 있습니다.
보너스: 교차 리전 추론(cross-region inference) 및 데이터 레지던시(data residency)
프로필을 설계하기 전에 이해할 가치가 있는 개념이 하나 더 있습니다. 프로필을 생성하는 데 사용되는 소스 모델 ID에는 지리적 접두사(geographic prefix)가 붙습니다:
us.anthropic.claude-haiku-4-5-20251001-v1:0
eu.anthropic.claude-haiku-4-5-20251001-v1:0
ap.anthropic.claude-haiku-4-5-20251001-v1:0
이 접두사는 단순히 장식용이 아닙니다. Bedrock에는 세 개의 지리적 라우팅 풀(routing pools)이 있으며, 이러한 시스템 프로필 중 하나를 복사하면 애플리케이션 프로필이 해당 라우팅을 상속받습니다. 즉, Bedrock이 높은 가용성(availability)과 더 나은 처리량(throughput)을 위해 해당 풀 내의 리전들로 트래픽을 자동으로 분산한다는 의미입니다.
| 접두사 (Prefix) | 풀 (Pool) | 사용 사례 (Use case) |
|---|---|---|
us. | 미국 교차 리전 (US cross-region) | 프로덕션 앱 (Production apps), 미국 데이터 |
| ... |
GDPR 준수 의무가 있거나 유럽에 고객이 있는 경우, eu.에서 프로필을 가져오면 데이터가 EU 리전을 절대 벗어나지 않습니다. 이는 추론 프로필 (inference profiles)을 단순한 비용 거버넌스 (cost governance) 도구가 아닌, 데이터 거버넌스 (data governance) 도구로 변모시킵니다.
거버넌스의 여정 (The governance arc)
- 이전 (Before) — 청구서가 도착하지만, 누가 무엇을 사용했는지 알 수 없음
- 로깅 활성화 (Enable logging) — 원시 데이터 (raw data)가 흐르지만, 모두 ARN과 역할 (roles)로 되어 있어 여전히 읽기 어려움
- 프로필 추가 (Add profiles) — 앱당 한 번의 설정 변경만으로 코드 변경 없이 완전한 귀속 (attribution) 가능
- Athena — 토큰 레벨 (token-level) 상세 분석, 앱/일별, IAM 호출자별 예상 USD 비용 산출
- Cost Explorer — 예산 수준의 가시성 및 알림을 위해
app/team태그 활성화
무(無)에서 완전한 관측 가능성 (observability)까지. 그것이 바로 이 여정입니다.
구현 가이드 (Implementation Guide)
애플리케이션 추론 프로필 (application inference profiles) 및 호출 로깅 (invocation logging)을 사용하여 Bedrock 비용을 추적하기 위한 기술적 설정입니다.
사전 요구 사항 (Prerequisites)
- IAM, Bedrock, S3, CloudWatch Logs에 대한 권한이 구성된 AWS CLI
- 호출 로그 (invocation logs)를 위한 S3 버킷
- 리전 (Region):
us-east-1(AWS_REGION을 통해 재정의 가능)
아키텍처 (Architecture)
bedrock-cost-tracking/
├── 01-enable-logging.sh # 1단계: 호출 로깅 활성화 (계정당 1회 실행)
├── 02-create-inference-profiles.sh # 2단계: 앱/팀별 프로필 생성
...
설정 (Setup)
1단계 — 호출 로깅 활성화 (계정/리전당 1회)
export BEDROCK_LOG_BUCKET=your-bedrock-logs-bucket
bash 01-enable-logging.sh
이 과정은 다음을 생성합니다:
- CloudWatch 로그 그룹 (log group)
/aws/bedrock/invocations(90일 보관) - S3 + CloudWatch 쓰기 권한을 가진 IAM 역할 (role)
BedrockInvocationLoggingRole - 두 목적지를 모두 가리키는 Bedrock 모델 호출 로깅 설정 (model invocation logging configuration)
2단계 — 애플리케이션 추론 프로필 생성
bash 02-create-inference-profiles.sh
각 프로필에는 app 및 team 태그가 지정됩니다. 스크립트는 생성된 각 프로필의 ARN을 출력합니다. 이 ARN들을 invoke_profiles.py와 athena-usage-query.sql에 복사하여 붙여넣으세요.
3단계 — 검증 (Validate)
# 2단계 출력값에서 프로필 ARN 설정
export PROFILE_ALPHA=arn:aws:bedrock:us-east-1:<YOUR_ACCOUNT_ID>:application-inference-profile/<ID>
export PROFILE_BETA=arn:aws:bedrock:us-east-1:<YOUR_ACCOUNT_ID>:application-inference-profile/<ID>
...
새로운 앱 프로필 추가하기
1. 소스 모델 ARN 찾기
aws bedrock list-inference-profiles --region us-east-1 --type-equals SYSTEM_DEFINED \
--query 'inferenceProfileSummaries[?contains(inferenceProfileId, `haiku`) == `true`].{ID:inferenceProfileId,ARN:inferenceProfileArn}' \
--output table
이 출력 결과에서 전체 ARN을 사용하세요. copyFrom 필드에는 전체 ARN이 필요합니다.
2. 프로필 생성하기
app-gamma, gamma, data-science를 사용자의 앱 이름과 팀 이름으로 변경하세요.
SOURCE_ARN="arn:aws:bedrock:us-east-1:<YOUR_ACCOUNT_ID>:inference-profile/us.anthropic.claude-haiku-4-5-20251001-v1:0"
aws bedrock create-inference-profile \
...
3. athena-usage-query.sql에 새로운 ARN 추가하기 — pricing CTE에 ARN, 앱 레이블(label), 그리고 토큰 가격을 포함한 행을 추가합니다.
4. 검증 호출 실행하기
python3 invoke_profiles.py # 먼저 APP_PROFILES에 새 프로필을 추가하세요
python3 check_logs.py # 속성(attribution)이 올바르게 표시되는지 확인하세요
기존 앱 마이그레이션 (코드 변경 없이 설정 하나만 변경)
앱은 프로필 ARN을 modelId로 전달합니다. API 호출 형태는 모델을 직접 호출할 때와 동일합니다:
# 변경 전: 모델 직접 호출 (속성 지정 없음)
BEDROCK_MODEL_ID=us.anthropic.claude-haiku-4-5-20251001-v1:0
...
SDK 변경은 필요하지 않습니다. 응답 형태(response shape)도 동일합니다.
비용 속성 지정 (Cost attribution)
Cost Explorer (예산 수준)
- AWS Billing 콘솔에서 비용 할당 태그 (cost allocation tags) 활성화:
app,team - Cost Explorer → 태그로 그룹화 (Group by tag) →
app또는team으로 필터링 - 태그 값별로 예산 알림 (budget alerts)을 설정하여 지출 이상 징후를 조기에 포착
Athena (토큰 수준)
S3 로그 버킷에 대해 athena-usage-query.sql을 실행하여 일일 토큰 수와 앱 프로필별 예상 USD 비용을 확인하세요. 쿼리 파일은 다섯 단계의 점진적인 과정을 포함합니다:
| 쿼리 | 내용 |
|---|---|
| Step 1 | S3 로그에 대한 Athena 테이블 생성 |
| ... |
가격 참조 (us-east-1, 온디맨드 (on-demand))
| 모델 | 1K 토큰당 입력 (Input) | 1K 토큰당 출력 (Output) |
|---|---|---|
| Claude Haiku 4.5 | $0.00080 | $0.00400 |
| ... |
IAM 수준의 할당 (IAM-level attribution)
호출 로그 (Invocation logs)는 호출자의 IAM ARN (identity.arn)을 캡처합니다. 이를 통해 개발자별 또는 역할(role)별 지출 쿼리가 가능합니다. 이는 개발자마다 별도의 프로필을 만들 필요 없이, AI 코딩 어시스턴트 사용량을 운영 워크로드와 분리하여 추적하는 데 유용합니다.
핵심 개념 (Key concepts)
**시스템 추론 프로필 (System inference profiles)**은 AWS에서 관리하는 교차 리전 라우팅 프로필 (예: us.anthropic.claude-haiku-4-5-20251001-v1:0)입니다. 이는 탄력성을 위해 자동으로 사용 가능한 최적의 리전으로 라우팅합니다.
**애플리케이션 추론 프로필 (Application inference profiles)**은 태깅 메타데이터를 추가한 시스템 프로필의 계정 소유 복사본입니다. 이는 할당 계층 (attribution layer) 역할을 하며, 라우팅이나 모델 동작의 차이는 없습니다.
**호출 로깅 (Invocation logging)**은 토큰 수, 모델 ID (프로필 사용 시 프로필 ARN으로 해석됨), 호출자의 IAM ID를 포함하여 Bedrock 서비스 수준에서 모든 요청/응답을 캡처합니다.
엔지니어가 되어 소프트웨어를 통해 사회에 가치를 창출하기에 이보다 더 좋은 시기는 없었습니다.
이 글이 도움이 되었다면, 제 블로그 jorgetovar.dev를 방문해 주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기