AI(Kiro · Claude Code · Codex)와 대화하며, 사내 개발자용
LLM 거버넌스 게이트웨이를 AWS에 구축하는 Skill
← / → · Space · 하단 버튼 · 점 클릭 으로 이동 — 총 24 슬라이드 · F 전체화면
코드 에이전트(Claude Code · Codex)를 개별로 Bedrock에 붙이지 않고, 단일 거버넌스 게이트웨이를 강제 경유시켜 중앙 통제한다.
신원 강제 — org-sso(AWSReservedSSO_) 또는 cognito-native(Cognito User Pool)
사용자별 가상키 발급
Enterprise 라이선스 불필요
모델 라우팅(Claude · GPT-5.6 Sol/Terra/Luna · 5.5 · 5.4)
티어별 allowlist
예산 캡(economy $50)
Bedrock Guardrails
콘텐츠·PII·금지토픽
시크릿 탐지(pre-call)
CloudWatch(인프라)
Langfuse(프롬프트/트레이스)
키별 사용량·예산
한 코드베이스로 최소 PoC ~ 엔터프라이즈까지 (토글로 구성)
금색 점선 = 옵션 구성요소(Langfuse·certMode=acm·웹검색·GPT/Mantle·CodeBuild 이미지 빌드) · Claude/AgentCore = SigV4(Task Role, 토큰 없음) · Mantle = 런타임 발급 Bearer 키 · AWS 공식 아이콘
두 모드: org-sso(IdC 조직 인스턴스, AWSReservedSSO_ ARN만 허용) 또는 cognito-native(계정 인스턴스/조직 SSO 불가 시 — Cognito User Pool이 유일 신원원, SAML/IdC 페더레이션 없음)
org-sso: API GW AWS_IAM(SigV4), 권한셋 execute-api:Invoke만. cognito-native: API GW Cognito authorizer(scopes 없음 → id_token 수용, email claim 로깅), cognito:groups→팀
사용자별 가상키 발급·DynamoDB 캐시(TTL). master key는 Secrets Manager grantRead. 장기 키 배포 없음
권한셋→LiteLLM 팀. economy=모델 allowlist + 예산 캡($50). standard=전 모델
Bedrock Guardrail + 시크릿 탐지가 모든 Claude 요청에 default 적용. MCP는 키별 access group으로 스코프
키별 사용량·예산, Langfuse 프롬프트/트레이스, CloudWatch 사용량 대시보드(모델·팀·사용자별 토큰/비용/지연 — EMF 자동 수집). cdk-nag 억제는 사유 명시
데이터 레지던시 요건이 있으면 배포 리전을 고정하고 모든 영속 데이터가 그 리전에 머무름을 위 경로로 보장
LiteLLM hide-secrets (pre-call) — API 키/토큰 패턴을 요청 단계에서 마스킹·차단. 모든 모델 공통
콘텐츠: HATE·INSULTS·SEXUAL·VIOLENCE·MISCONDUCT (HIGH)
PII 차단: 카드·SSN·AWS Access/Secret Key + API키 정규식
금지 토픽: 해킹툴·데이터 유출
가상키별 mcp_access_groups(예 default_tools). 팀 멤버십 없는 키는 도구 사용 불가 — 검색 트래픽도 게이트웨이 경유
⚠️ Bedrock Guardrail은 bedrock-runtime(Claude) 전용 → GPT(Mantle) 경로는 Layer 1로 보완하고 정책 공백을 문서화(constraints.md)
| # | 선택축 | config 필드 | 옵션 |
|---|---|---|---|
| 1 | 엣지 TLS | litellm.certMode | acm(도메인+ACM · HTTPS) / http(도메인X · HTTP 평문 · PoC 전용) — 둘 다 SG CIDR allowlist(albIngressCidrs) 필수 |
| 2 | 관측성 깊이 | enableLangfuse | Langfuse on / CloudWatch만 — 어느 쪽이든 CloudWatch 사용량 대시보드(토큰·사용자별·시간대별)는 기본 제공 |
| 3 | 모델·비용 티어 | Token Lambda 팀 매핑 | standard(전 모델) / economy(allowlist + 예산캡) |
| 4 | 제공 모델 | constants.MODELS | Claude Opus/Sonnet/Haiku/Fable 5(bedrock-runtime) + GPT 5.6 Sol(플래그십·1M) / Terra(균형) / Luna(경제·저지연) · 5.5 · 5.4(bedrock_mantle) — 5.6는 LiteLLM v1.98.0 핀에서 정식 지원, 배포 후 Codex 스모크 테스트로 확인 후 개발자 온보딩 |
| 5 | 리전(데이터 레지던시) | awsRegion | config가 authoritative(constants 수정 불필요) · AgentCore/Mantle은 us-east-1 고정 |
| 6 | 용량·비용 | data.* · litellm.* · natGateways | Aurora ACU · Fargate 크기 · NAT 수 |
| 7 | 부트스트랩 | bootstrapQualifier | 기본 / 커스텀(충돌 회피) |
추가 토글: awsRegion(리전 선택) · guardrail.enabled · observability.dashboardEnabled · agentcore(AgentCore 웹검색) · mantle(GPT-5.6/5.5/5.4 피어링) · sso · auth.keyCacheTtlSeconds
Discovery 답변 → config/dev.json 요약 승인. http 모드는 평문 전송 명시 승인(0.0.0.0/0이면 별도 승인) · cognito-native는 초기 사용자 · Fable/Mythos는 데이터 리텐션 opt-in 포함
스택 구성·예상 비용 제시 후 승인. MCP-first: 모델 ID는 하드코딩 금지·런타임 검증
근거: SKILL.md (Phase 1~6)
setup-developer.sh가 outputs.json에서 전부 자동 유도(zero-touch) · 기존 사용자 설정은 병합·백업(덮어쓰기 금지) · 온보딩 HTML은 스크립트 실행 중심(수동 편집 안내 없음)cloudwatch_usage EMF 콜백 + ObservabilityStack 대시보드(토큰·사용자별·시간대별·비용·지연)산업·티어·리전 입력에 맞춰 커스터마이즈되어 생성
키 helper가 Token URL에서 SigV4 리전 파싱 → 무수정 다리전
문서의 CLI 플래그도 docker run --entrypoint litellm <image> --help로 확인 — 미존재 플래그는 부팅 즉사(exitCode 2)
"no changes" ≠ 정상 — CDKToolkit의 실제 Qualifier 확인 후 cdk.json에 명시
Network는 공용 인프라 SG만(CIDR ingress) · 서비스/ALB SG는 앱 스택 소유 → 순환참조 원천 차단
Guardrail은 bedrock-runtime 전용 → GPT 경로 공백 명시
master key·DB·앱 시크릿은 Secrets Manager. 평문은 안티패턴
~/.claude·~/.codex는 공유 파일 — 백업 후 우리 키만 갱신, 절대 덮어쓰지 않음
PROXY_BASE_URL/NEXTAUTH_URL=공개 URL 단독 메커니즘 (--forwarded-allow-ips는 이미지에 없음 — 금지)
RETAIN·백업·per-AZ NAT·스코프 IAM·로그 — 각 항목 PROD TODO
CDK 기본 open:true가 SG allowlist 옆에 전세계 오픈 규칙을 조용히 추가 → 모든 리스너에 open:false + 배포 후 SG 실사
5.6 Sol/Terra/Luna 정식 지원 — LiteLLM v1.98.0 핀에 5.6 라우팅 포함(v1.93.0부터 stable), Mantle도 Codex namespace 툴 타입을 서버 측에서 수용. 배포 후 멀티턴·툴 사용 Codex 세션 1회로 확인하고 온보딩(5.5/5.4는 폴백 페어)
EMF 디멘전은 Model/Team(유한)만 — 사용자는 property(무한 집합=메트릭 과금 폭발). 사용자별 뷰는 Logs Insights. SEARCH 범례엔 dynamic label 필수
근거: shared/reference/constraints.md (실 배포에서 발견·역반영된 항목)
cdk bootstrap 가능AWSReservedSSO_ 신원만 허용(org-sso). 조직 SSO가 없으면 cognito-native를 선택 — 아래 IdC 준비는 불필요aws sso login · cognito llmgw-login근거: shared/reference/prerequisites.md · shared/reference/sso-setup.md — 로컬 툴체인(Docker/Node/CDK/AWS CLI) 설치는 다음 슬라이드
스크롤하여 전체 출력 확인 · Docker는 권장(없으면 CodeBuild 빌드) · Node · CDK · AWS CLI가 ❌면 Phase 1 Discovery 진행 금지 · 근거: shared/reference/prerequisites.md §1
~/.kiro/skills/
llm-gateway-governance
~/.claude/skills/
llm-gateway-governance
~/.agents/skills/
llm-gateway-governance
세 곳의 SKILL.md는 md5 동일(CI 검증) · 지식은 shared/에 1벌만 작성(sync-skills.sh).
Codex: npm install -g @openai/codex · developers.openai.com/codex
트리거 예: "사내 개발자용 LLM 게이트웨이 만들어줘" · "Govern Bedrock access for developers"
설치 후 SKILL.md description으로 자동 활성화(트리거 매칭)
<gateway-url>/ui/ (acm=https:// · http=http://)team_alias로 lookup-or-create (1:1 무분기 매칭)POST /team/new로 선점 생성 — team_alias를 권한세트명과 동일하게 입력team_alias는 권한세트명 자체와 정확히 일치해야 함 — 오타 시 의도한 팀이 아닌 별도 팀으로 조용히 연결됨이후 자주 쓰는 4가지 Admin UI 작업(모델 설정·예산·프롬프트 확인·사용량)은 다음 슬라이드 · 근거: shared/reference/litellm-admin-guide.md
Admin UI → Models → Add Model → model_name, litellm_params 입력
Model 관리: docs.litellm.ai/docs/proxy/model_management
Bedrock 전용 파라미터(model prefix, AWS credentials 등): docs.litellm.ai/docs/providers/bedrock
Admin UI → Internal Users → 사용자 선택 → max_budget, budget_duration 설정
가이드: docs.litellm.ai/docs/proxy/users
Team budget(공유 pool)과는 다른 스코프 — 개인별 cap이 필요하면 이 경로 사용
Admin UI → Logs → Settings(⚙️) → "Store Prompts in Spend Logs" 활성화 → Save (재시작 불필요)
설정: docs.litellm.ai/docs/proxy/ui_spend_log_settings
로그 조회 전반: docs.litellm.ai/docs/proxy/ui_logs
Admin UI → Usage → Customer Usage 탭 → 고객별 spend, 일별 추이, 모델별 사용 비중 확인 · 인프라 한눈 뷰는 CloudWatch 사용량 대시보드(다음 슬라이드)
Customer Usage: docs.litellm.ai/docs/proxy/customer_usage
Spend Tracking 전반: docs.litellm.ai/docs/proxy/cost_tracking
근거: shared/reference/litellm-admin-guide.md §5 · Enterprise 라이선스 불필요(Admin UI·팀·budget 모두 OSS 기능)
cloudwatch_usage 콜백이 요청마다 EMF JSON 한 줄을 stdout에 출력 → 기존 awslogs 파이프라인 → CloudWatch가 메트릭 자동 추출. 추가 IAM 없음 · API 호출 없음 · 요청 경로 오버헤드 없음
디멘전=Model/Team(유한 집합, 그래프용) · 사용자=property(무한 집합 — Logs Insights로 조회, 메트릭 과금 0). 사용자별 이력은 로그 보존(2주) 한도 — 장기 리포트는 LiteLLM Admin UI/DB
테스트 호출 1건 → 로그에 "llmgw":"usage" 라인 → ~2분 내 list-metrics에 TotalTokens → DashboardUrl 출력값 열기
| 위젯 | 보여주는 것 |
|---|---|
| 토큰 by 모델/팀 | TotalTokens 합계 추이 (SEARCH로 런타임 생성 팀 자동 발견) |
| Prompt vs Completion | 모델별 입·출력 토큰 분리 |
| 비용(USD) by 팀 | LiteLLM 자체 비용 계산치 합계 |
| 요청/실패 · 지연 | 모델별 Requests·Failures, LatencyMs avg/p99 |
| 사용자 Top-N | 토큰·요청·비용 상위 20명 테이블 (Logs Insights) |
| 시간대별 사용 | 시간별 토큰·요청·활성 사용자 수 |
| 사용자×모델 드릴다운 | 누가 어떤 모델을 얼마나 (상위 50행) |
| ALB 상태 | requests · 5xx · target p95 |
ObservabilityStack(dashboardEnabled) · DashboardUrl CfnOutput · 근거: shared/patterns/cdk-stacks.md §7 · litellm-gateway.md §4 · 실 배포 검증(60개 시계열 자동 추출 확인)
이 스킬로 생성된 게이트웨이는 기본값부터 권한세트명 = LiteLLM team_alias로 1:1 매칭되도록 코드가 생성됩니다. 그래서 새 조직·팀이 생겨도 개발자 개입·코드 수정·재배포 없이, IdC 콘솔 + LiteLLM Admin UI 클릭만으로 온보딩·예산변경·모델 제한이 끝납니다.
team-research) → Add users to groupexecute-api:Invoke-only 정책 → AWS accounts에서 그룹에 배정team_alias = 3번과 동일한 이름 → Models(allowlist), Max Budget/Budget Duration을 화면에서 직접 입력 — 코드/배포 없음aws sso login 후 첫 호출 시 Admin UI Teams에서 반영 확인이 스킬이 생성하는 Token Lambda(_resolve_team_id)는 권한세트명을 그대로 LiteLLM team_alias로 사용합니다 — 별도의 매핑 테이블이나 if/else 분기가 없습니다. 그래서 3번(권한세트)과 4번(LiteLLM 팀)의 이름을 다르게 지으면 그 그룹의 로그인은 엉뚱한(또는 새로) 팀으로 연결되어 의도한 예산·모델 제한이 적용되지 않습니다. 이름을 똑같이 맞추는 것 자체가 유일한 연결 고리이므로, 온보딩 때마다 3·4번의 이름 일치만 지키면 코드를 열어볼 일이 없습니다.
잊지 말 것: 4번을 건너뛰면 조용히 default team으로 빠져 예산·allowlist가 적용 안 됨 · 근거: shared/patterns/lambda-handlers.md · shared/reference/sso-setup.md · shared/reference/litellm-admin-guide.md §2
조직 SSO를 못 쓰는 환경(IdC 계정 인스턴스 등)에서도 Cognito User Pool Group명 = LiteLLM team_alias로 1:1 매칭되도록 코드가 생성됩니다. IdC·permission set 없이, Cognito 콘솔·CLI + LiteLLM Admin UI 클릭만으로 온보딩·예산변경·모델 제한이 끝납니다.
aws cognito-idp admin-create-user --user-pool-id <pool> --username dev@ex.com (또는 콘솔)teamGroupPrefix 접두어, 예 llmgw-team-research) → admin-add-user-to-group. IdC permission set 불필요teamGroupPrefix로 필터해 팀 결정 — 별도 IAM·Identity Store 호출 없음team_alias = 2번 Group명과 동일 → Models(allowlist)·Max Budget을 화면에서 직접 입력 — 코드/배포 없음admin-set-user-password --permanent(또는 첫 로그인 강제변경) → 사용자가 llmgw-login(Cognito Hosted UI) 후 Admin UI Teams에서 반영 확인Token Lambda(_resolve_team_id)는 검증된 cognito:groups 중 teamGroupPrefix에 맞는 하나를 그대로 team_alias로 씁니다(require-single-team-group: 0개·다중이면 거부). Identity Store 호출·매핑 테이블·if/else 분기 없음 — 2번 Group명과 4번 team_alias가 다르면 엉뚱한 팀으로 연결됩니다. ⚠️ 클라이언트는 id_token을 보냅니다(access token엔 email claim이 없어 로그가 sub UUID로 찍힘; authorizer는 authorizationScopes 없이 id_token 수용).
org-sso 대비: permission set → Cognito User Pool Group · aws sso login → llmgw-login · 근거: shared/reference/account-instance-setup.md · shared/patterns/lambda-handlers.md · shared/reference/litellm-admin-guide.md
scripts/setup-developer.sh (Windows: .ps1 / py -3 gateway_auth.py setup) — outputs.json에서 게이트웨이 URL·모델 별칭·인증모드 자동 도출~/.claude/settings.json + ~/.codex/config.toml을 병합(백업 후 우리 키만 수정 — hooks·플러그인 보존)aws sso login(IdC 세션 8h) / cognito llmgw-login(refresh 30d)CLAUDE_CODE_USE_BEDROCK·AWS_BEARER_TOKEN_BEDROCK 제거 — 남으면 두 인증 경로 충돌 → 403 "API key not valid"model(raw Bedrock ID) 제거 — 별칭보다 우선 적용돼 "team not allowed to access model"command(실행파일)+args(배열) 분리 — Codex는 셸 없이 spawn, 합친 문자열은 401 "No api key"web_search = "disabled" 필수 — Mantle이 web_search 툴 거부 → "high demand" 오표시 루프. 검색은 게이트웨이 AgentCore MCP로apiKeyHelper/auth.command가 만료 시 조용히 재발급, 개발자 무감healthcheck → /v1/models에서 별칭 목록 확인근거: shared/patterns/developer-onboarding.md · shared/reference/constraints.md "Cross-platform client onboarding" · 실배포(Windows 포함) 검증
SSO/Cognito는 가상키의 발급만 통제합니다. IdC에서 사용자를 지워도(또는 SSO 세션이 만료돼도) 이미 발급된 가상키는 만료 시점까지 동작 — 이 게이트웨이는 키를 1시간 만료로 발급하므로 잔존 창 ≤ 1시간, 즉시 차단은 LiteLLM revoke가 유일합니다. (duration 없이 발급하던 과거 배포는 무기한 — 반드시 revoke)
sso-…/cognito-…) 삭제, 또는 POST /key/delete {"key_aliases":[…]} (master key) · 복귀 가능성 있으면 /key/block(정지)admin-disable-user(+admin-user-global-sign-out) — 이제 새 키를 받을 수 없음USER#…) 삭제(위생) → Admin UI Logs/CloudWatch에서 해당 user_id 요청이 멈췄는지 확인| 자격증명 | 수명 | 즉시 회수 방법 |
|---|---|---|
| SSO 세션 (org-sso) | IdC 기본 8h | 자동 만료 (발급 관문만 잠김) |
| Cognito access / refresh | 1h / 30d | admin-user-global-sign-out |
| LiteLLM 가상키 | 1h 자동 만료·회전 | /key/delete · /key/block (Admin UI) |
| master key | 무기한 | Secrets Manager 회전 + ECS 재배포 |
순서가 중요: ①revoke 먼저(즉시) → ②IdP 제거(재발급 차단) · 근거: shared/reference/litellm-admin-guide.md §6 Offboarding · constraints.md "Virtual-key lifetime ≠ SSO session" · 실배포에서 1h 자동회전 검증(2026-07)
스택 배포
Guardrail
저장 시크릿(장기)
md5 동일 SKILL
실 배포에서 발견한 이슈(SG 순환참조·미존재 CLI 플래그·bootstrap qualifier·설정 덮어쓰기·stale config 등)는 모두 Skill에 역반영
"사내 개발자용 LLM 게이트웨이 만들어줘"
"Govern Bedrock access for developers" · "LiteLLM 배포하고 SSO/Cognito 가상키 발급"
llm-gw.genailab.daradat.cloud/llm-gateway-governance-skill.zip
AWS GenAI Lab · llm-gateway-governance-skill · Kiro · Claude Code · Codex