TL;DR
이 글은 Amazon Bedrock AgentCore에 배포한 Strands 에이전트와 OAuth로 보호된 MCP 서버를 GitHub Actions에서 자동 평가하고, 점수가 0.8 아래로 떨어지면 PR을 차단하는 CI/CD 품질 게이트 구현을 안내합니다. CDK가 Cognito 사용자 풀, 에이전트 런타임, MCP 런타임과 IAM 리소스를 배포하고, 파이프라인은 client_credentials 흐름으로 M2M 토큰을 받아 에이전트를 호출한 뒤 CloudWatch의 OpenTelemetry trace를 AgentCore Evaluations에 전달합니다. MCP 서버는 AgentCore의 JWT 검증, Authorization 헤더 전달, FastMCP 미들웨어의 역할 검사라는 세 계층으로 인증을 처리하며, M2M 토큰은 역할 검사를 우회하고 사용자 토큰은 custom:roles에 따라 도구 접근을 제한합니다. GoalSuccessRate, Correctness, ToolSelectionAccuracy, ToolParameterAccuracy를 사용한 예제에서는 나쁜 system prompt가 0.0점과 PR 차단을 만들었고, 수정 후에는 0.9~1.0점으로 통과했지만 평가 지연, ARM64 이미지 요구 사항, LLM-as-a-judge의 점수 변동성과 비용을 함께 고려해야 합니다.
섹션별 상세
이미지 분석

다이어그램은 GitHub Actions가 Amazon Cognito에서 client_credentials 토큰을 받고 Bearer 토큰으로 AgentCore Runtime을 호출하는 흐름을 보여줍니다. 런타임 안에서는 Strands 에이전트가 FastMCP 서버로 토큰을 전달하고, Amazon Bedrock AgentCore Evaluations가 OpenTelemetry trace와 LLM-as-a-judge 결과를 이용해 PR 병합 또는 차단을 결정합니다.
GitHub Actions가 CDK 배포, M2M 토큰 발급, 에이전트 호출, 평가 실행을 차례로 거쳐 점수를 임계값과 비교하는 구조입니다.

