mcpField
S
sre-engineer

sre-engineer

github.com/404kidwizクラウド・DevOps96 回インストール
リポジトリ

sre-engineer について

sre-engineer は、高可用性、拡張性、耐障害性を備えたシステムを構築・運用するチーム向けの SRE スキルです。SLO、エラーバジェット、インシデント対応、カオス実験、キャパシティ計画、オブザーバビリティを扱います。

主な機能

  1. 01SLO とエラーバジェットの定義
  2. 02インシデント調整と事後レビュー
  3. 03高可用性アーキテクチャの実践
  4. 04カオスエンジニアリング実験
  5. 05キャパシティ計画とオートスケーリング
  6. 06メトリクス、ログ、トレースの可観測性

活用シーン

  1. 01サービスの SLO とアラート閾値の設定
  2. 02インシデント対応とフォローアップの調整
  3. 03障害注入による耐障害性の検証
  4. 04キャパシティと可観測性の計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill sre-engineer

インストール後、Claude Code で/sre-engineerを入力して読み込まれたか確認します。

詳細

サイト信頼性エンジニア

目的

高可用性、スケーラビリティ、耐障害性を備えたシステムの構築と保守に関する、サイト信頼性エンジニアリングの専門知識を提供します。信頼性、可用性、パフォーマンスに重点を置き、SLO、エラーバジェット、インシデント管理、カオスエンジニアリング、キャパシティプランニング、オブザーバビリティプラットフォームを専門とします。

使用するタイミング

  • SLO(サービスレベル目標)とエラーバジェットの定義および実装
  • 検知 → 解決 → ポストモーテムに至るインシデント管理
  • 高可用性アーキテクチャの構築(マルチリージョン、耐障害性)
  • カオスエンジニアリング実験の実施(障害注入、レジリエンスのテスト)
  • キャパシティプランニングとオートスケーリング戦略
  • オブザーバビリティプラットフォームの実装(メトリクス、ログ、トレース)
  • トイル削減と自動化戦略の設計

クイックスタート

次の場合にこのスキルを呼び出します:

  • SLO(サービスレベル目標)とエラーバジェットの定義および実装
  • 検知 → 解決 → ポストモーテムに至るインシデント管理
  • 高可用性アーキテクチャの構築(マルチリージョン、耐障害性)
  • カオスエンジニアリング実験の実施(障害注入、レジリエンスのテスト)
  • キャパシティプランニングとオートスケーリング戦略
  • オブザーバビリティプラットフォームの実装(メトリクス、ログ、トレース)

次の場合は呼び出さないでください:

  • DevOps の自動化のみが必要な場合(CI/CD パイプラインには devops-engineer を使用)
  • アプリケーションレベルのデバッグ(debugger スキルを使用)
  • 信頼性の観点を伴わないインフラストラクチャのプロビジョニング(cloud-architect を使用)
  • データベースのパフォーマンスチューニング(database-optimizer を使用)
  • セキュリティインシデントへの対応(セキュリティ対応には incident-responder を使用)


コアワークフロー

ワークフロー 1:SLO の定義と実装

ユースケース: 新しいマイクロサービスの SLO 定義とモニタリングが必要な場合

ステップ 1:SLI(サービスレベル指標)の選定

# Service: User Authentication API
# Critical user journey: Login flow

SLI Candidates:
1. Availability (request success rate):
   Definition: (successful_requests / total_requests) * 100
   Measurement: HTTP 2xx responses vs 5xx errors
   Rationale: Core indicator of service health
   
2. Latency (response time):
   Definition: P99 response time \u003c 500ms
   Measurement: Time from request received → response sent
   Rationale: User experience directly impacted by slow logins
   
3. Correctness (authentication accuracy):
   Definition: Valid tokens issued / authentication attempts
   Measurement: JWT validation failures within 1 hour of issuance
   Rationale: Security and functional correctness

Selected SLIs for SLO:
- Availability: 99.9% (primary SLO)
- Latency P99: 500ms (secondary SLO)

ステップ 2:SLO 定義ドキュメント

# Authentication Service SLO

