Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

DevOps

DevOps は、開発(Development)と運用(Operations)の壁を取り除き、ソフトウェアを迅速かつ安定的に届け続けるための文化・プラクティス・ツールの総体。

従来は「開発チームが作ったものを運用チームが本番に持っていく」という分業体制だったが、このモデルではリリースが遅く、障害対応の責任が曖昧になりやすい。DevOpsはこの分断を解消することを目指す。

従来:  開発チーム ──→ (壁) ──→ 運用チーム ──→ 本番
DevOps: 開発・運用が一体となって継続的にデリバリー

DevOpsの三本の道(The Three Ways)

書籍 The Phoenix Project で提唱され、The DevOps Handbook で体系化された、DevOpsの根幹をなす3つの原則。

第一の道:フロー(Flow)

開発から本番への仕事の流れを速くする

  • 作業の可視化(バックログ、かんばんなど)

  • バッチサイズを小さくする(小さな変更を頻繁にリリース)

  • 手待ちや手戻りを減らす

第二の道:フィードバック(Feedback)

本番から開発へのフィードバックを速くする

  • 障害・エラーをすぐに検知する(モニタリング・アラート)

  • テストで早期に問題を発見する

  • ユーザーの反応をすばやく把握する

第三の道:継続的学習(Continual Learning)

実験と学習の文化を組織に根づかせる

  • 障害をペナルティではなく学習の機会として扱う(ポストモーテム)

  • 改善のための時間を確保する

  • 知識を組織全体で共有する

CI/CD

DevOpsの中核となる実践。

CI(継続的インテグレーション / Continuous Integration)

コード変更をメインブランチへ頻繁にマージし、そのたびに自動でビルド・テストを実行する。

開発者がコードをpush
      ↓
CI サーバーが自動実行:
  1. ビルド
  2. 静的解析・Lint
  3. 自動テスト
      ↓
結果を通知(Slack・PRコメントなど)

CIがない場合の問題:

  • 長期間ブランチを切り離して開発すると、マージ時に大量のコンフリクトが発生する(“マージ地獄”)

  • バグの発見が遅れ、修正コストが膨らむ

CD(継続的デリバリー / Continuous Delivery)

CIを通過したコードを、いつでも本番にリリースできる状態に保つ。

CI 通過
  ↓
ステージング環境へ自動デプロイ
  ↓
受け入れテスト
  ↓
本番リリース(手動承認 or 自動)

継続的デリバリー継続的デプロイ(Continuous Deployment) の違い:

継続的デリバリー継続的デプロイ
本番反映手動承認が必要自動で本番反映
リスク低いより高い(自動化の信頼性が必要)
向いている場面規制産業・慎重なリリースが必要高速にフィードバックを得たい場合

代表的なCIツール

ツール特徴
GitHub ActionsGitHubに統合されており、設定が簡単
GitLab CI/CDGitLabに統合。セルフホストも可能
CircleCI柔軟な設定。並列実行が得意
Jenkins老舗のOSS。プラグインが豊富だが管理コストが高い

Infrastructure as Code(IaC)

インフラの構成をコードで管理する。手作業による環境構築を排除し、再現性・バージョン管理・自動化を実現する。

IaCのメリット

  • 再現性 :同じコードから何度でも同じ環境を作れる

  • バージョン管理 :インフラの変更履歴をgitで管理できる

  • 差分管理 :現状と望ましい状態の差分を確認してから適用できる

  • ドリフト検出 :手作業による設定変更を検知できる

代表的なIaCツール

ツール対象特徴
Terraformクラウドリソース全般宣言的。マルチクラウド対応
AWS CloudFormationAWSリソースAWS公式。YAMLで記述
Pulumiクラウドリソース全般汎用プログラミング言語で書ける
Ansibleサーバー設定エージェント不要。YAMLで手順を記述

宣言的 vs 手続的

宣言的(Declarative)手続的(Procedural)
記述内容「あるべき状態」を書く「手順」を書く
Terraform, CloudFormationシェルスクリプト, Ansible
冪等性ツールが保証自分で担保が必要

Terraformの例

# S3バケットを作成する例
resource "aws_s3_bucket" "example" {
  bucket = "my-example-bucket"
}

resource "aws_s3_bucket_versioning" "example" {
  bucket = aws_s3_bucket.example.id
  versioning_configuration {
    status = "Enabled"
  }
}
terraform plan   # 変更差分を確認
terraform apply  # 実際に適用

モニタリングとオブザーバビリティ

本番環境で何が起きているかを把握し、問題を早期に検知・診断するための仕組み。

モニタリング vs オブザーバビリティ

モニタリングオブザーバビリティ
問いかけ「今、問題が起きているか?」「なぜ問題が起きているか?」
アプローチ事前に決めた指標を監視システムの内部状態を外部から推測できる
CPU使用率 > 80% でアラート分散トレーシングでボトルネックを特定

テレメトリーの三本柱

オブザーバビリティを実現する3つのデータ種別。OpenTelemetryプロジェクトが標準化を推進している。

メトリクス(Metrics)

