TL;DR
Intuit는 여러 AWS 리전에 걸친 서비스 failover에서 숙련된 on-call 엔지니어의 판단과 수동 콘솔 작업에 의존하던 부분을 줄이기 위해 Amazon Bedrock 기반 EWOK Agent를 구축했습니다. 이 구조에서 모델은 자연어 요청을 바탕으로 typed skill과 인자를 선택하고, 인증·감사·정책 검사를 거친 실제 상태 변경은 EWOK의 결정론적 executor가 수행합니다. YAML 스키마와 prompt body로 구성된 Skill은 Amazon Bedrock tool specification으로 변환되며, Amazon Bedrock Guardrails, typed success/error 결과, 반복 횟수 제한, circuit breaker가 실행 경계를 통제합니다. 기존 EWOK가 지원하는 workload의 복구 시간을 수 시간에서 약 20분으로 줄였다면, EWOK Agent는 자산 탐색과 workflow 선택, readiness check, change-freeze 예외 처리, 단계별 상태 보고까지 대화형 흐름으로 연결하면서도 production 승인에는 사람을 남겨 둡니다.
섹션별 상세

def to_tool_spec(skill) -> dict:
"""Compile a skill's declared schema into a Bedrock toolSpec."""
properties = {
name: {"type": field.type, "description": field.description}
for name, field in skill.input_schema.items()
}
required = [n for n, f in skill.input_schema.items() if f.required]
return {
"toolSpec": {
"name": skill.name,
"description": skill.description,
"inputSchema": {"json": {
"type": "object",
"properties": properties,
"required": required,
}},
}
}Skill의 typed schema를 Amazon Bedrock Converse API가 사용할 toolSpec으로 변환합니다.
client = ChatBedrockConverse(
model_id=config.model_id, # pluggable via config
guardrail_config={
"guardrailIdentifier": config.guardrail_id,
"guardrailVersion": config.guardrail_version,
"trace": "enabled",
},
)모델 ID와 Guardrails 설정을 하나의 ChatBedrockConverse client에 연결해 모든 모델 호출에 안전성 검사를 적용합니다.
def run(self, request: str) -> str:
messages = [HumanMessage(content=request)]
llm = self.client.bind_tools(
[to_tool_spec(s) for s in self.skills]
)
for _ in range(MAX_ITERATIONS):
response = llm.invoke([self.system_prompt, *messages])
messages.append(response)
stop_reason = response.response_metadata.get("stopReason")
if stop_reason == "end_turn":
return response.text() # final answer for the engineer
if stop_reason == "guardrail_intervened":
return response.text() # stop, don't retry past a guardrail
if stop_reason == "tool_use":
for call in response.tool_calls:
skill = self.skills_by_name[call["name"]]
result = skill.executor.execute(**call["args"])
messages.append(ToolMessage(
tool_call_id=call["id"],
content=result.data,
status="success" if result.success else "error",
))
raise MaxIterationsError(f"No resolution within {MAX_ITERATIONS} iterations")모델 호출, 종료 사유 판별, Skill executor 실행, 결과 재주입을 MAX_ITERATIONS 안에서 반복합니다.
용어 해설
- 재해 복구(Disaster Recovery)
- — 장애나 재난으로 서비스가 중단될 때 정상적인 보조 리전이나 인프라로 트래픽과 실행 상태를 전환하는 운영 체계입니다. 이 글에서는 여러 AWS 리전에 걸친 자산의 컴퓨팅, 데이터베이스, 캐시, 네트워크를 정해진 순서로 복구해 서비스 중단 시간을 줄이는 과정으로 사용됩니다.
- 에이전틱 루프(Agentic Loop)
- — 모델이 다음 행동을 선택하고, 도구 실행 결과를 다시 입력받아 후속 행동이나 종료를 결정하는 반복 제어 구조입니다. EWOK Agent에서는 Amazon Bedrock Converse API가 모델 호출과 도구 선택을 담당하고, 반복 횟수와 종료 조건을 제한해 복구 요청이 무한히 실행되지 않도록 합니다.
- 도구 사용(Tool Use)
- — 언어 모델이 자연어 응답 대신 등록된 함수나 도구의 이름과 인자를 구조화된 형식으로 반환하는 기능입니다. EWOK Agent는 YAML 스키마를 Amazon Bedrock tool specification으로 변환해 모델이 자산과 환경을 선택하게 하며, 실제 상태 변경은 인증된 executor가 수행합니다.
- 정책 게이트(Policy Gate)
- — 기술적으로 실행 가능한 작업이라도 조직의 운영 규정이나 변경 관리 조건을 만족하는지 확인하는 제어 지점입니다. 예를 들어 변경 동결 기간의 failover를 incident number나 긴급 사유 없이 차단하고, 승인된 경우에만 다음 실행 단계로 넘깁니다.
- 변경 기록(Change Record)
- — 운영 환경의 변경을 승인하고 실행 과정을 추적하기 위해 변경 관리 시스템에 남기는 공식 기록입니다. EWOK는 production workflow가 시작될 때 기록을 만들고 실행이 끝나면 닫아, failover가 사람의 작업과 같은 감사 추적과 승인 절차를 거치도록 합니다.
기술
- Amazon Bedrock
- Amazon Bedrock Guardrails
- Amazon Bedrock Converse API
- Amazon Bedrock AgentCore
- Amazon Bedrock AgentCore Observability
- LangChain
- langchain-aws
- ChatBedrockConverse
- Boto3
- Python
- Model Context Protocol
- AWS Identity and Access Management
- Amazon CloudWatch
- AWS Lambda
- AWS CloudFormation
- Kubernetes
- Amazon EC2
- Amazon API Gateway
- Amazon Aurora
- Amazon ElastiCache
활용 사례
- 여러 AWS Region에 분산된 microservice의 production failover
- compute·database·cache·traffic 계층을 포함한 재해 복구 orchestration
- change-freeze 기간의 정책 예외가 포함된 운영 복구
- Engineering portal과 IDE에서 수행하는 대화형 failover
- 감사 가능한 production 인프라 작업을 수행하는 tool-using agent
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.