## Service Overview
- **Service**: User Authentication API
- **Owner**: Platform Team
- **Criticality**: Tier 1 (blocks all user actions)

## SLO Commitments

### Primary SLO: Availability
- **Target**: 99.9% availability over 28-day rolling window
- **Error Budget**: 0.1% = 40.3 minutes downtime per 28 days
- **Measurement**: `(count(http_response_code=2xx) / count(http_requests)) >= 0.999`
- **Exclusions**: Planned maintenance windows, client errors (4xx)

### Secondary SLO: Latency
- **Target**: P99 latency \u003c 500ms
- **Error Budget**: 1% of requests can exceed 500ms
- **Measurement**: `histogram_quantile(0.99, http_request_duration_seconds) \u003c 0.5`
- **Measurement Window**: 5-minute sliding window

## Error Budget Policy

### Budget Remaining Actions:
- **\u003e 50%**: Normal development velocity, feature releases allowed
- **25-50%**: Slow down feature releases, prioritize reliability
- **10-25%**: Feature freeze, focus on SLO improvement
- **\u003c10%**: Incident declared, all hands on reliability

### Budget Exhausted (0%):
- Immediate feature freeze
- Rollback recent changes
- Root cause analysis required
- Executive notification

## Monitoring and Alerting

**Prometheus Alerting Rules:**
```yaml
groups:
  - name: auth_service_slo
    interval: 30s
    rules:
      # Availability SLO alert
      - alert: AuthServiceSLOBreach
        expr: |
          (
            sum(rate(http_requests_total{service="auth",code=~"2.."}[5m]))
            /
            sum(rate(http_requests_total{service="auth"}[5m]))
          ) < 0.999
        for: 5m
        labels:
          severity: critical
          service: auth
        annotations:
          summary: "Auth service availability below SLO"
          description: "Current availability: {{ $value | humanizePercentage }}"
      
      # Error budget burn rate alert (fast burn)
      - alert: AuthServiceErrorBudgetFastBurn
        expr: |
          (
            1 - (
              sum(rate(http_requests_total{service="auth",code=~"2.."}[1h]))
              /
              sum(rate(http_requests_total{service="auth"}[1h]))
            )
          ) > 14.4 * (1 - 0.999)  # 2% of monthly budget in 1 hour
        for: 5m
        labels:
          severity: critical
          service: auth
        annotations:
          summary: "Auth service burning error budget at 14.4x rate"
          description: "At this rate, monthly budget exhausted in 2 days"
      
      # Latency SLO alert
      - alert: AuthServiceLatencySLOBreach
        expr: |
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket{service="auth"}[5m])) by (le)
          ) > 0.5
        for: 5m
        labels:
          severity: warning
          service: auth
        annotations:
          summary: "Auth service P99 latency above SLO"
          description: "Current P99: {{ $value }}s (SLO: 0.5s)"

ステップ 3:Grafana ダッシュボード

{
  "dashboard": {
    "title": "Auth Service SLO Dashboard",
    "panels": [
      {
        "title": "30-Day Availability SLO",
        "targets": [{
          "expr": "avg_over_time((sum(rate(http_requests_total{service=\"auth\",code=~\"2..\"}[5m])) / sum(rate(http_requests_total{service=\"auth\"}[5m])))[30d:5m])"
        }],
        "thresholds": [
          {"value": 0.999, "color": "green"},
          {"value": 0.995, "color": "yellow"},
          {"value": 0, "color": "red"}
        ]
      },
      {
        "title": "Error Budget Remaining",
        "targets": [{
          "expr": "1 - ((1 - avg_over_time((sum(rate(http_requests_total{service=\"auth\",code=~\"2..\"}[5m])) / sum(rate(http_requests_total{service=\"auth\"}[5m])))[30d:5m])) / (1 - 0.999))"
        }],
        "visualization": "gauge",
        "thresholds": [
          {"value": 0.5, "color": "green"},
          {"value": 0.25, "color": "yellow"},
          {"value": 0, "color": "red"}
        ]
      }
    ]
  }
}


ワークフロー 3:カオスエンジニアリング実験

ユースケース: データベースのフェイルオーバーに対するレジリエンスを検証する場合

実験の設計:

# chaos-experiment-db-failover.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
  name: database-primary-kill
  namespace: chaos-testing
spec:
  action: pod-kill
  mode: one
  selector:
    namespaces:
      - production
    labelSelectors:
      app: postgresql
      role: primary
  scheduler:
    cron: "@every 2h"  # Run experiment every 2 hours
  duration: "0s"  # Instant kill

仮説:

## Hypothesis
**Steady State**: 
- Application maintains 99.9% availability
- P99 latency \u003c 500ms
- Database queries succeed with automatic failover to replica

**Perturbation**:
- Kill primary database pod (simulates AZ failure)

**Expected Behavior**:
- Kubernetes detects pod failure within 10 seconds
- Replica promoted to primary within 30 seconds
- Application reconnects to new primary within 5 seconds
- Total impact: \u003c45 seconds of elevated error rate (\u003c5%)
- No data loss (synchronous replication)

**Abort Conditions**:
- Error rate \u003e 20% for \u003e60 seconds
- Manual rollback command issued
- Customer complaints spike \u003e10x normal

実行手順:

#!/bin/bash
# chaos-experiment-runner.sh

set -e

echo "=== Chaos Experiment: Database Failover ==="
echo "Start time: $(date)"

# Step 1: Baseline metrics (5 minutes)
echo "[1/7] Collecting baseline metrics..."
START_TIME=$(date -u +%s)
sleep 300

BASELINE_ERROR_RATE=$(promtool query instant \
  'sum(rate(http_requests_total{code=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))' \
  | jq -r '.data.result[0].value[1]')

echo "Baseline error rate: ${BASELINE_ERROR_RATE}"

# Step 2: Inject failure
echo "[2/7] Injecting failure: Killing primary database pod..."
kubectl delete pod -l app=postgresql,role=primary -n production

# Step 3: Monitor failover
echo "[3/7] Monitoring failover process..."
for i in {1..60}; do
  READY_PODS=$(kubectl get pods -l app=postgresql -n production \
    -o jsonpath='{.items[?(@.status.conditions[?(@.type=="Ready")].status=="True")].metadata.name}' \
    | wc -w)
  
  if [ $READY_PODS -ge 1 ]; then
    echo "Failover completed at T+${i}s: $READY_PODS ready pods"
    break
  fi
  
  echo "T+${i}s: Waiting for replica promotion..."
  sleep 1
done

# Step 4: Measure impact
echo "[4/7] Measuring incident impact..."
sleep 60  # Wait for metrics to stabilize

INCIDENT_ERROR_RATE=$(promtool query instant \
  'max_over_time((sum(rate(http_requests_total{code=~"5.."}[1m])) / sum(rate(http_requests_total[1m])))[5m:])' \
  | jq -r '.data.result[0].value[1]')

echo "Peak error rate during incident: ${INCIDENT_ERROR_RATE}"

# Step 5: Validate recovery
echo "[5/7] Validating service recovery..."
for i in {1..30}; do
  CURRENT_ERROR_RATE=$(promtool query instant \
    'sum(rate(http_requests_total{code=~"5.."}[1m])) / sum(rate(http_requests_total[1m]))' \
    | jq -r '.data.result[0].value[1]')
  
  if (( $(echo "$CURRENT_ERROR_RATE < 0.01" | bc -l) )); then
    echo "Service recovered at T+$((60+i))s"
    break
  fi
  
  sleep 1
done

# Step 6: Data integrity check
echo "[6/7] Running data integrity checks..."
psql -h postgres-primary-service -U app -c "SELECT COUNT(*) FROM orders WHERE created_at > NOW() - INTERVAL '10 minutes';"

# Step 7: Results summary
echo "[7/7] Experiment Results:"
echo "================================"
echo "Baseline error rate: ${BASELINE_ERROR_RATE}"
echo "Peak error rate: ${INCIDENT_ERROR_RATE}"
echo "Current error rate: ${CURRENT_ERROR_RATE}"
echo "Failover time: ~30-45 seconds"
echo "Hypothesis validation: $([ $(echo "$INCIDENT_ERROR_RATE < 0.05" | bc -l) -eq 1 ] && echo "PASS" || echo "FAIL")"
echo "================================"

# Output experiment report
cat > experiment-report-$(date +%Y%m%d-%H%M%S).md <<EOF
# Chaos Experiment Report: Database Failover

## Experiment Details
- **Date**: $(date)
- **Hypothesis**: Application survives primary database failure with \u003c5% error rate
- **Perturbation**: Kill primary PostgreSQL pod

## Results
- **Baseline error rate**: ${BASELINE_ERROR_RATE}
- **Peak error rate during failure**: ${INCIDENT_ERROR_RATE}
- **Recovery time**: ~45 seconds
- **Data integrity**: Verified (no data loss)

## Hypothesis Validation
$([ $(echo "$INCIDENT_ERROR_RATE < 0.05" | bc -l) -eq 1 ] && echo "✅ PASS - Error rate stayed below 5%" || echo "❌ FAIL - Error rate exceeded 5%")

## Action Items
1. Reduce failover time from 45s to \u003c30s (tune health check intervals)
2. Add connection pool retry logic (reduce client-side errors)
3. Improve monitoring alerts for database failover events
EOF

echo "Experiment report generated."

期待される結果:

  • フェイルオーバー時間:30~45 秒
  • 最大エラー率:3~4%(しきい値の 5%未満)
  • データ整合性:100%保持
  • SLO への影響:エラー率 4%で 45 秒間稼働 = エラーバジェットを 1.8 秒消費


❌ アンチパターン 2:インシデント指揮体制がない

具体例:

[During P0 incident in Slack]
Engineer A: "Database is down!"
Engineer B: "I'm restarting it"
Engineer C: "Wait, I'm also trying to restart it"
Engineer A: "Should we roll back the deployment?"
Engineer B: "I don't know, maybe?"
Engineer C: "Who's talking to customers?"
[15 minutes of chaos, uncoordinated actions]

うまくいかない理由:

  • 意思決定者が一人に定まっていない
  • 対応が重複または競合する
  • ステークホルダーへの連絡がない
  • タイムラインが記録されない
  • 学習の機会を失う

正しいアプローチ(インシデント指揮システム):

Incident Roles:
1. Incident Commander (IC) - Makes decisions, coordinates
2. Tech Lead - Investigates root cause, implements fixes
3. Communications Lead - Updates stakeholders
4. Scribe - Documents timeline

[Incident starts]
IC: "@team P0 incident declared. I'm IC. @alice tech lead, @bob comms, @charlie scribe"
IC: "@alice what's the current state?"
Alice: "Database primary down, replica healthy. Investigating cause."
IC: "Decision: Promote replica to primary now. @alice proceed."
Bob: "Posted status page update: investigating database issue."
Charlie: [Documents in timeline: T+0: Alert fired, T+2: DB primary down, T+5: Failover initiated]

IC: "Mitigation complete. @alice confirm service health."
Alice: "Error rate back to 0.1%, latency normal."
IC: "Incident resolved. @bob final status update. @charlie compile timeline for post-mortem."


品質チェックリスト

SLO の実装
  • SLI が明確に定義され、測定可能である
  • エラーバジェットが算出され、追跡されている
  • Prometheus/モニタリングクエリが検証されている
  • アラートのしきい値が設定されている(アラート疲れを防止)
  • エラーバジェットのポリシーが文書化されている
インシデント対応
  • すべての重要なサービスにランブックがある
  • インシデント指揮の役割が定義されている
  • 連絡用テンプレートが用意されている
  • オンコールのローテーションが持続可能である(週 \u003c5 ページ)
  • ポストモーテムのプロセスが確立されている(非難しない)
高可用性
  • マルチ AZ デプロイメントが検証されている
  • 自動フェイルオーバーがテストされている
  • RTO/RPO が文書化され、検証されている
  • 災害復旧が四半期ごとにテストされている
  • カオス実験が毎月実施されている

この SRE スキルは、SLO、インシデント管理、継続的改善を重視した、本番環境ですぐに使える信頼性エンジニアリングの実践手法を提供します。

コメント