하나의 모델, 하나의 청구서, 그리고 아무도 모르는 '누가 얼마 썼는지'

여러분 회사에서 Amazon Bedrock으로 생성형 AI를 운영하고 있다고 가정해볼게요. HR 팀은 사내 규정 Q&A에 쓰고, 회계팀은 재무 문서 분석에 쓰고, IT 팀은 인프라 트러블슈팅에 씁니다. 문제는 세 팀 모두 같은 파운데이션 모델을 호출한다는 점이에요.

AWS 청구서에는 이 모든 사용량이 단 한 줄의 라인 아이템으로 찍힙니다. 그러면 재무팀은 부서별로 비용을 charge-back(전가)할 수도 없고, 팀별 예산을 잡을 수도 없고, "어느 팀이 돈을 제일 많이 태우는가"를 식별할 수도 없어요. 실무에서 진짜 골치 아픈 지점이죠. 😅

이 문제를 해결하는 게 바로 Amazon Bedrock application inference profile입니다. 간단히 말하면, 파운데이션 모델을 감싼 **태그 가능한 래퍼(wrapper)**예요. 이 프로필 단위로 비용을 특정 팀이나 부서에 귀속시킬 수 있습니다. 여기에 AWS cost allocation tag를 결합하면 Cost Explorer에서 부서별 Bedrock 비용을 별도의 라인 아이템으로 볼 수 있어요.

이 글에서는 세 개 부서용 application inference profile을 만들고, 태그를 붙이고, 애플리케이션 호출 경로를 부서별 프로필로 라우팅한 다음, Cost Explorer에서 부서별 비용 분해를 확인하는 과정을 다룹니다. 원문 근거자료는 AWS Architecture Blog의 원문 포스트를 참고하세요.

AWS cloud architecture diagram showing Amazon Bedrock inference profiles routing requests from multiple departments to a shared foundation model System Abstract Visual

핵심 개념: 왜 IAM 기반 귀속이 아니라 '프로필'인가

먼저 짚고 갈 부분이 있어요. Amazon Bedrock은 호출한 IAM principal 단위로도 비용을 귀속할 수 있습니다. 각 팀이 서로 다른 IAM 자격증명으로 Bedrock을 호출한다면 이 방식이 잘 동작해요.

그런데 이 글의 아키텍처는 다릅니다. 하나의 애플리케이션이 모든 부서를 대신해서 단일 IAM role로 Bedrock을 호출합니다. 사용자 개별 신원은 AWS로 전달되지 않아요. 이 구조에서는 per-caller 귀속으로는 팀별 분리가 불가능합니다(사용자별 세션 관리를 추가하지 않는 한). 그래서 application inference profile에 태그를 붙여 라우팅 단위로 비용을 귀속시키는 겁니다.

전체 흐름 요약

  1. 부서마다 application inference profile을 하나씩 생성 (모두 같은 파운데이션 모델을 가리킴)
  2. 각 프로필에 cost allocation tag 부여 (예: Team=HR)
  3. AWS Billing and Cost Management 콘솔에서 해당 태그 활성화
  4. 애플리케이션이 부서별 inference profile ARN으로 호출을 라우팅하도록 수정
  5. Cost Explorer에서 부서별 비용 분해 확인

💡 비용 주의: 모델을 직접 호출하든 inference profile을 통해 호출하든 per-token 요율은 동일합니다. 비용 귀속을 위한 추가 요금은 없어요.

애플리케이션 라우팅 코드 예시 (Python)

핵심은 modelId 파라미터에 파운데이션 모델 ID 대신 inference profile ARN을 넘기는 것뿐입니다. API 호출 자체는 동일해요.

import boto3

bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")

# 부서별 inference profile ARN 매핑
# ARN 형식: arn:aws:bedrock:region:account-id:application-inference-profile/profile-id
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/acc-profile-id",
    "IT": "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/it-profile-id",
}

def invoke_for_department(department: str, prompt: str) -> str:
    # 애플리케이션 레이어에서 사용자 부서를 식별한 뒤 해당 프로필로 라우팅
    profile_arn = DEPARTMENT_PROFILES[department]

    response = bedrock.invoke_model(
        modelId=profile_arn,  # 파운데이션 모델 ID 대신 프로필 ARN 전달
        body={
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1024,
            "messages": [{"role": "user", "content": prompt}],
        },
    )
    return response["body"].read().decode("utf-8")

# 사용 예시
print(invoke_for_department("HR", "우리 회사 연차 규정 알려줘"))

IAM 정책: 프로필과 원본 모델 둘 다 권한이 필요하다

