AICosmus

Where tech meets the everyday — AI, fintech, swimming, and cars.
Claude Code 24/7 운영 관제 센터 일러스트

[Claude Code, 끝까지 써보기] 6/6화: Claude Code 원격 제어·클라우드·관측 완전 가이드 — 24/7 운영 실전

시리즈를 마무리하며 — 에이전트를 “서비스”로 바꾸는 마지막 퍼즐

1편에서 코어 메커니즘을 해부하고, 2편에서 슬래시 커맨드로 세션을 다스리며, 3편에서 MCP·플러그인·스킬로 외연을 넓혔습니다. 4편(상)에서는 Hooks로 에이전트에 안전망을 씌웠고, 4편(하)에서는 Subagent 오케스트레이션으로 1인 다역 체계를 구축했죠. 이 모든 기능이 결국 향하는 곳은 하나입니다 — “사람이 자리를 비워도 에이전트가 일을 계속하는 환경”. 오늘 다룰 Remote Control, Cloud 환경, 샌드박스 보안, 그리고 관측(Observability)은 바로 그 24/7 운영을 실현하는 인프라 계층입니다.

이 글을 읽고 나면, Claude Code를 터미널에서 꺼내 CI 파이프라인·모바일 알림·스케줄 잡으로 연결하고, 비용과 실패 패턴까지 대시보드로 추적하는 전체 그림을 그릴 수 있게 될 것입니다.

Remote Control vs Channels vs Dispatch 비교 다이어그램

1. Remote Control — 터미널 밖에서 에이전트를 조종하다

1-1. Remote Control이 필요한 순간

Claude Code는 기본적으로 인터랙티브 터미널 세션입니다. 하지만 현실에서는 터미널 앞에 앉아 있지 않은 상태에서 에이전트를 제어해야 하는 경우가 빈번합니다. CI/CD 파이프라인에서 PR을 자동 리뷰하거나, 모바일에서 긴급 패치를 지시하거나, 슬랙 봇이 이슈를 받아 자동으로 코드를 생성하는 시나리오가 대표적입니다.

Anthropic은 이를 위해 세 가지 원격 제어 메커니즘을 제공합니다: Remote Control, Channels, Dispatch. 이 셋은 추상화 수준과 사용 맥락이 다릅니다.

1-2. Remote Control API — 로컬 에이전트의 HTTP 인터페이스

Remote Control은 이미 실행 중인 Claude Code 세션에 HTTP로 메시지를 주입하는 메커니즘입니다. --remote-control 플래그로 세션을 시작하면, 로컬에 경량 HTTP 서버가 함께 뜹니다.

# 세션 시작 시 Remote Control 활성화
claude --remote-control

# 별도 터미널에서 메시지 전송
curl -X POST http://localhost:19785/message \
  -H "Content-Type: application/json" \
  -d '{"message": "src/auth.ts 파일의 JWT 검증 로직을 리팩터링해줘"}'

핵심 포인트를 정리하면 다음과 같습니다:

  • 로컬 전용: 기본적으로 localhost에만 바인딩됩니다. 보안상 외부 노출은 권장되지 않습니다.
  • 양방향 통신: WebSocket 업그레이드를 지원해 스트리밍 응답을 실시간으로 받을 수 있습니다.
  • 세션 유지: 기존 세션의 컨텍스트가 그대로 유지되므로, 이전 대화를 이어서 작업 지시가 가능합니다.
  • 권한 계승: 세션 시작 시 설정한 권한 모드(Plan/Auto/Default)가 원격 명령에도 동일하게 적용됩니다.

Remote Control의 진짜 힘은 다른 프로그램이 Claude Code를 도구로 사용할 수 있게 만든다는 점입니다. 예를 들어 슬랙 봇이 사용자 메시지를 받아 Remote Control API로 전달하고, 응답을 다시 슬랙에 포스팅하는 구조가 가능합니다.

1-3. Channels — 지속적 연결 파이프

Remote Control이 “이미 떠 있는 세션에 메시지를 보내는 것”이라면, Channels는 에이전트와 외부 시스템 사이에 지속적인 양방향 파이프를 설정하는 개념입니다.

# 채널을 통한 세션 시작
claude --channel slack-ops \
       --channel-config '{"webhook":"https://hooks.slack.com/...", "thread_ts":"..."}'

Channels의 핵심 특성은 다음과 같습니다:

  • Named Channel: 채널에 이름을 부여해 여러 외부 시스템을 동시에 연결할 수 있습니다. 하나의 에이전트가 Slack, GitHub, Jira 채널을 동시에 리슨하는 구조입니다.
  • 이벤트 기반 트리거: 외부 시스템에서 이벤트가 발생하면 자동으로 에이전트에 전달됩니다.
  • 응답 라우팅: 에이전트의 응답이 원래 채널로 자동 라우팅됩니다. Slack에서 온 질문은 Slack으로, GitHub에서 온 리뷰 요청은 GitHub PR 코멘트로 돌아갑니다.
  • 세션 격리: 채널별로 독립 세션을 유지할 수 있어, 한 채널의 컨텍스트가 다른 채널을 오염시키지 않습니다.

Remote Control과 Channels의 관계를 비유하면, Remote Control은 “무전기로 한 마디 보내는 것”이고, Channels은 “전화선을 개설하는 것”입니다.

1-4. Dispatch — 에이전트를 원격에서 생성하고 관리하기