時系列の数値データ。集計・可視化・アラートに使う。

  • レスポンスタイム(P50, P95, P99)

  • エラーレート

  • スループット(req/s)

  • CPU・メモリ使用率

ログ(Logs)

イベントの記録。何が起きたかを詳細に把握する。

import logging

logger = logging.getLogger(__name__)

logger.info("order_created", extra={"order_id": "123", "user_id": "456"})
logger.error("payment_failed", extra={"order_id": "123", "reason": "card_declined"})

構造化ログ(JSON形式など)にすると、ログ収集基盤での検索・集計がしやすくなる。

トレース(Traces)

リクエストが複数のサービスをまたいで処理される流れを追跡する。マイクロサービス環境での問題特定に有効。

ユーザーリクエスト
  └─ APIゲートウェイ (10ms)
       └─ 注文サービス (50ms)
            ├─ 在庫サービス (20ms)
            └─ 決済サービス (200ms)  ← ここがボトルネック

SLI / SLO / SLA

用語正式名称内容
SLIService Level Indicator計測する指標(例:可用性、レイテンシ)
SLOService Level ObjectiveSLIの目標値(例:可用性 99.9% 以上)
SLAService Level Agreementユーザーとの合意・契約(SLOを下回ると補償など)

エラーバジェット:SLOで許容している障害の余裕のこと。

  • SLO = 99.9% の場合、1ヶ月のエラーバジェット ≈ 43分

  • バジェットが残っているうちは新機能のリリースを積極的に進める

  • バジェットを使い切ったら安定性改善に集中する

代表的なツール

カテゴリツール
メトリクスPrometheus, Datadog, CloudWatch
ログElasticsearch + Kibana, Loki, Datadog
トレースJaeger, Zipkin, AWS X-Ray
オールインワンDatadog, New Relic, Grafana Stack

デプロイ戦略

本番環境への変更をどのように展開するかの戦略。リスクを最小化しながらリリースするための手法。

ブルーグリーンデプロイ

本番(Blue)と新バージョン(Green)の環境を並行して用意し、ロードバランサーで切り替える。

          ロードバランサー
               │
       ┌───────┴───────┐
    Blue環境         Green環境
   (現行ver)       (新ver)
       │                │
   本番トラフィック →  切り替え後にすべて流れる
  • メリット :切り替えが一瞬。問題があればBlueに即切り戻し

  • デメリット :インフラコストが2倍になる

カナリアリリース

新バージョンを一部のユーザーだけに段階的に展開する。

全ユーザー ──→ 旧バージョン(95%)
           └─→ 新バージョン(5%) ← まず少数に流す
                      ↓
              問題なければ段階的に拡大(20% → 50% → 100%)
  • メリット :影響範囲を限定しながら検証できる

  • デメリット :管理が複雑。複数バージョンが並行するDBスキーマ変更に注意

ローリングアップデート

複数のサーバーを順番に更新していく。

Server1: 旧 → 新  ✓
Server2: 旧 → 新  ✓
Server3: 旧 → 新  ✓
(Kubernetesのデフォルト動作)
  • メリット :追加インフラ不要

  • デメリット :更新中は新旧バージョンが混在する

フィーチャーフラグ(Feature Flags)

コードのデプロイとフィーチャーのリリースを分離する。フラグをオン/オフすることで特定ユーザーだけに機能を見せる。

def show_new_dashboard(user):
    if feature_flag.is_enabled("new_dashboard", user):
        return render_new_dashboard()
    return render_old_dashboard()
  • メリット :デプロイを怖がらずに進められる。A/Bテストにも使える

  • デメリット :フラグが増えるとコードが複雑になる(定期的に削除が必要)

インシデント管理

本番障害が発生したときの対応と再発防止の仕組み。

インシデント対応のフロー

検知(アラート・ユーザー報告)
      ↓
トリアージ(重大度の判定)
      ↓
対応チームのアサイン(インシデントコマンダー)
      ↓
原因調査・暫定対応(サービス復旧を最優先)
      ↓
根本原因の特定・恒久対応
      ↓
ポストモーテム(振り返り)

重大度の定義例(Severity Level)

レベル内容
Sev1サービス全停止。全ユーザーに影響本番DBが落ちた
Sev2主要機能が使えない決済が通らない
Sev3一部機能が劣化検索が遅い
Sev4軽微な問題画面のレイアウトが崩れている

ポストモーテム(Post-mortem)

障害後に行う振り返りのこと。ブレームレス(blameless) で行うことが重要。人を責めず、システムや仕組みの問題として捉える。

ポストモーテムに書く内容:

  1. インシデントの概要 :何が起き、どのくらい影響したか

  2. タイムライン :検知から復旧までの経緯

  3. 根本原因 :なぜ障害が発生したか(5 Whysなど)

  4. 対応策 :再発防止のためのアクションアイテム

SRE(Site Reliability Engineering)

Googleが提唱した、信頼性を工学的アプローチで担保する職種・考え方。

  • 開発エンジニアがオンコール(障害対応当番)を担う

  • トイル(toil:手作業の繰り返し作業)を自動化で減らす

  • エラーバジェットで新機能開発と安定性のバランスを取る