本文へ移動

ホーム / Web / 第5部 品質と運用

第5部 品質と運用・第14章

CI/CD・リリース・監視

★★☆ 重要9トピック・面接 3問

作ったものを安全に届け、本番で起きていることを知る方法を押さえる。SRE と協力する部分。

別のページで開く →

障害対応の演習を読み込んでいます…

14.1CI/CD

用語★★☆ 重要
ひとことで

push のたびにテストとビルドを自動で行い、本番まで自動で届ける。

CI(継続的インテグレーション)は、push やプルリクエストのたびに、テスト・型の確認・ビルドを自動で行うことです。CD(継続的デリバリー/デプロイ)は、それに通ったものを自動で本番(またはその手前)まで届けることです。

プルリクエストからリリースまでプルリクエストごと(10 分以内が目安)push・PRlint・型テストビルドプレビューURL を PR にE2Eレビューと CI が通ったらmain にマージステージング本番段階的に広げる
CI/CD のパイプラインの例

パイプラインの例(GitHub Actions)

on: [pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: pnpm/action-setup@v6
      - uses: actions/setup-node@v7
        with: { node-version: 24, cache: pnpm }
      - run: pnpm install --frozen-lockfile
      - run: pnpm lint
      - run: pnpm typecheck
      - run: pnpm test
      - run: pnpm build

アクションの版(@v7 など)と Node.js の版は上がっていくので、使うときに各アクションのリリースと Node.js の LTS の予定を確かめます。流れの例:lint・型の確認・単体テスト(速いものを先に)→ 結合テスト・ビルド → プレビュー環境へデプロイ → E2E → main にマージしたらステージングへ → 本番へ。

  • 10分以内を目安に保つ。依存のキャッシュ、変更のあった所だけの実行、並列化で速くする。遅い CI は、まとめて大きな変更を出す原因になる。
  • ロックファイルどおりに入れる(--frozen-lockfile)。
  • main ブランチは保護し、CI とレビューを通らないとマージできないようにする。
  • 本番への権限は OIDC で一時的な認証にし、長く使える鍵を CI に置かない。

SRE の「CI/CDとGitHub Actions」

面接ではこう答える

CI は、push やプルリクエストのたびに、lint、型の確認、テスト、ビルドを自動で行うことで、CD はそれに通ったものを自動で本番かその手前まで届けることです。速いチェックを先に流し、全体を10分以内に保つと、小さな変更をこまめに出せます。main は保護して CI とレビューを必須にし、本番への権限は長く使える鍵ではなく OIDC の一時的な認証にします。

PR ごとに、その変更だけの環境を作るPR を作るpush のたびに自動でデプロイPR 専用の URL確認するデザイナー・PM・E2Eマージで消す費用と情報の管理
プレビュー環境の流れ

プルリクエストごとに、その変更だけを反映した環境を自動で作り、URL をプルリクエストに貼る仕組みです(Vercel・Netlify・Cloudflare Pages などは標準で対応)。デザイナーや PM がマージ前に実際の画面で確かめられ、E2E テストの対象にもできます。注意点は、本番のデータや秘密情報をつながないこと、検索エンジンに載らないようにすること、使い終わったら消すこと(費用)です。DB を使うアプリでは、プレビューごとの DB をどう用意するかも決めます。

ひとことで

コードを出すこと(デプロイ)と機能を見せること(リリース)を分け、設定で段階的に広げて、すぐ切れるようにする仕組み。

リリースで障害を起こさないコツは、一度に変える量を小さくし、すぐ戻せるようにすることです。

Feature Flag

Feature Flag は、コードは本番に出しておき、機能を有効にするかを設定で切り替える仕組みです。デプロイ(コードを出す)とリリース(ユーザーに見せる)を分けられます。

少しずつ広げ、問題があればフラグを切る0%社内1%10%50%100%エラー率・指標を見て次へ問題があればフラグを切る(デプロイし直さない)
Feature Flag で段階的に広げる
if (flags.isEnabled('new-checkout', { userId: user.id })) {
  return renderNewCheckout();
}
return renderOldCheckout();
  • 社内の人だけ → 1% → 10% → 全員、と段階的に広げ、エラー率や指標を見て問題があればフラグを切る(デプロイし直さずに戻せる)。
  • 未完成の機能も main にマージでき、長いブランチを作らずに済む。
  • 使い終わったフラグは消す。残り続けると分岐が増えて誰も分からなくなる。期限と担当者を決めておく。
  • 道具は LaunchDarkly・Unleash・OpenFeature 対応のもの、自前の設定表など。

面接ではこう答える

Feature Flag は、コードは本番に出しておき、機能を有効にするかを設定で切り替える仕組みで、デプロイとリリースを分けられます。社内の人だけ、1%、10%、全員と段階的に広げ、指標が悪ければフラグを切るだけで、デプロイし直さずに戻せます。未完成の機能も main にマージできますが、使い終わったフラグは期限と担当を決めて消します。

ひとことで

カナリアは一部に出して様子を見る、ブルーグリーンは新旧を用意して切り替える、ローリングは少しずつ入れ替える。

新しい版をどう入れ替え、どう戻すかカナリア・一部にだけ出す・指標を見て広げる・戻す:振り分けをやめるブルーグリーン・新旧を両方用意・LB で一気に切り替え・戻す:元に切り替えローリング・少しずつ入れ替え・追加の環境が要らない・戻す:入れ替え直し
デプロイの3つの方式

Feature Flag のほかにも、出し方にはいくつかあります。

方法しくみ戻し方
Feature Flagコードは全員に出し、機能の有効化を設定で切り替えるフラグを切る(数秒)
カナリアリリース新しい版を一部のサーバー・ユーザーにだけ出して様子を見る新しい版への振り分けをやめる
ブルーグリーン新旧の環境を両方用意し、ロードバランサーで切り替える古い環境に切り替え直す
ローリングサーバーを少しずつ新しい版に入れ替える前の版で入れ替え直す(時間がかかる)

どの方式でも、何を見て止めるか(エラー率・レイテンシ・主要な操作の成功率)を先に決めておき、自動で止まる仕組みにできると安全です。

SRE の「デプロイ戦略」

面接ではこう答える

新しい版を出す方式は主に3つあります。カナリアリリースは新しい版を一部のサーバーやユーザーにだけ出して、エラー率などを見ながら広げる方式です。ブルーグリーンは新旧の環境を両方用意し、ロードバランサーで一気に切り替え、問題があれば元に戻します。ローリングはサーバーを少しずつ入れ替える方式で、追加の環境が要らない代わりに戻すのに時間がかかります。どれでも、止める基準を先に決めておくのが大事です。

ひとことで

アプリは戻せてもデータは戻らない。新旧どちらの版でも読めるデータの形にしておき、読める版 → 書く版の順に出す。

「読める版」を先に出してから「書く版」を出すv1古い形を読み書きv2:読めるようにする新旧どちらも読めるv3:新しい形で書くv2 に戻しても読めるv1 → v3 を一度に出すと、v1 に戻したとき新しい形のデータを読めず壊れるキャッシュ・キューのジョブの形も同じ考え方
データの形を変えるリリースの順番

アプリは前の版に戻せても、データは戻りません。新しい版が新しい形でデータを書いたあとに戻すと、古い版がそのデータを読めずに壊れることがあります。

  • DB の変更は「新旧どちらのアプリでも動く」形で、アプリのリリースと分けて行う(列の削除は、使わなくなってから別のリリースで)。
  • 新しい列・新しい値を書き始める変更は、まず「読めるようにする」版を出してから、「書く」版を出す。
  • キャッシュやキューに入るデータの形も同じ。古いワーカーが新しい形のジョブを受け取っても壊れないようにする。
  • API の応答を変えるときは、古いアプリ(スマホ)がまだ使っている前提で。
  • 戻す手順(前の版のデプロイ・フラグを切る)を事前に決め、実際に試しておく。

面接ではこう答える

ロールバックで気をつけるのは、アプリは前の版に戻せても、データは戻らないことです。新しい版が新しい形でデータを書いたあとに戻すと、古い版がそのデータを読めずに壊れます。そこで、まず新しい形を読めるだけの版を出し、次に書き始める版を出します。DB の列の削除のような変更は、使わなくなってから別のリリースで行います。キャッシュやキューに入るデータも同じです。

ひとことで

ブラウザで起きたエラーを集めて、件数・影響・元のコードの行・リリースの版と結びつけて見る仕組み。

本番で起きている問題に、ユーザーより先に気づくための仕組みです。ログ・メトリクス(数値)・トレース(1つのリクエストがどこを通ったか)を組み合わせて見ます。

フロントのエラー監視

ブラウザで起きたエラーは、何もしなければサーバーのログに残りません。エラートラッキング(Sentry など)を入れると、ユーザーのブラウザで起きた例外を集めて、件数・影響したユーザー数・ブラウザの種類・直前の操作とともに見られます。

ブラウザのエラーを集めて、元のコードに戻すブラウザで例外利用者の画面エラートラッキング個人情報は除いて送る元の行に戻すソースマップ通知件数の急増API のログ・トレーストレース IDリリースの版で「どのデプロイから増えたか」を見る
フロントのエラーが届くまで
  • ビルドで作ったソースマップをエラートラッキングにアップロードし、圧縮されたコードのエラーを元のファイルと行に戻す。ソースマップ自体は一般には公開しない設定にすることが多い。
  • リリースの版をタグ付けし、「どのデプロイから増えたか」が分かるようにする。
  • 拡張機能や古いブラウザ由来のノイズを除き、件数の急増で通知する。
  • 個人情報(入力値・トークン)を送らないよう、送る前に取り除く設定をする。
  • エラーだけでなく、Core Web Vitals などの性能も RUM で集める。
  • バックエンドとはリクエスト ID やトレース ID で結びつけ、画面のエラーから API のログにたどれるようにする。

SRE の「SLI・SLO・SLA」

面接ではこう答える

ブラウザで起きたエラーは、何もしなければサーバーのログに残りません。Sentry のようなエラートラッキングを入れると、ユーザーのブラウザで起きた例外を、件数や影響したユーザー数、ブラウザの種類とともに集められます。ソースマップを登録して元のコードの行に戻し、リリースの版を付けて、どのデプロイから増えたかが分かるようにします。個人情報は送る前に取り除きます。

14.7SLO と SRE との協力

用語★★☆ 重要
ひとことで

ユーザーから見た品質の目標。下回りそうなら機能開発より信頼性の改善を優先する、という判断の基準になる。

目標と 100% の差が、使ってよい失敗(エラーバジェット)SLO:99.9% のリクエストが 500ms 以内に成功0.1%使い切りそう → リリースを控えて信頼性の改善へ/余っている → 挑戦的な変更を出せる
SLO とエラーバジェット

SLO は「この API の 99.9% のリクエストが 500ms 以内に成功する」のような、ユーザーから見た品質の目標です。SLO を下回りそうなときは、機能の開発より信頼性の改善を優先する、という判断の基準にもなります(エラーバジェット)。

  • Web エンジニアは、何がユーザーにとって大事な操作か(ログイン・検索・購入)を知っているので、SLI(測る指標)を SRE と一緒に決める。
  • アプリのコードに、計測(OpenTelemetry など)・意味のあるログ・ヘルスチェックを入れるのは開発側の仕事。
  • アラートは「ユーザーに影響があるとき」に鳴るようにし、鳴ったときに見るダッシュボードと手順を用意する。
  • 障害のあとはふり返り(ポストモーテム)に参加し、コードの側の再発防止を担当する。

面接ではこう答える

SLO は、「この API のリクエストの 99.9% が 500ms 以内に成功する」のような、ユーザーから見た品質の目標です。目標と 100% の差がエラーバジェットで、使い切りそうなら新機能より信頼性の改善を優先する、という判断の基準になります。Web エンジニアは、ユーザーにとって大事な操作を知っているので、何を測るか(SLI)を SRE と一緒に決め、計測やログをコードに入れる役割を持ちます。

まず影響を止める。原因の究明はその後気づく・宣言アラート・連絡影響を確かめる誰に・どの機能緩和する戻す・フラグを切る原因を直すコードの修正ふり返り再発防止
障害対応の流れ

障害のとき、Web エンジニアは「直近の変更」と「アプリのコード」に一番詳しい人です。SRE と役割を分けて動きます。

段階Web エンジニアがすること
気づくエラートラッキング・アラートを見る。直近のデプロイ・フラグの変更を確かめる
影響を確かめるどの画面・API・ユーザーか。エラーの件数と増え始めた時刻
緩和する直前のデプロイが怪しければ、原因が分かる前でも戻す・フラグを切る
直す修正のコードは小さく。急いでもレビューとテストは通す
ふり返り時系列と判断を書き、テスト・監視・手順の改善を担当する

対応中は、決めたチャンネルで「何が起きていて、何をしていて、次はいつ報告するか」を短く流します。1人で黙って調べ続けないことが大事です。

ロールバックとデータの互換性

ひとことで

Web エンジニアはログを「出す」側の中心。運用のログは SRE と、行動ログは PdM・アナリスト・データエンジニアと決めて実装する。

Web エンジニアは、ログを「出す(実装する)」側の中心です。どんなログを出すかは目的によって相談相手が変わり、集めて保管する基盤は SRE やデータエンジニアが持つことが多いです。

ログWeb エンジニアがやること一緒に決める相手
アプリのログ(サーバー)JSON の構造化ログ、リクエスト ID・ユーザー ID を付ける、レベル(ERROR・WARN・INFO)を使い分ける、パスワードやトークンを出さないSRE(ログ基盤・保持期間・アラート)
フロントのエラーSentry などのエラー収集の導入、ソースマップ、リリースの版との紐付けSRE・QA
行動ログ(イベント)トラッキングプランどおりに、決まったタイミングで送る。二重送信・送り忘れのテストPdM・アナリスト(何を測るか)、データエンジニア(形・取り込み)
性能(RUM)Core Web Vitals を送るSRE・PdM(目標の値)
監査ログ管理画面などの重要な操作を「誰が・いつ・何を」で残すセキュリティ・SRE(消せない場所に保管)

会社によっては、行動ログの実装もデータの基盤チームが SDK を用意し、Web エンジニアはそれを呼ぶだけ、という分け方もあります。どの場合も、イベントの名前や項目を勝手に変えない(変えるときはデータ側のレビューに入れる)ことと、個人情報をログに入れないことが Web エンジニアの責任です。分担の全体は Data のログは誰が設計・実装するかにまとめています。

面接ではこう答える

Web エンジニアはログを実装して出す側の中心だと考えています。サーバーのログはリクエスト ID 付きの構造化ログにして個人情報を出さないようにし、基盤やアラートは SRE と決めます。行動ログは、何を測るかを PdM やアナリストが決め、形と取り込みはデータエンジニアと合わせて、トラッキングプランどおりに送ります。名前を勝手に変えないことと、送れているかのテストも自分の責任です。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 小さく頻繁に安全にリリースする仕組み(CI/CD・Feature Flag・段階的リリース)
  • フロント・バックのエラーを監視し、障害に気づいて直す

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1本番で障害が起きたとき、Web エンジニアとして何をしますか?

模範回答

まず影響の確認です。エラー率やダッシュボード、エラートラッキングで、どの機能のどのくらいのユーザーに影響が出ているかを見て、関係者に状況を共有します。直前にデプロイやフラグの変更があれば、それが原因の可能性が高いので、原因を詳しく調べる前にロールバックやフラグを切って、まずユーザーへの影響を止めます。

影響が止まったら、ログやトレースで原因を特定し、きちんとした修正をテストつきで出します。最後にポストモーテムで、何が起きたか、なぜ気づくのが遅れたか、なぜ防げなかったかを整理し、テストの追加・アラートの改善・リリースの仕組みの見直しなど、再発防止をチケットにして実行します。個人を責めず、仕組みで防ぐことを意識します。

深掘りされたら

  • ロールバックできないのはどんなときですか?
  • データが壊れてしまった場合は?

見られているポイント影響の確認・切り戻し・原因・再発防止

Q2Feature Flag を使ったことはありますか? 注意点は?

模範回答

例えば、決済画面の作り直しで使いました。コードは本番に出したまま、まず社内の人、次に 1%、10% と広げ、エラー率と購入率を見ながら全員に出しました。途中で一部のブラウザで不具合が見つかったときは、フラグを切るだけで数秒で元に戻せました。

注意点は、使い終わったフラグを必ず消すことです。残ると分岐が増えて、どの組み合わせが動いているのか誰も分からなくなります。作るときに担当者と消す期限を決めておきます。また、フラグで戻せるのはコードの動きだけで、新しい形で書いたデータは戻らないので、データの互換性は別に考えます。

深掘りされたら

  • フラグの状態はどこで管理しますか?

見られているポイント段階的な展開の経験と、フラグの後始末

Q3デプロイ後にエラーが増えました。ロールバックしますか?

模範回答

ユーザーへの影響が出ていて、直前のデプロイが原因の可能性が高いなら、原因を詳しく調べる前にまずロールバックか、該当のフラグを切ります。影響を止めることが先で、原因の調査はそのあとです。

ただしロールバックの前に、データの互換性を確かめます。新しい版が新しい形でデータを書いていたり、DB の変更で列を消していたりすると、古い版に戻すとかえって壊れることがあります。そうならないよう、普段から DB の変更は新旧どちらの版でも動く形で、アプリのリリースと分けて行うようにしています。戻したあとはエラー率が下がったことを確かめ、原因を直した版を改めて出します。

深掘りされたら

  • ロールバックできない変更にはどう備えますか?

見られているポイント影響を止めるのが先・データの互換性