하나의 모델, 하나의 청구서 — 그런데 누가 얼마나 썼을까?
사내에 AI 기능이 퍼지면 반드시 부딪히는 벽이 있어요. HR팀은 정책 Q&A에, 회계팀은 재무 문서 분석에, IT팀은 인프라 트러블슈팅에 같은 Amazon Bedrock 파운데이션 모델을 씁니다. 문제는 청구서입니다. AWS 청구서에는 Bedrock 사용량이 단 한 줄로 찍혀요. 이러면 재무팀 입장에서는 부서별로 비용을 charge-back(원가 배분)할 수도, 팀별 예산을 잡을 수도, 어디서 돈이 새는지 파악할 수도 없습니다. 😅
이 문제를 푸는 열쇠가 바로 Application Inference Profile입니다. 쉽게 말해 **모델을 감싼 태그 가능한 래퍼(Wrapper)**예요. 프로필마다 Team=HR, Team=Accounting 같은 태그를 붙여두면, AWS Cost Explorer에서 부서별 비용이 별도 라인 아이템으로 분리되어 나타납니다. 토큰 단가는 동일하기 때문에 비용 추적을 위한 추가 요금은 없어요.
이 글에서는 3개 부서용 프로필을 만들고, 태그를 활성화하고, 애플리케이션 라우팅을 바꾸고, Cost Explorer에서 부서별 내역을 확인하는 과정을 순서대로 다뤄요. 예상 소요 시간은 30분이고, 비용 데이터가 반영되기까지는 24~48시간이 걸립니다.
💡 원문은 AWS Architecture Blog의 Track generative AI costs with Amazon Bedrock inference profiles입니다. 근거 자료로 함께 보시면 좋아요.