Dispatch는 가장 높은 수준의 추상화입니다. 에이전트 세션 자체를 프로그래밍적으로 생성·관리·종료합니다.

# Dispatch API로 새 에이전트 세션 생성
curl -X POST https://api.anthropic.com/v1/claude-code/dispatch \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "task": "PR #142의 변경사항을 리뷰하고 코멘트를 남겨줘",
    "repo": "https://github.com/myorg/myrepo",
    "ref": "feature/auth-refactor",
    "permissions": "plan",
    "timeout_minutes": 30,
    "on_complete": {
      "webhook": "https://myserver.com/hooks/dispatch-done"
    }
  }'

Dispatch의 핵심 가치는 “에이전트 팜(Agent Farm)” 구축입니다:

  • 온디맨드 생성: 필요할 때 에이전트를 띄우고, 작업이 끝나면 자동 정리합니다.
  • 병렬 실행: 여러 Dispatch를 동시에 발행해 PR 10개를 병렬 리뷰하거나, 모노레포의 패키지별 테스트를 동시 실행합니다.
  • 상태 추적: 각 Dispatch에 고유 ID가 부여되어, 진행 상황 조회·중단·재시작이 가능합니다.
  • 결과 수집: 완료 시 웹훅으로 결과를 받거나, 폴링으로 상태를 확인합니다.

세 메커니즘을 정리하면 다음과 같습니다:

메커니즘 세션 관리 통신 방식 주요 용도
Remote Control 기존 세션 활용 로컬 HTTP IDE 통합, 로컬 자동화
Channels 기존 세션 + 채널 추가 양방향 파이프 Slack/GitHub 연동
Dispatch 새 세션 생성 클라우드 API CI/CD, 에이전트 팜

1-5. 모바일·CI 환경에서의 실전 활용

모바일 제어 시나리오: Anthropic Console 모바일 앱 또는 Telegram 봇을 통해 Dispatch API를 호출하는 구조를 만들 수 있습니다. 출퇴근 지하철에서 “오늘 들어온 이슈 3건 분석해줘”라고 메시지를 보내면, 클라우드의 에이전트가 작업을 수행하고 결과를 다시 모바일로 보내주는 워크플로우입니다.

CI 환경 시나리오: GitHub Actions에서 Dispatch를 호출하는 패턴이 특히 강력합니다.

# .github/workflows/claude-review.yml
name: Claude Code PR Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropic/claude-code-action@v1
        with:
          api-key: ${{ secrets.ANTHROPIC_API_KEY }}
          task: |
            이 PR의 변경사항을 리뷰해줘.
            보안 취약점, 성능 이슈, 코드 스타일을 확인하고
            라인별 코멘트를 남겨줘.
          permissions: plan
          timeout: 15m

이 GitHub Action은 내부적으로 Dispatch API를 사용합니다. PR이 열리거나 업데이트될 때마다 자동으로 에이전트가 리뷰를 수행하고, 결과를 PR 코멘트로 남깁니다.

2. Scheduled Tasks와 Cloud 환경 — 무인 자동화의 핵심

Scheduled Tasks와 Cloud Auto-fix 워크플로우

2-1. Scheduled Tasks — 반복 작업의 자동화

2편에서 /schedule 커맨드를 소개했었는데, 이번에는 그것이 실제로 어떤 인프라 위에서 돌아가는지를 깊이 파고듭니다.

Scheduled Tasks는 크게 두 가지 실행 환경을 가집니다:

  • 로컬 스케줄링: /schedule로 등록한 태스크가 로컬 머신의 cron 데몬(Linux/macOS) 또는 Task Scheduler(Windows)에 등록됩니다. 머신이 꺼지면 실행되지 않습니다.
  • Anthropic-managed 클라우드 스케줄링: 태스크를 Anthropic의 관리형 인프라에서 실행합니다. 24/7 보장이 필요한 작업에 적합합니다.
# 로컬 스케줄링 — 매일 오전 9시 보안 스캔
/schedule "daily-security" --cron "0 9 * * *" \
  --task "프로젝트의 의존성 보안 취약점을 스캔하고 리포트를 생성해줘"

# 클라우드 스케줄링 — 매시간 모니터링
/schedule "hourly-health" --cron "0 * * * *" \
  --cloud \
  --task "프로덕션 로그에서 에러 패턴을 분석하고, 
         임계값 초과 시 Slack #alerts에 알림을 보내줘" \
  --on-failure "webhook:https://myserver.com/schedule-fail"

2-2. Anthropic-managed 클라우드 환경의 구조

클라우드 스케줄링을 선택하면, 태스크는 Anthropic이 관리하는 격리된 컨테이너 환경에서 실행됩니다. 이 환경의 특성을 이해하는 것이 중요합니다:

  • 에피메럴 환경: 태스크마다 새로운 컨테이너가 생성되고, 완료 후 파기됩니다. 상태를 유지하려면 외부 스토리지(S3, Git 등)에 명시적으로 저장해야 합니다.
  • 레포지토리 클론: 지정한 Git 레포지토리를 자동으로 클론한 뒤 작업을 수행합니다. SSH 키나 토큰은 암호화된 시크릿 스토어에서 주입됩니다.
  • 네트워크 제한: 기본적으로 외부 네트워크 접근이 제한되며, 허용 목록(allowlist)에 등록된 엔드포인트만 접근 가능합니다.
  • 리소스 제한: CPU, 메모리, 실행 시간에 상한이 있습니다. 기본 타임아웃은 30분이며, 최대 2시간까지 확장 가능합니다.

