GenAI 애플리케이션을 운영하다 보면 "이 답변은 누가 무엇을 물어서 나왔나", "어느 팀이 토큰을 가장 많이 쓰나", "승인되지 않은 모델을 쓰는 계정은 없나" 같은 질문을 받게 됩니다. AIP-C01은 도메인 3의 거버넌스·규정 준수 항목(3.3)과 도메인 4의 모니터링 항목(4.3), 프롬프트 거버넌스 항목(1.6.3)에서 이 질문들에 답할 수 있는 설계를 묻습니다. 이번 포스팅에서는 질문별로 어떤 로그를 봐야 하는지, 모델 호출 로그와 CloudTrail의 차이, 조직 전체에 정책을 강제하는 방법(SCP, IAM 조건 키, Bedrock 정책), 그리고 코드 배포 없이 모델을 바꾸는 AWS AppConfig까지 정리합니다.
질문별로 보는 로그 지도
| 알고 싶은 것 | 보는 곳 | 기록 내용 | 기본 상태 | |-------------|---------|-----------|-----------| | 누가 언제 어떤 API를 호출했나 | AWS CloudTrail | 호출자, 시간, IP, 모델 ID (프롬프트 본문 없음) | 관리 이벤트는 기본 기록 | | 무엇을 묻고 무엇을 답했나 | 모델 호출 로그 | 요청·응답 본문, 토큰 수, 호출자 ARN | 기본 비활성, 직접 켜야 함 | | 느린가, 스로틀링인가, 비용이 큰가 | CloudWatch 지표 | 호출 수, 지연, 입력·출력 토큰 수, 스로틀링 수 | 자동 수집 | | 에이전트가 왜 그 단계를 택했나 | Agent trace | 추론, 도구 호출, 관찰 결과 | 로 요청 | | 어떤 안전 정책이 개입했나 | Guardrails trace | 개입한 필터·정책과 판단 결과 | trace 옵션으로 요청 | | 호출 체인 중 어디가 느린가 | AWS X-Ray | 서비스 구간별 지연 | 계측 필요 |
시험에서 가장 자주 나오는 구분은 첫 두 줄입니다. "누가 호출했는지 감사"는 CloudTrail, "프롬프트와 응답 내용 분석"은 모델 호출 로그입니다. CloudTrail에는 프롬프트 본문이 남지 않는다는 점을 기억하면 대부분의 문제가 풀립니다.
!어떤 질문에 어떤 로그를 볼까?
모델 호출 로그(Model Invocation Logging) 제대로 쓰기
모델 호출 로그는 기본적으로 꺼져 있으며, 계정의 리전별 설정으로 켭니다. , , , 호출의 요청·응답 본문과 메타데이터를 CloudWatch Logs, S3, 또는 둘 다로 보낼 수 있고, 대상은 같은 계정·같은 리전이어야 합니다. 본문이 100KB를 넘거나 이미지 같은 바이너리 데이터는 S3에 별도 객체로 저장됩니다. 텍스트, 이미지, 임베딩, 영상 중 어떤 유형을 기록할지도 고를 수 있습니다.
로그에는 호출자의 ARN()과 입력·출력 토큰 수가 들어 있어 팀별·애플리케이션별 사용량 분석에 바로 쓸 수 있습니다. CloudWatch Logs Insights라면 다음처럼 호출자별 토큰 사용량을 집계합니다.
호출할 때 에 팀, 환경 같은 키-값 태그를 넣으면 로그에 그대로 남아 비용 배분이 쉬워집니다. S3로 보낸 로그는 Athena로 장기 분석할 수 있습니다.
다만 이 로그에는 프롬프트와 응답 원문이 그대로 들어갑니다. Guardrails로 PII를 마스킹해도 로그의 입력 필드에는 원래 내용이 남으므로, 로그 그룹을 KMS로 암호화하고 접근 권한을 좁히고, CloudWatch Logs 데이터 보호 정책으로 민감 정보를 가립니다. 규제상 변경 불가능한 보관이 필요하면 S3 Object Lock을 걸고, 보존 기간이 끝난 로그는 수명 주기 규칙으로 삭제합니다.
CloudTrail: 누가, 언제, 무엇을 호출했나
CloudTrail은 Bedrock API 호출을 이벤트로 기록합니다. 시험에 필요한 구분은 관리 이벤트와 데이터 이벤트입니다.
관리 이벤트(기본 기록): , , , , 그리고 모델 커스터마이징·에이전트 생성 같은 대부분의 Bedrock API 데이터 이벤트(고급 이벤트 선택기로 별도 설정, 추가 요금): Knowledge Base의 ·, , Flow의 ,
그래서 "Knowledge Base 검색 호출을 감사해야 한다"는 요구에는 데이터 이벤트 설정이 필요합니다. 교차 리전 추론을 쓰면 이벤트는 호출한 리전에 남고, 실제 처리 리전은 으로 확인합니다. Amazon GuardDuty는 CloudTrail을 분석해 Guardrails 삭제나 학습 데이터 버킷 변경 같은 의심스러운 Bedrock 활동을 탐지합니다.
프롬프트 거버넌스(1.6.3)도 같은 도구로 만듭니다. Bedrock Prompt Management에서 프롬프트를 버전으로 관리하고, 템플릿 원본은 S3에 보관하고, 누가 어떤 프롬프트를 바꾸고 배포했는지는 CloudTrail로 추적합니다.
조직 전체에 정책 강제하기: SCP, IAM 조건 키, Bedrock 정책
계정이 여러 개인 조직이라면 계정마다 설정을 맡기지 않고 위에서 강제해야 합니다.
서비스 제어 정책(SCP)은 AWS Organizations에서 계정·OU 단위로 허용 범위의 상한을 정합니다. 승인되지 않은 모델의 호출을 모델 ARN으로 거부하거나, 조건으로 허용된 리전 밖의 호출을 막습니다. 교차 리전 추론을 쓴다면 프로필의 모든 대상 리전을 허용해야 하고, 글로벌 프로필은 이 "unspecified"인 요청을 허용해야 한다는 점도 함께 기억합니다.
IAM 조건 키 는 특정 가드레일을 지정하지 않은 추론 요청을 거부합니다. 다음 정책은 1번 버전의 지정된 가드레일이 없는 호출을 막습니다.
주의할 점이 두 가지 있습니다. 이 조건이 걸린 역할로 나 를 호출하면, 이 API들이 내부에서 가드레일 없이 모델을 부르는 호출 때문에 접근 거부가 날 수 있습니다. 또 입력 태그를 쓰면 프롬프트 일부를 가드레일 검사에서 뺄 수 있지만, 응답에는 항상 가드레일이 적용됩니다.
2026년 4월에는 AWS Organizations의 Bedrock 정책으로 관리 계정의 가드레일을 OU나 계정 전체의 모든 모델 호출에 강제하는 기능이 정식 출시되었습니다. 여러 가드레일이 겹치면 모두 합쳐 적용되고, 가드레일이 있는 리전별로 설정합니다.
설정을 코드 밖으로: AWS AppConfig
공식 가이드 1.2.2는 "코드 수정 없이 모델과 공급자를 전환하는 구조"를 요구합니다. 모델 ID, 프롬프트 버전, temperature, 폴백 모델 사용 여부 같은 값을 AWS AppConfig에 두면, Lambda는 AppConfig 확장으로 값을 읽어 캐시하고 코드 배포 없이 설정만 바꿀 수 있습니다.
AppConfig는 배포 전에 JSON 스키마나 Lambda 검증기로 잘못된 설정을 막고, 점진적 배포 전략으로 일부 대상에만 먼저 적용한 뒤 CloudWatch 알람이 울리면 자동으로 되돌립니다. 새 모델로 바꾸다가 오류율이 오르면 설정 하나로 이전 모델로 돌아갈 수 있어, 장애 대응과 A/B 비율 조정에 자주 쓰입니다.
데이터 출처 추적과 감사 대비
AWS Glue Data Catalog에 RAG가 쓰는 데이터 소스를 등록하고 계보(lineage)를 추적합니다(3.3.2). 문서에 출처·작성자·날짜 메타데이터를 붙여 두면 Knowledge Base 인용과 함께 생성 결과의 근거를 제시할 수 있습니다. IAM Identity Center와 임시 자격 증명으로 사람 단위의 호출 이력을 남기고, 애플리케이션 사용자 ID는 에 함께 기록합니다. 모델의 한계와 용도는 SageMaker Model Cards로 문서화하고, 의사 결정 로그는 CloudWatch Logs에 모아 감사에 대비합니다(3.3.1).
시나리오로 연습하기
보안팀이 지난달 특정 IAM 역할이 Bedrock 모델을 호출한 시각과 IP 주소를 확인하려 한다. 정답은 CloudTrail입니다. 품질팀이 고객 불만이 접수된 답변의 원래 질문과 응답 전문을 확인하려 한다. 정답은 모델 호출 로그이며, 미리 켜 두지 않았다면 남아 있지 않습니다. 재무팀이 부서별 토큰 사용량으로 비용을 나누려 한다. 요청마다 requestMetadata에 부서 태그를 넣거나 부서별 애플리케이션 inference profile을 만들고, 호출 로그를 집계합니다. 조직의 모든 개발 계정에서 승인된 모델 두 개만 쓰게 하려 한다. 그 외 모델 ARN의 호출을 거부하는 SCP를 OU에 연결합니다. 새 모델로 바꾼 뒤 오류가 늘어 즉시 되돌려야 한다. AppConfig에서 모델 ID 설정을 이전 값으로 되돌리면 코드 배포 없이 복구됩니다.
시험 핵심 정리
"누가 언제 어떤 모델 API를 호출했는지 감사" -- AWS CloudTrail (프롬프트 본문은 없음) "프롬프트와 응답 내용, 토큰 수 분석" -- 모델 호출 로그 (기본 비활성) "호출자별 토큰 사용량 집계" -- 호출 로그 + CloudWatch Logs Insights (identity.arn) "요청 단위로 팀·환경 태그 기록" -- requestMetadata "로그에 남은 PII 가리기" -- CloudWatch Logs 데이터 보호 정책 "로그를 변경 불가능하게 보관" -- S3 Object Lock "Knowledge Base 검색·InvokeAgent 호출 감사" -- CloudTrail 데이터 이벤트(고급 이벤트 선택기) "승인되지 않은 모델·리전 사용을 조직 전체에서 차단" -- SCP (모델 ARN, aws:RequestedRegion) "특정 가드레일 없는 추론 요청 거부" -- IAM 조건 키 bedrock:GuardrailIdentifier "관리 계정의 가드레일을 모든 계정에 강제" -- AWS Organizations의 Bedrock 정책 "코드 배포 없이 모델·프롬프트 버전 교체" -- AWS AppConfig (검증기 + 자동 롤백) "누가 어떤 프롬프트를 바꿨는지 추적" -- Bedrock Prompt Management 버전 + CloudTrail