Step 1. 부서별 Inference Profile 만들기
AWS 콘솔에서 Amazon Bedrock → Inference profiles → Application 탭 → Create inference profile로 들어갑니다. 각 부서마다 프로필을 하나씩 만들되, 모두 같은 파운데이션 모델을 가리키게 하세요.
| 항목 | 값 |
|---|---|
| Profile name | HR / Accounting / IT |
| Model | 동일한 파운데이션 모델 (예: Anthropic Claude) |
| Tag Key | Team |
| Tag Value | HR / Accounting / IT |
팀이 수십 개라면 수동으로 만들지 말고 AWS CloudFormation의 AWS::Bedrock::ApplicationInferenceProfile 리소스로 한 번에 프로비저닝하세요.
Step 2. Cost Allocation Tag 활성화
프로필을 만들었다고 끝이 아니에요. AWS Billing and Cost Management → Cost allocation tags로 가서 Team 태그를 찾아 Activate를 눌러야 합니다. 멀티 계정(AWS Organizations) 환경이라면 관리(payer) 계정에서 활성화해야 멤버 계정의 사용량이 통합되어 Cost Explorer에 나타납니다.
⚠️ 태그는 대소문자를 구분합니다.
Team과team은 완전히 다른 태그예요. 활성화 후 데이터 반영에 24~48시간이 걸립니다.
Step 3. 애플리케이션 라우팅 변경 (핵심 코드)
기존 코드에서 modelId에 파운데이션 모델 ID를 넣던 부분을 Inference Profile ARN으로 바꾸기만 하면 됩니다. API 호출 자체는 동일해요.
# 부서별 Inference Profile ARN 매핑
# 각 프로필은 동일한 파운데이션 모델을 가리키지만 Team 태그가 다름
DEPARTMENT_PROFILES = {
"hr": "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/hr-profile-id",
"accounting": "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/accounting-profile-id",
"it": "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/it-profile-id",
}
import boto3
bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
def invoke_for_department(department: str, prompt: str):
# 부서 이름으로 해당 프로필 ARN을 조회 (없으면 KeyError)
profile_arn = DEPARTMENT_PROFILES[department]
# modelId 자리에 프로필 ARN을 넣으면 끝. 나머지 파라미터는 동일.
response = bedrock.invoke_model(
modelId=profile_arn,
body={
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 512,
"messages": [{"role": "user", "content": prompt}],
},
)
return response["body"].read()
# 사용 예: HR 부서 요청은 HR 프로필로 라우팅 → Team=HR 태그로 비용 기록
invoke_for_department("hr", "연차 정책 알려줘")
Step 4. IAM 정책 — 프로필과 모델 둘 다 허용 필요
Inference Profile을 통해 호출할 때는 프로필과 그 뒤의 파운데이션 모델 양쪽에 대한 권한이 모두 필요합니다. 이 부분을 놓치면 AccessDenied가 떨어져요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:*:111122223333:application-inference-profile/*",
"arn:aws:bedrock:*::foundation-model/*"
]
}
]
}
111122223333은 본인 AWS 계정 ID로 교체하세요. 와일드카드(*)는 새 부서를 추가할 때 IAM 수정 없이 확장 가능하다는 장점이 있지만, 보안을 강화하려면 프로필 ARN을 명시적으로 나열하는 편이 좋습니다.
Step 5. Cost Explorer에서 부서별 비용 확인
Billing and Cost Management → Cost Explorer로 이동해서:
- 날짜 범위를 호출을 실행한 이후로 설정
- Granularity: Daily 또는 Monthly
- Group by: Tag →
Team
막대 차트에서 HR, Accounting, IT가 각각 다른 색으로 분리되어 나타나고, 아래 표에서 정확한 금액을 확인할 수 있습니다. 48시간이 지나도 안 보이면 (1) 태그가 활성 상태인지, (2) 호출이 프로필 ARN으로 이뤄졌는지부터 확인하세요.

이 기술의 한계와 주의사항
- 실시간이 아닙니다. Cost Explorer 반영까지 24~48시간이 걸려요. 실시간 예산 통제가 필요하다면 AWS Budgets나 CloudWatch로 토큰 사용량을 별도 모니터링해야 합니다.
- 태그는 소급되지 않습니다. 프로필을 만들기 전에 발생한 호출은 절대 분리되지 않아요. 도입 전 비용은 그냥 뭉쳐 있는 상태로 남습니다.
- 프로필 삭제는 즉시 영향을 줍니다. ARN을 참조하는 애플리케이션이 있다면 바로 장애가 납니다. 재생성하면 새 ARN이 발급되므로 애플리케이션 참조를 반드시 업데이트해야 해요.
- IAM 원칙 기반 귀속과 다릅니다. 만약 팀마다 서로 다른 IAM 역할로 Bedrock을 호출한다면, 프로필 없이도 IAM principal 기준 비용 귀속이 가능합니다. 이 아키텍처는 단일 애플리케이션이 하나의 역할로 여러 부서를 대신 호출하는 경우에 특화된 해법이에요.
한국 개발 생태계에서의 적용 맥락
국내 SI·엔터프라이즈 환경에서는 **부서별 원가 배분(charge-back)**이 감사·예산 심의와 직결되는 경우가 많습니다. 특히 공공·금융권은 내부 통제 요건상 "어느 부서가 AI 비용을 얼마나 썼는가"를 증빙해야 하는 상황이 자주 생겨요. 이때 IAM 기반 귀속은 단일 게이트웨이 아키텍처와 충돌하기 쉬운데, Inference Profile은 그 충돌을 우회할 수 있는 실용적인 옵션입니다. 다만 CloudFormation으로 프로필을 코드화(IaC)해두지 않으면 부서가 늘어날 때마다 콘솔 수작업이 발생하니, 초기부터 IaC로 관리하시길 권합니다.
다음 단계 학습 방향
- AWS Budgets로 부서별 지출 한도와 알람 설정
- Cost Anomaly Detection으로 이상 지출 패턴 자동 탐지
- Amazon CloudWatch로 부서별 토큰 사용량 커스텀 메트릭 수집
- Knowledge Bases (RAG) 호출에도 동일한 프로필 ARN을 넘겨서, 직접 모델 호출 외 워크플로까지 귀속 범위 확장
특히 RAG까지 확장하는 패턴은 최근 생성형 AI FinOps에서 자주 언급되는 주제이니, 프로필 ARN을 애플리케이션 설정값으로 중앙 관리해두면 이후 확장이 훨씬 편해집니다.

정리 — 태그 하나로 부서별 청구서를 쪼갭니다
정리하면 흐름은 이래요.
- 부서별로 Application Inference Profile 생성 (같은 모델, 다른 태그)
TeamCost Allocation Tag 활성화 (멀티 계정은 payer 계정에서)- 애플리케이션의
modelId를 프로필 ARN으로 교체 - IAM 정책에 프로필 + 파운데이션 모델 양쪽 권한 부여
- Cost Explorer에서 Group by → Tag → Team
새 부서를 추가하고 싶으면 태그된 프로필 하나만 더 만들면 끝입니다. 와일드카드 IAM 정책을 썼다면 IAM 수정도 필요 없어요. 토큰 단가는 그대로이므로 "비용 추적을 위해 돈을 더 낸다"는 부담도 없습니다.
국내에서 AI 기능을 사내 여러 팀에 배포하면서 "청구서를 어떻게 쪼개지?"로 고민하셨다면, 이 패턴이 가장 빠르고 저렴한 답이에요. 도입 전에 반드시 프로필 생성 시점 이후의 호출만 집계된다는 점, 그리고 태그 활성화에 24~48시간이 걸린다는 점을 팀 내에 공유해두시면 삽질을 줄일 수 있습니다. 😄