2-3. Cloud Auto-fix — 무인 PR 워크플로우의 완성

Cloud Auto-fix는 Scheduled Tasks와 Dispatch를 결합한 고급 패턴입니다. CI에서 테스트가 실패하면, 자동으로 에이전트가 수정을 시도하고 새 커밋을 푸시하는 구조입니다.

# settings.json — Cloud Auto-fix 설정
{
  "cloud": {
    "autofix": {
      "enabled": true,
      "triggers": ["ci_failure", "security_alert", "dependency_update"],
      "max_attempts": 3,
      "branch_prefix": "claude/autofix-",
      "require_review": true,
      "allowed_file_patterns": ["src/**", "tests/**"],
      "blocked_file_patterns": [".env*", "*.key", "infrastructure/**"]
    }
  }
}

이 설정이 활성화되면 다음과 같은 흐름이 자동으로 진행됩니다:

  1. CI 파이프라인에서 테스트 실패 이벤트 발생
  2. 웹훅이 Dispatch API를 호출해 Auto-fix 에이전트 생성
  3. 에이전트가 실패 로그를 분석하고 수정 코드 작성
  4. claude/autofix-{issue-id} 브랜치에 커밋·푸시
  5. 자동으로 PR 생성 (require_review: true이므로 사람의 승인 필요)
  6. PR이 승인·머지되면 원본 CI가 다시 실행

핵심은 require_review: true입니다. 완전 무인이 아니라 “사람의 승인”이라는 관문을 유지하면서도, 수정 코드 작성이라는 노동 집약적 단계를 자동화하는 것입니다.

2-4. Scheduled Tasks + Subagents + Hooks 결합 패턴

이전 편에서 다룬 Subagents와 Hooks를 Scheduled Tasks와 결합하면, 진정한 무인 운영 체계가 완성됩니다.

# CLAUDE.md — 야간 무인 운영 설정
## Scheduled Maintenance Agent
이 프로젝트에는 야간 유지보수 스케줄이 등록되어 있습니다.

### 태스크 목록
1. **의존성 업데이트** (매주 월요일 02:00)
   - Subagent "dependency-checker"가 outdated 패키지 스캔
   - Subagent "test-runner"가 업데이트 후 전체 테스트 실행
   - Hook: PostToolUse에서 breaking change 감지 시 롤백

2. **코드 품질 리포트** (매일 06:00)
   - 정적 분석, 커버리지, 복잡도 지표 수집
   - Markdown 리포트 생성 → GitHub Wiki에 자동 업로드

3. **보안 스캔** (매일 03:00)
   - npm audit, Snyk, CodeQL 결과 통합
   - Critical/High 발견 시 Slack #security에 즉시 알림

이 구성에서 각 편의 기능이 어떻게 맞물리는지 보세요:

  • Scheduled Tasks(5편): 태스크 트리거와 실행 주기
  • Subagents(4편 하): 역할별 에이전트 분리로 효율적 처리
  • Hooks(4편 상): 안전장치와 자동 게이팅
  • MCP(3편): 외부 서비스(Slack, GitHub, Jira) 연동
  • 세션 관리(2편): /resume으로 이전 맥락 이어받기
  • 컨텍스트 운용(1편): 긴 작업에서의 /compact와 메모리 관리

3. 샌드박스 보안 모델 — 에이전트에게 자유를 주되, 울타리를 세우다

3-1. 왜 샌드박스가 필요한가

에이전트에게 코드 실행 권한을 주는 순간, 보안은 최우선 과제가 됩니다. 특히 --dangerously-skip-permissions나 Auto mode에서 에이전트가 임의의 명령을 실행할 수 있을 때, 한 줄의 rm -rf /가 시스템 전체를 날릴 수 있습니다. Claude Code의 샌드박스 모델은 이런 위험을 구조적으로 차단합니다.

3-2. PID Namespace 격리

Linux 환경에서 Claude Code는 PID namespace 격리를 사용합니다. 에이전트가 실행하는 모든 자식 프로세스는 별도의 PID 네임스페이스에서 생성됩니다.

# 에이전트가 실행한 프로세스의 실제 격리 상태
$ cat /proc/self/status | grep NSpid
NSpid:  12345   1

# 에이전트의 자식 프로세스는 호스트의 다른 프로세스를 볼 수 없음
$ ps aux  # 에이전트 컨텍스트 내에서
PID  USER  COMMAND
1    claude  /bin/bash
15   claude  node src/index.js
23   claude  npm test

이것이 의미하는 바는 명확합니다:

  • 에이전트가 kill -9을 실행해도 자신의 네임스페이스 안의 프로세스만 영향을 받습니다.
  • 호스트 시스템의 프로세스 목록을 열람할 수 없어 정보 유출이 차단됩니다.
  • 에이전트가 종료되면 네임스페이스 전체가 정리되어 좀비 프로세스가 남지 않습니다.

3-3. Child Process Sandbox

PID 격리 위에, Claude Code는 자식 프로세스에 추가적인 샌드박스를 적용합니다. 이는 seccomp-bpf(Linux) 또는 Sandbox(macOS)를 활용합니다.

# 샌드박스 정책 예시 (내부 구현, 개념 설명용)
{
  "sandbox_policy": {
    "filesystem": {
      "read": ["/workspace/**", "/tmp/**", "/usr/lib/**"],
      "write": ["/workspace/**", "/tmp/**"],
      "deny": ["/etc/shadow", "/root/**", "~/.ssh/**"]
    },
    "network": {
      "allow_outbound": ["443", "80", "22"],
      "deny_inbound": true,
      "deny_raw_sockets": true
    },
    "process": {
      "max_children": 50,
      "max_memory_mb": 4096,
      "max_cpu_seconds": 600,
      "deny_ptrace": true
    }
  }
}