OAuth가 없으면 IAM 인증을 사용하는 SDK 호출을 선택하고, OAuth가 있으면 역할 테스트 가능 여부와 CI에서 사용자 로그인을 자동화할 수 있는지에 따라 접근법이 갈립니다. 저장된 trace 방식은 라이브 호출 없이 평가하며, 서비스 계정 방식은 역할별 토큰을 사용하고, M2M 방식은 client_credentials로 서비스 간 인증을 처리하지만 역할 검사를 우회합니다.
OAuth 보호 여부와 역할 기반 도구 접근 테스트 필요성에 따라 세 가지 에이전트 평가 방식을 선택하는 의사결정 트리입니다.
용어 해설
- 품질 게이트(Quality Gate)
- — CI/CD 파이프라인에서 테스트 점수가 정해진 기준을 넘을 때만 다음 단계나 코드 병합을 허용하는 장치입니다. 이 글에서는 AgentCore 평가 점수가 예를 들어 1.0점 만점에 0.8 이상이어야 PR 병합을 진행하도록 구성합니다. 에이전트 변경 사항이 운영 환경에 도달하기 전에 성능 저하를 차단하는 역할을 합니다.
- LLM 평가자(LLM-as-a-judge)
- — LLM이 다른 에이전트의 응답이나 도구 호출 결과를 미리 정한 품질 기준에 따라 채점하는 평가 방식입니다. AgentCore Evaluations는 OpenTelemetry trace를 읽고 유용성, 정확성, 목표 달성률 같은 항목을 평가합니다. 같은 입력을 반복 평가할 때 점수가 달라질 수 있어 임계값에 여유를 둬야 합니다.
- OAuth 클라이언트 자격 증명 흐름(OAuth client_credentials)
- — 사용자 로그인 없이 서비스나 애플리케이션이 client ID와 client secret으로 액세스 토큰을 발급받는 OAuth 흐름입니다. 이 글에서는 GitHub Actions가 M2M 토큰을 받아 AgentCore 런타임을 호출하는 데 사용합니다. 사용자 역할 정보가 없는 토큰이므로 MCP 서버에서는 역할 검사를 우회하도록 별도 정책을 적용합니다.
- OpenTelemetry 트레이스(OpenTelemetry trace)
- — 에이전트 요청 하나가 처리되는 동안 발생한 호출과 도구 실행 흐름을 span들의 연결 구조로 기록한 관측 데이터입니다. AgentCore Evaluations는 단일 세션의 span 데이터를 받아 에이전트 응답과 도구 선택을 채점합니다. 여러 세션의 span을 한 API 호출에 섞으면 ValidationException이 발생합니다.
- 역할 기반 접근 제어(Role-based access control)
- — 사용자나 호출 주체의 역할에 따라 MCP 도구 사용 권한을 제한하는 방식입니다. 이 구현은 JWT 검증, Authorization 헤더 전달, custom:roles와 도구 메타데이터 비교라는 세 계층으로 권한을 처리합니다. M2M 토큰은 역할 클레임이 없어 모든 도구에 접근하고 사용자 토큰은 요구 역할을 충족해야 합니다.
코드 예제
def get_token() -> str:
"""Client-credentials grant"""
resp = http_requests.post(
os.environ["TOKEN_ENDPOINT"],
data={
"grant_type": "client_credentials",
"client_id": os.environ["OAUTH_CLIENT_ID"],
"client_secret": os.environ["OAUTH_CLIENT_SECRET"],
"scope": os.environ.get("OAUTH_SCOPE", ""),
},
)
resp.raise_for_status()
return resp.json()["access_token"]CI 파이프라인이 OAuth client_credentials 흐름으로 M2M 액세스 토큰을 발급받습니다.
def invoke_agent(agent_arn, session_id, prompt, region, token):
"""Invoke via HTTPS with Bearer token"""
escaped_arn = urllib.parse.quote(agent_arn, safe="")
url = f"https://bedrock-agentcore.{region}.amazonaws.com" \
f"/runtimes/{escaped_arn}/invocations?qualifier=DEFAULT"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": session_id,
}
resp = http_requests.post(url, headers=headers, data=json.dumps({"prompt": prompt}))
resp.raise_for_status()
return resp.json()OAuth로 보호된 AgentCore 런타임을 boto3 대신 Bearer 토큰을 포함한 HTTPS 요청으로 호출합니다.
results = Evaluation(region=region).run(
agent_id=agent_id,
session_id=session_id,
evaluators=[
"Builtin.GoalSuccessRate",
"Builtin.Correctness",
"Builtin.ToolSelectionAccuracy",
"Builtin.ToolParameterAccuracy",
],
output="evals_results/ci_output.json",
)Starter Toolkit의 Evaluation 클래스로 CloudWatch trace 수집과 네 가지 내장 평가를 한 번에 실행합니다.
request_header_configuration=CfnRuntime.RequestHeaderConfigurationProperty(
request_header_allowlist=["Authorization"]
)AgentCore 런타임이 호출자의 Authorization 헤더를 에이전트와 MCP 컨테이너까지 전달하도록 설정합니다.
- name: Run evaluation
working-directory: scripts
run: python3 agentcore_eval.py
env:
AGENT_RUNTIME_ARN: ${{ steps.cdk.outputs.agent_arn }}
EVAL_THRESHOLD: "0.8"GitHub Actions가 통합 평가 스크립트를 실행하고 0.8 임계값으로 PR 통과 여부를 결정합니다.
기술
- Amazon Bedrock AgentCore Runtime
- Amazon Bedrock AgentCore Evaluations
- Amazon Bedrock AgentCore Observability
- GitHub Actions
- Amazon Cognito
- AWS IAM
- AWS CDK
- Amazon CloudWatch Logs
- MCP
- Strands
- FastMCP
- PyJWT
- bedrock-agentcore-starter-toolkit
- Docker Buildx
- QEMU
- Microsoft Entra ID
활용 사례
- PR 병합 전 AI 에이전트 품질 회귀 차단
- OAuth 보호 MCP 도구를 호출하는 CI 에이전트 평가
- 도구 선택과 도구 파라미터 정확성 검증
- 저장된 OpenTelemetry trace를 이용한 배포 전 회귀 테스트
- 운영 에이전트의 online 평가와 추세 모니터링
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.