TL;DR
TReNDS는 Amazon Bedrock과 Strands Agents SDK를 결합해 CloudWatch에서 오류를 감지하면 Lambda가 Strands 에이전트를 실행하고, 에이전트가 추가 로그와 GitHub 소스 코드를 읽어 근본 원인을 추적한 뒤 SNS로 구조화된 분석을 전달하는 파이프라인을 운영합니다. 핵심은 모델이 fetch_source_code·fetch_log_context 같은 도구를 자율적으로 호출해 멀티파일 호출 체인과 미묘한 코드 결함까지 추적하는 agentic 조사 루프입니다. 배포 이후 평균 조사 시간은 15~30분에서 1분 이하로 감소했고, 모델 호출 비용은 엔지니어 시간에 비해 매우 낮아 실무 적용 가치가 확인되었습니다.
섹션별 상세

용어 해설
- CloudWatch 구독 필터(CloudWatch subscription filter)
- — CloudWatch 로그 스트림에서 ERROR/Exception/FATAL 등 패턴을 감지해 Lambda로 매칭된 로그 이벤트를 전달하는 기능으로, 로그 기반 실시간 트리거를 구현할 때 사용하는 표준 방식입니다.
- Strands 에이전트(Strands Agent)
- — Strands Agents SDK를 통해 정의한 도구(tool)를 호출하며 자율적으로 도구 사용과 탐색을 결정하는 에이전트 실행 로직으로, 모델이 로그·코드·외부 도구를 조합해 조사 루프를 수행합니다.
- Amazon Bedrock
- — 다수의 foundation model에 대해 통합 API로 접근하게 해주는 AWS 서비스로, TReNDS 사례에서는 모델 호출과 도구 오케스트레이션의 추론 엔진 역할을 맡습니다.
- FluentBit
- — 컨테이너 로그를 수집하여 CloudWatch Logs로 전송하는 경량 로그 수집기이며, EKS 환경에서 stdout/stderr 파이프라인을 구성할 때 사용됩니다.
- Amazon SNS
- — 에이전트가 생성한 구조화된 분석 결과를 이메일·Slack 등으로 팬아웃 전달하는 퍼블리셔로 사용되는 메시징 서비스입니다.
코드 예제
import base64
import boto3
import requests
from strands import Agent, tool
# Retrieve the GitHub token from AWS Secrets Manager
secrets_client = boto3.client("secretsmanager")
github_token = secrets_client.get_secret_value(
SecretId="trends/github-token"
)["SecretString"]
@tool
def fetch_source_code(file_path: str, repo: str) -> str:
"""Fetch a source file from a GitHub repository.
Args: file_path: Path to the file in the repository repo: Repository in 'owner/repo' format
"""
response = requests.get(
f"https://api.github.com/repos/{repo}/contents/{file_path}",
headers={"Authorization": f"token {github_token}"}
)
if response.status_code != 200:
return f"Could not fetch {file_path} from {repo}: HTTP {response.status_code}"
content = base64.b64decode(response.json()["content"])
return content.decode("utf-8")에이전트가 스택 트레이스에서 파일 경로와 라인 번호를 발견했을 때 해당 소스 파일을 GitHub에서 읽어 오는 도구입니다. 함수의 docstring과 타입 힌트는 Strands가 모델에게 도구의 입력과 출력을 전달하는 데 사용되며, 모델이 언제 이 도구를 호출할지 스스로 결정합니다. 이 도구 덕분에 에이전트는 단순한 로그 패턴 매칭을 넘어서 코드 흐름을 추적할 수 있습니다.
@tool
def fetch_log_context(log_group: str, log_stream: str, timestamp: int, window_seconds: int = 30) -> str:
"""Fetch log lines from the same log stream surrounding an error.
Args: log_group: CloudWatch Log Group name
log_stream: Log stream that produced the error
timestamp: Error event timestamp in milliseconds
window_seconds: Time window before and after the error
"""
response = logs_client.filter_log_events(
logGroupName=log_group,
logStreamNames=[log_stream],
startTime=timestamp - (window_seconds * 1000),
endTime=timestamp + (window_seconds * 1000),
)
events = response.get("events", [])
if not events:
return f"No log events found in {log_stream} within {window_seconds}s of the error."
return "
".join(e["message"] for e in events)CloudWatch에서 전달된 단일 매칭 라인만으로는 원인 규명에 충분하지 않을 때 같은 로그 스트림에서 전후 맥락을 가져와 전체 스택 트레이스와 요청 흐름을 확보하는 도구입니다. log_stream으로 범위를 한정하면 동시성으로 인한 노이즈를 줄이고 동일 컨테이너의 연속된 이벤트를 시간순으로 얻을 수 있습니다. 에이전트는 이 로그 맥락을 바탕으로 추가 도구 호출과 코드 검색 우선순위를 결정합니다.
기술
- Amazon Bedrock
- Strands Agents SDK
- Anthropic Claude Sonnet
- Amazon CloudWatch
- AWS Lambda
- Amazon SNS
- Amazon EKS
- FluentBit
- GitHub
- Amazon DynamoDB
활용 사례
- 운영 중인 마이크로서비스에서 발생한 예외를 자동으로 조사해 근본 원인과 관련 소스 코드 컨텍스트·수정 제안을 즉시 제공하는 경우입니다. 에이전트는 스택 트레이스의 경로를 따라 관련 파일을 열람하고 전후 로그를 취합해 실행 흐름을 재구성하므로 엔지니어의 진단 시간을 크게 단축합니다. 이 케이스는 특히 여러 서비스가 얽힌 복합 오류에서 효과가 큽니다.
- 대규모 오류 발생 시 저비용·고속 우선 처리 루트를 만들어 간단한 패턴은 경량 모델로, 복잡한 사례는 고성능 모델로 자동 라우팅해 비용과 응답성을 최적화하는 티어드 triage 워크플로우입니다. Strands와 Bedrock의 모델 교체 용이성 덕분에 모델 기반 정책을 운영적으로 적용하기가 용이합니다. 결과적으로 비용 제약이 있는 팀도 필수적인 자동화를 도입할 수 있습니다.
- 에이전트가 수정 제안을 바탕으로 자동으로 GitHub 이슈를 생성하고 PR까지 열어둬 문제 발견에서 수정 배포까지 인간 개입을 줄이는 워크플로우입니다. 논리적 수정 제안이 신뢰할 수준에 도달하면 수작업을 생략해 릴리스 사이클을 단축할 수 있습니다. TReNDS는 이 단계의 자동화를 향후 로드맵으로 계획하고 있습니다.
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.