이 정책의 핵심 원칙은 “최소 권한(Least Privilege)”입니다:

  • 파일시스템: 작업 디렉터리와 임시 디렉터리만 쓰기 가능. 시스템 설정 파일이나 SSH 키는 읽기조차 차단됩니다.
  • 네트워크: 아웃바운드 HTTPS/HTTP/SSH만 허용. 인바운드 연결과 raw socket(패킷 스니핑)은 차단됩니다.
  • 프로세스: 포크 폭탄 방지를 위한 자식 프로세스 수 제한, 메모리/CPU 상한 설정, ptrace(디버거 attach) 차단.

3-4. OS CA 신뢰와 네트워크 보안

Claude Code가 외부 서비스(GitHub, npm registry, MCP 서버 등)와 통신할 때의 TLS 처리도 보안 모델의 중요한 부분입니다.

OS CA 신뢰(OS Certificate Authority Trust)란, Claude Code가 HTTPS 연결 시 운영체제의 CA 인증서 저장소를 신뢰한다는 의미입니다. 이것이 왜 중요한지 살펴보겠습니다:

  • 기업 환경 호환성: 기업 내부에서 자체 CA를 사용하는 경우(사내 프록시, 사설 레지스트리 등), OS CA 저장소에 해당 CA 인증서를 추가하면 Claude Code도 자동으로 신뢰합니다. 별도의 설정이 필요 없습니다.
  • 중간자 공격 방지: 신뢰되지 않는 인증서를 사용하는 연결은 차단됩니다. 에이전트가 악의적인 MCP 서버에 연결되는 것을 방지합니다.
  • 인증서 고정(Pinning) 없음: Anthropic API 연결에 대해 인증서 고정을 하지 않아, 기업 TLS 검사(inspection) 프록시와 호환됩니다.
# 기업 환경에서 사내 CA 추가 예시
# 1. OS CA 저장소에 사내 CA 추가 (Ubuntu)
sudo cp internal-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

# 2. Claude Code는 자동으로 사내 CA를 신뢰
# 별도 설정 불필요 — OS CA 저장소를 그대로 따름

# 3. NODE_EXTRA_CA_CERTS 환경변수도 지원
export NODE_EXTRA_CA_CERTS=/path/to/internal-ca.crt

3-5. 보안 계층의 전체 구조

Claude Code의 보안은 단일 메커니즘이 아니라 다층 방어(Defense in Depth)로 구성됩니다. 1편에서 다룬 입력·출력 이중 분류기부터 시작해, 이번 편의 샌드박스까지 전체 계층을 정리하겠습니다:

Claude Code 다층 보안 모델 인포그래픽
  • Layer 1 — 입력 분류기: 프롬프트 인젝션, 악의적 지시 필터링 (1편)
  • Layer 2 — 권한 모드: Plan/Default/Auto 모드별 도구 사용 제한 (1편)
  • Layer 3 — Hooks: PreToolUse/PostToolUse에서 커스텀 검증 (4편 상)
  • Layer 4 — 샌드박스: PID 격리, 파일시스템/네트워크 제한 (5편)
  • Layer 5 — 출력 분류기: 생성된 코드·명령의 위험도 평가 (1편)
  • Layer 6 — 감사 로그: 모든 도구 호출과 결과의 기록 (5편)

이 6개 계층 중 어느 하나가 뚫려도, 나머지 계층이 안전망으로 작동합니다. 이것이 에이전트 보안의 핵심 철학입니다.

4. OpenTelemetry와 Enterprise Analytics — 에이전트를 관측하다

4-1. 관측 가능성(Observability)이 왜 중요한가

“측정할 수 없으면 관리할 수 없다”는 피터 드러커의 격언은 에이전트 운영에도 그대로 적용됩니다. 특히 24/7 무인 운영에서는 다음 질문에 답할 수 있어야 합니다:

  • 에이전트가 하루에 API 토큰을 얼마나 소비하는가?
  • 어떤 태스크가 가장 비용 효율적이고, 어떤 태스크가 돈을 낭비하는가?
  • 실패하는 패턴이 있는가? 특정 시간대, 특정 유형의 작업에서 실패율이 높은가?
  • Subagent 간 작업 분배가 균형 잡혀 있는가?

4-2. OpenTelemetry 통합 — 표준 관측 프레임워크

Claude Code는 OpenTelemetry(OTel) 표준을 지원합니다. OTel은 분산 시스템의 트레이스, 메트릭, 로그를 수집하는 CNCF 표준 프레임워크입니다.

# OpenTelemetry 수집기 설정
# settings.json
{
  "telemetry": {
    "enabled": true,
    "exporter": "otlp",
    "endpoint": "http://otel-collector:4317",
    "protocol": "grpc",
    "headers": {
      "Authorization": "Bearer ${OTEL_AUTH_TOKEN}"
    },
    "resource_attributes": {
      "service.name": "claude-code",
      "service.version": "1.0.0",
      "deployment.environment": "production",
      "team.name": "platform-engineering"
    },
    "sampling": {
      "strategy": "parentbased_traceidratio",
      "ratio": 1.0
    }
  }
}