여기서 많은 분들이 삽질하는 지점이에요. inference profile을 통해 호출하려면 프로필 권한과 원본 파운데이션 모델 권한이 둘 다 필요합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/*",
        "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-*"
      ]
    }
  ]
}

111122223333 자리에는 본인 AWS 계정 ID를 넣어주세요. 프로필 ARN의 와일드카드(*)는 단일 애플리케이션 role이 부서별 프로필을 모두 호출할 수 있게 해줍니다. 보안을 더 조이려면 와일드카드 대신 특정 프로필 ARN을 나열하면 됩니다.

Developer configuring application inference profile tags in AWS Bedrock console for team-level cost allocation Algorithm Concept Visual

실무에서 반드시 체크해야 할 것들

1. 태그는 대소문자를 구분한다

Team과 team은 완전히 다른 태그입니다. 이거 하나 때문에 "왜 Cost Explorer에 안 뜨지?" 하면서 반나절 날리는 경우가 정말 많아요. 태그 키를 만들 때 팀 컨벤션을 먼저 정하고 일관되게 쓰세요.

2. 비용 데이터는 즉시 안 뜬다

cost allocation tag를 활성화해도 Cost Explorer에 반영되기까지 24~48시간이 걸립니다. 튜토리얼 따라 하고 바로 확인하려다가 "망했다" 싶은 분들 많은데, 정상이에요. 커피 한 잔 하고 오세요. ☕

3. 멀티 계정 환경에서는 payer 계정에서 활성화

AWS Organizations로 여러 계정을 쓰고 있다면, 관리(payer) 계정에서 Team cost allocation tag를 활성화해야 멤버 계정의 태그된 사용량이 Cost Explorer에 통합됩니다.

4. 프로필 삭제는 즉시 영향

inference profile 자체는 요금이 안 나옵니다. 호출만 과금돼요. 다만 프로필을 삭제하면 그 ARN을 쓰는 애플리케이션이 즉시 영향을 받습니다. 재생성하면 새 ARN이 발급되니 애플리케이션 참조를 업데이트해야 해요.

5. 대규모 프로비저닝은 CloudFormation으로

팀이 수십 개라면 콘솔에서 하나씩 만들지 마세요. AWS::Bedrock::ApplicationInferenceProfile CloudFormation 리소스로 IaC로 관리하는 게 정신 건강에 이롭습니다.

6. 프로덕션에서는 Guardrails 병행

inference profile을 프로덕션에서 쓸 때는 사용자 입력 검증과 함께 Amazon Bedrock Guardrails로 의도치 않은 콘텐츠를 필터링하는 걸 권장합니다. Bedrock API 통신은 TLS로 전송 중 암호화됩니다.

7. 이 기술의 한계

application inference profile은 비용 귀속을 위한 도구이지, 접근 제어나 쿼터 관리 도구가 아닙니다. 팀별 rate limit이나 사용량 상한을 강제하려면 별도로 AWS Budgets, CloudWatch 알람, 혹은 애플리케이션 레이어의 로직이 필요해요. "프로필 만들면 팀별로 격리되겠지"라고 기대하면 안 됩니다.

8. 한국 SI/엔터프라이즈 환경에서의 적용 맥락

국내 SI나 대기업 환경에서는 부서별 IT 비용 정산(charge-back) 요구가 굉장히 강한 경우가 많아요. 특히 그룹사가 공유하는 AI 플랫폼을 운영하는 조직이라면, 이 패턴이 곧바로 내부 원가 회계와 연결됩니다. 다만 국내 환경에서는 태그 정책을 재무팀과 사전에 합의해두는 게 중요해요. 나중에 태그 키 이름을 바꾸면 과거 데이터와 비교가 안 되기 때문입니다. 가능하면 Team 같은 키를 초기에 확정하고, 부서 코드 체계(예: 사업부 코드)와 매핑해두세요.

AWS Cost Explorer dashboard displaying per-department Amazon Bedrock costs grouped by Team cost allocation tag Technical Structure Concept

마무리: 다음 단계로 확장하기

정리하면, Amazon Bedrock application inference profile + cost allocation tag 조합으로 생성형 AI 비용을 팀 단위로 분리할 수 있습니다. 각 부서 비용이 Cost Explorer에서 별도 라인 아이템으로 보이니까, 재무팀도 만족하고 각 팀 리더도 자기 예산을 인지하게 됩니다.

새 부서를 추가하고 싶다면 태그된 프로필을 하나 더 만들면 끝이에요. 비용은 자동으로 별도 라인으로 뜹니다.

여기서 한 걸음 더 나가고 싶다면 다음을 권장합니다.

  • AWS Budgets로 부서별 지출 알림과 상한 설정
  • AWS Cost Anomaly Detection으로 이상 지출 패턴 탐지
  • Amazon CloudWatch로 부서별 토큰 사용량 모니터링
  • Knowledge Bases(RAG) 같은 상위 Bedrock 기능에도 동일한 태그 프로필 ARN을 참조시켜, 직접 모델 호출을 넘어선 범위까지 팀별 귀속 확장

함께 보면 좋은 글

이 아키텍처는 결국 **"공유 자원을 어떻게 회계 가능하게 만드는가"**라는 오래된 문제에 대한 AWS의 답입니다. 여러분 조직의 Bedrock 사용량이 이미 여러 팀으로 퍼져 있다면, 지금이 프로필을 정리할 타이밍이에요.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.