Claude Code가 내보내는 OTel 데이터의 구조를 살펴보겠습니다:

Traces (분산 추적):

# 트레이스 구조 예시
Trace: session-abc123
├── Span: user_prompt "PR 리뷰해줘"
│   ├── Span: tool_call "Read" (src/auth.ts)
│   │   └── Attribute: file_size=2048, duration_ms=15
│   ├── Span: tool_call "Grep" (pattern="password")
│   │   └── Attribute: matches=3, duration_ms=42
│   ├── Span: subagent_dispatch "security-reviewer"
│   │   ├── Span: tool_call "Bash" (npm audit)
│   │   │   └── Attribute: exit_code=1, vulnerabilities=2
│   │   └── Span: tool_call "Write" (security-report.md)
│   └── Span: api_call "claude-opus-4-6"
│       └── Attribute: input_tokens=15234, output_tokens=3421, 
│                       cache_hit_tokens=12000, cost_usd=0.087

각 스팬(Span)은 하나의 작업 단위를 나타냅니다. 도구 호출, API 호출, 서브에이전트 실행 등이 모두 스팬으로 기록되어 전체 작업 흐름을 추적할 수 있습니다.

Metrics (지표):

# Claude Code가 내보내는 주요 메트릭
claude_code_session_duration_seconds        # 세션 지속 시간
claude_code_tool_calls_total                # 도구 호출 횟수 (도구별 레이블)
claude_code_api_tokens_used_total           # API 토큰 사용량 (input/output별)
claude_code_api_cost_usd_total              # 누적 비용 (USD)
claude_code_prompt_cache_hit_ratio          # 프롬프트 캐시 적중률
claude_code_subagent_spawns_total           # 서브에이전트 생성 횟수
claude_code_tool_errors_total               # 도구 실행 에러 횟수
claude_code_hook_blocks_total               # 훅에 의한 차단 횟수
claude_code_sandbox_violations_total        # 샌드박스 위반 시도 횟수

이 메트릭들을 Prometheus로 수집하고 Grafana로 시각화하면, 에이전트 운영의 전체 상황을 한눈에 파악할 수 있습니다.

4-3. Grafana 대시보드 구성 예시

실전에서 유용한 대시보드 패널 구성을 소개합니다:

# Panel 1: 일별 비용 추이
# PromQL
sum(rate(claude_code_api_cost_usd_total[24h])) by (task_type)

# Panel 2: 도구별 호출 빈도 (Top 10)
# PromQL  
topk(10, sum(rate(claude_code_tool_calls_total[1h])) by (tool_name))

# Panel 3: 캐시 적중률 추이
# PromQL
claude_code_prompt_cache_hit_ratio

# Panel 4: 에러율 (도구별)
# PromQL
sum(rate(claude_code_tool_errors_total[1h])) by (tool_name)
/ sum(rate(claude_code_tool_calls_total[1h])) by (tool_name)

# Panel 5: 서브에이전트 작업 분포
# PromQL
sum(claude_code_subagent_spawns_total) by (agent_name)

알림 규칙 설정:

# Grafana Alert Rules
groups:
  - name: claude-code-alerts
    rules:
      - alert: HighCostAnomaly
        expr: |
          sum(rate(claude_code_api_cost_usd_total[1h])) > 5.0
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Claude Code 시간당 비용이 $5를 초과했습니다"
          
      - alert: HighErrorRate
        expr: |
          sum(rate(claude_code_tool_errors_total[15m]))
          / sum(rate(claude_code_tool_calls_total[15m])) > 0.3
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "도구 에러율이 30%를 초과했습니다"
          
      - alert: SandboxViolation
        expr: |
          increase(claude_code_sandbox_violations_total[5m]) > 0
        labels:
          severity: critical
        annotations:
          summary: "샌드박스 위반 시도가 감지되었습니다"

4-4. Enterprise Analytics API — 조직 수준의 분석

개별 세션의 관측을 넘어, 팀·조직 전체의 Claude Code 사용 패턴을 분석하는 것이 Enterprise Analytics API입니다.

# Enterprise Analytics API 호출 예시
curl -X POST https://api.anthropic.com/v1/enterprise/analytics \
  -H "Authorization: Bearer $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "date_range": {
      "start": "2026-05-01",
      "end": "2026-05-12"
    },
    "group_by": ["team", "task_type"],
    "metrics": [
      "total_sessions",
      "total_tokens",
      "total_cost",
      "avg_session_duration",
      "success_rate",
      "most_used_tools",
      "cache_efficiency"
    ]
  }'

응답 예시:

{
  "data": [
    {
      "team": "backend",
      "task_type": "code_review",
      "total_sessions": 342,
      "total_tokens": 12500000,
      "total_cost": 45.20,
      "avg_session_duration_minutes": 8.3,
      "success_rate": 0.94,
      "most_used_tools": ["Read", "Grep", "Edit"],
      "cache_efficiency": 0.72
    },
    {
      "team": "frontend",
      "task_type": "bug_fix",
      "total_sessions": 189,
      "total_tokens": 8900000,
      "total_cost": 32.10,
      "avg_session_duration_minutes": 15.7,
      "success_rate": 0.87,
      "most_used_tools": ["Read", "Bash", "Write"],
      "cache_efficiency": 0.58
    }
  ],
  "summary": {
    "total_cost": 234.50,
    "total_sessions": 1847,
    "org_cache_savings": 89.30
  }
}

이 데이터에서 읽어낼 수 있는 인사이트들입니다:

  • 비용 최적화: frontend 팀의 캐시 효율이 58%로 낮습니다. CLAUDE.md에 컨텍스트 관련 지시를 추가하거나, /compact 사용을 권장해 캐시 적중률을 높일 수 있습니다.
  • 성공률 개선: bug_fix 태스크의 성공률(87%)이 code_review(94%)보다 낮습니다. 실패 케이스를 분석해 프롬프트를 개선하거나, Subagent 구성을 조정할 수 있습니다.
  • 비용 귀속: 팀별, 태스크 유형별 비용을 정확히 추적해 예산 관리와 ROI 측정이 가능합니다.

4-5. 비용·사용량·실패 패턴 추적 실전

운영 수준의 관측을 위해 권장하는 추적 패턴을 정리하겠습니다.

패턴 1: 비용 이상 탐지

# 이동 평균 대비 이상치 탐지
# 지난 7일 평균 대비 200% 초과 시 알림
avg_over_time(
  sum(rate(claude_code_api_cost_usd_total[1h]))[7d:1h]
) * 2.0

갑자기 비용이 급증하는 패턴은 보통 무한 루프에 빠진 에이전트, 의도치 않은 대량 작업, 또는 컨텍스트 폭발(compact 미사용)이 원인입니다.

패턴 2: 실패 유형 분류

# Hook에서 실패 유형을 분류하는 패턴
# .claude/hooks/post-tool-use-analytics.sh
#!/bin/bash
TOOL_NAME=$(echo "$CLAUDE_TOOL_NAME")
EXIT_CODE=$(echo "$CLAUDE_TOOL_EXIT_CODE")

if [ "$EXIT_CODE" != "0" ]; then
  # OpenTelemetry Collector에 커스텀 메트릭 전송
  curl -s -X POST http://otel-collector:4318/v1/metrics \
    -H "Content-Type: application/json" \
    -d "{
      \"resourceMetrics\": [{
        \"scopeMetrics\": [{
          \"metrics\": [{
            \"name\": \"claude_code_tool_failure_detail\",
            \"sum\": {
              \"dataPoints\": [{
                \"attributes\": [
                  {\"key\": \"tool\", \"value\": {\"stringValue\": \"$TOOL_NAME\"}},
                  {\"key\": \"exit_code\", \"value\": {\"intValue\": $EXIT_CODE}}
                ],
                \"asInt\": 1
              }]
            }
          }]
        }]
      }]
    }"
fi

패턴 3: 세션 리플레이

모든 세션의 상세 이벤트를 기록해두면, 나중에 문제가 발생했을 때 해당 세션을 “리플레이”하며 원인을 분석할 수 있습니다.

# 세션 이벤트 로그 구조
{
  "session_id": "sess_abc123",
  "timestamp": "2026-05-12T09:15:23Z",
  "events": [
    {"type": "prompt", "content": "auth.ts 리팩터링해줘", "tokens": 24},
    {"type": "tool_call", "tool": "Read", "target": "src/auth.ts", "duration_ms": 12},
    {"type": "thinking", "tokens": 1523},
    {"type": "tool_call", "tool": "Edit", "target": "src/auth.ts", "duration_ms": 8},
    {"type": "tool_call", "tool": "Bash", "command": "npm test", "exit_code": 1, "duration_ms": 4523},
    {"type": "thinking", "tokens": 892},
    {"type": "tool_call", "tool": "Edit", "target": "src/auth.ts", "duration_ms": 6},
    {"type": "tool_call", "tool": "Bash", "command": "npm test", "exit_code": 0, "duration_ms": 3891},
    {"type": "response", "content": "리팩터링 완료...", "tokens": 342}
  ],
  "summary": {
    "total_tokens": 18423,
    "total_cost": 0.054,
    "tool_calls": 5,
    "errors": 1,
    "duration_seconds": 47
  }
}

5. 전체 아키텍처 — 모든 것을 연결하다

24/7 운영급 Claude Code 전체 아키텍처

5-1. 24/7 운영급 Claude Code 환경의 전체 그림

지금까지 다룬 모든 요소를 하나의 아키텍처로 통합하면 다음과 같습니다:

┌─────────────────────────────────────────────────────────────────┐
│                        트리거 계층                                │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌───────────────┐   │
│  │ CI/CD    │  │ Schedule │  │ Slack/   │  │ Mobile /     │   │
│  │ Webhook  │  │ (cron)   │  │ GitHub   │  │ Console App  │   │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └──────┬────────┘   │
│       │             │             │               │             │
│       └─────────────┴──────┬──────┴───────────────┘             │
│                            ▼                                     │
│  ┌─────────────────────────────────────────────────────┐        │
│  │           Dispatch / Remote Control / Channels       │        │
│  └──────────────────────┬──────────────────────────────┘        │
└─────────────────────────┼───────────────────────────────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                     에이전트 실행 계층                             │
│  ┌──────────────────────────────────────────────────────┐       │
│  │  Main Agent (CLAUDE.md + Memory + Context)            │       │
│  │  ┌─────────────┐ ┌─────────────┐ ┌────────────────┐  │       │
│  │  │ Subagent:   │ │ Subagent:   │ │ Subagent:      │  │       │
│  │  │ Reviewer    │ │ Tester      │ │ Security       │  │       │
│  │  └─────────────┘ └─────────────┘ └────────────────┘  │       │
│  └──────────────────────┬───────────────────────────────┘       │
│                         │                                        │
│  ┌──────────────────────┴───────────────────────────────┐       │
│  │                  Hooks 계층                           │       │
│  │  PreToolUse │ PostToolUse │ SubagentStop │ Stop       │       │
│  └──────────────────────┬───────────────────────────────┘       │
│                         │                                        │
│  ┌──────────────────────┴───────────────────────────────┐       │
│  │              샌드박스 계층                              │       │
│  │  PID Namespace │ seccomp-bpf │ FS/Network 격리        │       │
│  └──────────────────────────────────────────────────────┘       │
└─────────────────────────┼───────────────────────────────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                       확장 계층                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────┐   │
│  │ MCP      │  │ Plugins  │  │ Skills   │  │ Git /        │   │
│  │ Servers  │  │          │  │ (SKILL.md)│  │ External API │   │
│  └──────────┘  └──────────┘  └──────────┘  └──────────────┘   │
└─────────────────────────┼───────────────────────────────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                       관측 계층                                  │
│  ┌─────────────────┐  ┌─────────────────┐  ┌────────────────┐  │
│  │ OpenTelemetry   │  │ Enterprise      │  │ Audit Logs     │  │
│  │ (Traces/Metrics)│  │ Analytics API   │  │                │  │
│  └────────┬────────┘  └────────┬────────┘  └───────┬────────┘  │
│           └────────────────────┼────────────────────┘           │
│                                ▼                                 │
│  ┌──────────────────────────────────────────────────────┐       │
│  │  Grafana / Datadog / Custom Dashboard                 │       │
│  │  → 비용 추적, 에러 분석, 용량 계획, 팀별 사용량 리포트      │       │
│  └──────────────────────────────────────────────────────┘       │
└─────────────────────────────────────────────────────────────────┘

5-2. 운영 체크리스트

24/7 운영 환경을 구축할 때 확인해야 할 항목을 정리합니다:

보안:

  • API 키·토큰을 환경변수 또는 시크릿 매니저에서 주입하고 있는가?
  • 샌드박스 정책이 적절한 수준으로 설정되어 있는가?
  • Hooks에서 민감정보 마스킹이 동작하는가?
  • 에이전트의 Git 권한이 필요한 레포지토리로 제한되어 있는가?

비용:

  • 일/주/월 비용 상한이 설정되어 있는가?
  • 프롬프트 캐시 적중률을 모니터링하고 있는가?
  • 불필요한 컨텍스트 팽창을 /compact로 관리하고 있는가?
  • 서브에이전트별 모델 티어가 적절하게 배분되어 있는가?

신뢰성:

  • 실패 시 재시도 정책이 설정되어 있는가?
  • 타임아웃이 적절한 값으로 설정되어 있는가?
  • 에이전트 무한 루프 방지 장치(/loop의 max-iterations)가 있는가?
  • 실패 알림이 적시에 전달되는가?

관측:

  • OTel 수집기가 안정적으로 동작하는가?
  • 핵심 메트릭에 대한 알림 규칙이 설정되어 있는가?
  • 세션 로그가 충분한 기간 보관되는가?
  • 비용 이상 탐지가 동작하는가?

6. 실전 시나리오: 소규모 팀의 24/7 운영 구축기

6-1. 시나리오 설정

5명 규모의 스타트업 개발팀이 Claude Code를 팀 인프라로 도입하는 과정을 따라가 보겠습니다. 목표는 명확합니다: 코드 리뷰·테스트·보안 스캔·의존성 관리를 24/7 자동화.

6-2. 단계별 구축

1단계: CI 통합 (Day 1-2)

# .github/workflows/claude-ci.yml
name: Claude Code CI Integration
on:
  pull_request:
    types: [opened, synchronize, ready_for_review]

jobs:
  claude-review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          
      - uses: anthropic/claude-code-action@v1
        with:
          api-key: ${{ secrets.ANTHROPIC_API_KEY }}
          permissions: plan
          task: |
            이 PR을 리뷰해줘. 다음을 확인해:
            1. 코드 품질과 가독성
            2. 잠재적 버그
            3. 테스트 커버리지
            4. 보안 취약점
            결과를 PR 코멘트로 남겨줘.

2단계: Scheduled Tasks 등록 (Day 3-4)

# 보안 스캔 — 매일 새벽 3시
/schedule "nightly-security" --cron "0 3 * * *" --cloud \
  --task "npm audit과 Snyk 스캔을 실행하고, 
         Critical/High 취약점이 있으면 GitHub Issue를 생성해줘"

# 의존성 업데이트 — 매주 월요일 새벽 2시
/schedule "weekly-deps" --cron "0 2 * * 1" --cloud \
  --task "outdated 패키지를 확인하고, 
         minor/patch 업데이트는 자동으로 PR을 만들어줘.
         major 업데이트는 이슈로만 등록해줘"

# 코드 품질 리포트 — 매주 금요일 오후 6시
/schedule "weekly-quality" --cron "0 18 * * 5" --cloud \
  --task "이번 주의 코드 변경사항을 분석하고,
         기술 부채 리포트를 작성해서 팀 Slack #dev에 공유해줘"

3단계: 관측 인프라 구축 (Day 5-7)

# docker-compose.yml — 관측 스택
version: '3.8'
services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    ports:
      - "4317:4317"   # gRPC
      - "4318:4318"   # HTTP
    volumes:
      - ./otel-config.yml:/etc/otelcol-contrib/config.yaml

  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/dashboards:/var/lib/grafana/dashboards
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=secure-password

6-3. 1개월 후 운영 결과

이 구성을 1개월 운영한 후의 가상 결과를 살펴보겠습니다:

  • PR 리뷰 시간: 평균 4시간 → 15분 (자동 리뷰 완료까지)
  • 보안 취약점 발견: 월 2건 → 월 8건 (야간 스캔으로 빠른 발견)
  • 의존성 업데이트: 분기별 수동 → 주간 자동 (minor/patch)
  • 월간 비용: 약 $150 (팀원 1명의 리뷰 시간 절감 가치 대비 충분히 효율적)
  • 캐시 적중률: 초기 45% → 최적화 후 72% (CLAUDE.md 개선, /compact 활용)

7. 시리즈 마무리 — Claude Code, 끝까지 써본 소감

7-1. 6편을 관통하는 핵심 원칙

이 시리즈를 통해 Claude Code의 거의 모든 면을 살펴봤습니다. 6편에 걸친 여정에서 반복적으로 등장한 핵심 원칙을 정리합니다:

원칙 1: 점진적 자율성 확대

Plan mode에서 시작해 Default, Auto, 그리고 –dangerously-skip-permissions까지. 에이전트의 자율성은 한 번에 풀어주는 것이 아니라, 안전장치(Hooks, 샌드박스)를 확인하며 단계적으로 확대하는 것이 핵심입니다.

원칙 2: 구조화된 지시

CLAUDE.md, SKILL.md, 그리고 Named Subagents의 시스템 프롬프트까지. “잘 써둔 문서 한 장이 프롬프트 열 번보다 낫다”는 것을 반복적으로 확인했습니다.

원칙 3: 관측 없는 자동화는 도박

에이전트가 자동으로 일을 하게 만드는 것은 쉽습니다. 그것이 제대로 일을 하는지 확인하는 것이 어렵습니다. OTel, 감사 로그, 알림 — 이 관측 인프라 없이 24/7 운영은 눈 감고 운전하는 것과 같습니다.

원칙 4: 다층 방어

보안은 단일 장벽이 아니라 여러 겹의 방어선입니다. 입력 분류기, 권한 모드, Hooks, 샌드박스, 출력 분류기, 감사 로그 — 이 6개 계층이 겹겹이 쌓여야 안심할 수 있습니다.

7-2. 시리즈 전체 로드맵 회고

주제 핵심 takeaway
1편 코어 메커니즘 컨텍스트·권한·캐시를 이해하면 절반은 끝난다
2편 슬래시 커맨드 & 세션 30+개 커맨드를 외울 필요 없이 5개 카테고리로 분류
3편 MCP·플러그인·스킬 에이전트의 손발을 늘리는 확장 생태계
4편(상) Hooks 에이전트에 브레이크를 달아 안전하게 자동화
4편(하) Subagents 복잡한 작업은 역할 분리로 해결
5편 원격·클라우드·관측 터미널을 벗어나 24/7 운영급으로 격상

7-3. 다음 단계를 위한 제안

이 시리즈를 읽은 여러분이 바로 실천할 수 있는 로드맵입니다:

Week 1: 기반 다지기

  • CLAUDE.md를 프로젝트에 추가하고, 코딩 컨벤션·아키텍처 개요를 기록
  • Plan mode로 일주일간 사용하며 에이전트의 행동 패턴을 파악
  • /compact, /effort 등 기본 커맨드에 익숙해지기

Week 2: 확장하기

  • GitHub MCP 서버를 연결해 PR·이슈 자동화 시작
  • 자주 쓰는 워크플로우를 SKILL.md로 문서화
  • Default mode로 전환하며 자율성 한 단계 확대

Week 3: 자동화하기

  • CI에 Claude Code Action 추가 (PR 자동 리뷰)
  • Hooks로 커밋 메시지 검증, 보안 스캔 자동 삽입
  • Subagent 구성으로 복잡한 태스크 분업 시작

Week 4: 운영하기

  • OpenTelemetry 연동으로 사용량·비용 추적 시작
  • Scheduled Tasks로 야간 자동화 작업 등록
  • Grafana 대시보드로 팀 전체의 에이전트 활용 현황 가시화

7-4. 마치며

Claude Code를 “끝까지 써보기”라는 제목으로 시작한 이 여정을 마칩니다. 처음 터미널에서 claude 명령을 실행했을 때의 단순한 대화형 코딩 어시스턴트가, 이제는 CI/CD 파이프라인을 타고, 샌드박스 안에서 안전하게 코드를 실행하며, Grafana 대시보드에서 실시간으로 관측되는 24/7 운영급 시스템으로 변모했습니다.

물론, 이 모든 기능을 한꺼번에 도입할 필요는 없습니다. 중요한 것은 Claude Code가 “어디까지 갈 수 있는지”를 아는 것입니다. 그 지도가 있으면, 필요한 시점에 필요한 기능을 꺼내 쓸 수 있습니다. 이 시리즈가 그 지도 역할을 했기를 바랍니다.

읽어주셔서 감사합니다. 여러분의 Claude Code 여정에 이 시리즈가 유용한 가이드가 되었길 바랍니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Claude Code, 끝까지 써보기 (총 6화 중 6화)
이전 5화  (다음 차수는 아직 게시되지 않았습니다)

답글 남기기

Your email address will not be published. Required fields are marked *.

Warning: Undefined array key "cookies" in /var/www/html/wp-content/themes/personal-cv-resume/class/class-post-related.php on line 212
*
*

최신 댓글