本文へスキップ
Starone

ケイパビリティ

本番リリースを日常業務にするデリバリーパイプライン

私たちは、コミットから本番までの経路を設計します。ビルド、テスト、セキュリティ分析、アーティファクト管理、環境間の昇格、段階的なロールアウトがその対象です。セキュリティチェックはこの経路の中で実行されるため、リリースは、それを出荷するのと同じ仕組みによって検証されます。

概要

DevOpsとは、デリバリーの仕組みそのもののエンジニアリングです。コードベース、パイプライン、環境、フィードバックループは、本番で動くソフトウェアを出力する一つの機械を構成しており、その機械の設計には良し悪しがあります。うまく設計された機械は、小さな変更を1日に何度も、低い失敗率でリリースします。設計のまずい機械は、数週間分の作業を一つのリリースにまとめ、変更作業の時間枠と、誰も信用していないロールバック計画を必要とします。

DevSecOpsは、同じ考え方をセキュリティに広げたものです。最後にレビューの関門を置くのではなく、セキュリティ管理策を自動化し、最も低コストで対処できる場所に配置します。プルリクエストでの静的解析、ビルドでの依存関係とコンテナのスキャン、アドミッション時の署名検証、インフラ変更へのポリシー適用です。開発者は、普段使っているツールの中で、文脈がまだ頭に残っているうちに、数分で検出結果を受け取れます。

私たちは、パイプライン、環境定義、ポリシーを本番のソフトウェアとして扱います。バージョン管理し、レビューし、テストし、オーナーを定めます。私たちが目指すのは、監査人が読み解くことができ、エンジニアが筋道を立てて理解でき、新しいチームが一から作り直すことなく採用できるデリバリープロセスです。

エンジニアリング領域

技術領域

01

CI/CDパイプライン設計

パイプラインは、コストとフィードバックの速さの順に並べた品質ゲートの連なりです。高速で決定的なチェックを先頭に置き、独立して実行できるものは並列化し、積極的にキャッシュすることで、通常のケースが数分で完了するようにします。パイプラインは再利用可能なテンプレートとして定義し、各サービスがYAMLをコピーするのではなく組織の標準を継承するようにします。

  • GitHub Actions、GitLab CI、Jenkinsのパイプライン設計
  • 再利用可能なワークフローテンプレートと共有パイプラインライブラリ
  • ビルドキャッシュ、テストシャーディング、ステージの並列化
  • ユニット、インテグレーション、コントラクト、E2Eの各テストステージ
  • データベースマイグレーションのチェックと後方互換性ゲート
  • スコープを絞った短命な認証情報を使うエフェメラルランナー
02

ソース管理戦略とビルド管理

ブランチ戦略は、変更のバッチサイズを決めます。私たちは、短命なブランチとフィーチャーフラグを用いたトランクベース開発を推奨します。長命なブランチは、統合のリスクを最悪のタイミングまで先送りするためです。ビルドは再現可能とし、イミュータブルでバージョン管理された単一のアーティファクトを生成して、内容を変えずにすべての環境へ昇格させます。

  • 短命なフィーチャーブランチによるトランクベース開発
  • 規制やモバイルストアの審査サイクルが求める場合に限ったリリースブランチ
  • セマンティックバージョニングと変更履歴の自動生成
  • コミットのダイジェストでタグ付けしたイミュータブルなコンテナイメージ
  • Amazon ECR、GHCR、Harbor、Artifactoryなどのアーティファクトレジストリ
  • 影響範囲の検出を備えたモノレポ・ポリレポ向けビルドツール
03

環境とプログレッシブデリバリー

環境は本番前の不確実性を減らすためにあり、プログレッシブデリバリーは本番の中でそれをさらに減らします。環境は同じインフラコードから構築して差異を設定だけに限定し、同じアーティファクトを環境間で昇格させます。本番では、カナリアやブルー/グリーンのロールアウトによって変更を一部のトラフィックにだけ公開し、エラー率とレイテンシをベースラインと比較してから先へ進めます。

  • 共有のTerraformモジュールとHelmチャートによる環境間の一致
  • プルリクエストごとのプレビュー環境
  • 自動の昇格とロールバックを伴うカナリア分析
  • ステートフルなリリースや高リスクなリリース向けのブルー/グリーン切り替え
  • デプロイとリリースを分離するフィーチャーフラグ
  • expand-and-contract方式のデータベーススキーママイグレーション
04

GitOpsとインフラの自動化

GitOpsモデルでは、すべての環境のあるべき状態をGitに置き、クラスター内のコントローラーが実際の状態をそれに一致させ続けます。これにより完全な監査証跡が得られ、CIシステムにクラスターの認証情報を持たせる必要がなくなり、ロールバックはrevertで済みます。同じ規律を、planレビューとポリシーチェックを備えたTerraformパイプラインを通じてクラウドリソースにも適用します。

  • Argo CDとFluxによる継続的なリコンサイル
  • プルリクエストで昇格させる環境リポジトリ
  • リモートステートとロックを備えたTerraform・OpenTofuパイプライン
  • ドリフト検出と、自動またはアラートに基づく修正
  • Sealed SecretsとExternal Secrets Operatorによるシークレットの配布
05

シフトレフトセキュリティとサプライチェーンの完全性

脆弱性の大半は、チームが書いたコードか、取り込んだコードから入り込みます。私たちは、その両方について、信頼できるシグナルが得られる最も早い段階で検出を自動化し、検出結果が無視されず対処できるものになるよう各ツールを調整します。さらにビルドは証拠を生成します。ソフトウェア部品表(SBOM)、署名、そして何を、どのソースから、どのパイプラインでビルドしたかを示す来歴情報です。

  • Semgrep、CodeQL、SonarQubeによるSAST
  • ソフトウェアコンポジション解析と依存関係更新の自動化
  • TrivyまたはGrypeによるコンテナイメージスキャン
  • Gitleaksによるコミットと履歴のシークレット検出
  • CycloneDXまたはSPDX形式でのSBOM生成
  • Sigstore Cosignによるイメージ署名とSLSA来歴アテステーション
  • デプロイ済みテスト環境に対するDASTとAPIファジング
06

Policy as Codeとプラットフォームエンジニアリング

文書に書かれたルールは守られ方にばらつきが出ますが、コードに書かれたルールは毎回必ず適用されます。私たちは、セキュリティと運用のポリシーをOpen Policy AgentまたはKyvernoで表現し、Terraformのplan、Kubernetesマニフェスト、パイプライン定義に対して評価します。その周囲にゴールデンパスを構築します。ポリシーに準拠した方法でサービスを作成・運用することが最も簡単な方法になるようにする、テンプレートとセルフサービスのツール群です。

  • インフラのplanに対するOPAとConftestのチェック
  • クラスターでのKyvernoまたはGatekeeperによるアドミッションポリシー
  • 新規リポジトリ向けのサービステンプレートとスキャフォールディング
  • Backstageなどの社内開発者ポータル
  • 環境とデータベースのセルフサービスプロビジョニング
  • パイプラインとインシデントのデータから収集するDORAメトリクス

デプロイとリリースは別の出来事

デプロイとは、新しいコードを本番に送り込むことです。リリースとは、新しい振る舞いをユーザーに公開することです。両者を一つの出来事として扱うと、すべてのデプロイが事業上のリスクを負うことになり、変更作業の時間枠、リリーストレイン、大きなバッチにつながります。両者を分離すれば、コードを継続的に出荷しながら、公開の範囲を独立して制御できます。

振る舞いについてはフィーチャーフラグが、ランタイムのリスクについてはカナリアとブルー/グリーンの戦略が、この分離を実現します。カナリアロールアウトでは、わずかな割合のトラフィックを新バージョンに送り、定められた時間にわたってそのメトリクスを安定バージョンと比較します。エラー率やレイテンシがしきい値を超えて悪化した場合、トラフィックは自動的に安定バージョンへ戻ります。ブルー/グリーンは完全な環境を2つ保持してトラフィックを一度に切り替える方式で、バージョンを混在させて提供できないリリースに適しています。

どちらも、データ層が2つのアプリケーションバージョンを同時に許容できることが前提です。そのためスキーマ変更は、expand-and-contractの手順に従います。新しい構造を追加し、両方に書き込むコードをデプロイし、データを移行し、読み取りを切り替え、その後のリリースで古い構造を削除します。この手順を省くことが、ロールバックが失敗する最も多い原因です。

アーキテクチャ

セキュリティゲートを備えたCI/CDパイプライン

ビルドと検証

  1. 01

    コミット

    mainブランチへのレビュー済みマージ

  2. 02

    ビルド

    再現可能、依存関係はバージョン固定

  3. 03

    テスト

    単体・結合・コントラクトテスト

  4. 04

    SAST・依存関係スキャン

    静的解析と依存関係の監査

  5. 05

    イメージスキャンと署名

    レイヤーをスキャンし署名、SBOMを添付

リリース

  1. 01

    ステージング

    同一アーティファクト、本番相当のデータ

  2. 02

    カナリア

    一部のトラフィックでシグナルを監視

  3. 03

    本番

    ゲート付きの段階的ロールアウト

  4. 04

    モニタリング

    SLOで昇格かロールバックかを判断

1つのアーティファクトをビルド、検証、スキャン、署名し、内容を変えずにステージングとカナリアを経て本番へ昇格させます。モニタリングがリリースを昇格させるかロールバックするかを判断し、ループを閉じます。

ソフトウェアサプライチェーンの保護

現代のサービスは、その大部分がサードパーティのコードです。オープンソースのライブラリ、ベースイメージ、ビルドツール、CIのアクションがこれにあたります。そのどれもが、攻撃者がアプリケーション自身のソースに触れることなく本番に到達できる経路になります。サプライチェーンセキュリティとは、アーティファクトに何が入っているかを把握し、ソースから実行環境までの間に改ざんされていないことを証明する取り組みです。

管理策は一本の鎖を成します。依存関係はバージョンとハッシュで固定し、更新はレビューを経るプルリクエストとして届きます。ビルドは、常設の認証情報を持たない、隔離されたエフェメラルランナーで実行します。各ビルドがSBOMを出力するため、新たな脆弱性が公表されたときに、影響を受けるサービスをクエリで特定できます。アーティファクトには署名し、来歴アテステーションに、それを生成したソースのコミットとパイプラインを記録します。デプロイ時には、署名のないイメージや、信頼されたパイプラインの外でビルドされたイメージを、アドミッションポリシーが拒否します。

  • 依存関係、ベースイメージ、CIアクションをダイジェストで固定
  • すべてのビルドでSBOMを生成し、アーティファクトとともに保管
  • アーティファクトに署名し、アドミッション時に署名を検証
  • SLSAフレームワークのレベルに沿った来歴の記録
  • 事前に合意した重大度のしきい値でビルドを失敗させ、例外プロセスを文書化

DORAメトリクスによるデリバリーの計測

4つのDORAメトリクスは、デリバリーの仕組みを2つの側面から表します。デプロイ頻度と変更のリードタイムはスループットを測ります。チームがどれだけの頻度で出荷し、コミットが本番に届くまでにどれだけかかるかです。変更失敗率とサービス復旧時間は安定性を測ります。リリースがどれだけの頻度でインシデントを引き起こし、サービスがどれだけ早く復旧するかです。これらのメトリクスの基になった研究は、スループットと安定性がともに向上することを示しています。どちらも、小さなバッチと速いフィードバックから生まれるためです。

私たちは、これらをパイプラインのイベント、デプロイの記録、インシデントのデータから計測し、人が報告するのではなく仕組みが算出するようにします。メトリクスは、遅いテストステージや数日の遅れを生む手動承認といった制約を特定し、プロセスへの変更が意図した効果を上げたかを検証するために使います。これはチームのための診断ツールであり、個人の目標に変えた途端に機能しなくなります。

プラットフォームエンジニアリングとゴールデンパス

組織が数チームの規模を超えると、各チームがパイプライン、オブザーバビリティ、デプロイを個別に解決することは、コストがかさみ、一貫性も失われます。プラットフォームエンジニアリングは、社内プラットフォームを提供することでこの問題に対処します。社内プラットフォームとは、ほかのエンジニアをユーザーとするチームが保守する、厳選されたテンプレート、パイプライン、セルフサービス機能の集合です。

ゴールデンパスとは、よくある作業のためにサポートされた経路です。たとえば新しいサービスを、リポジトリ、パイプライン、デプロイマニフェスト、ダッシュボード、アラートがあらかじめ接続された状態で作成する、といったものです。これは意図して任意としています。特殊な要件を持つチームはこの経路を外れることができますが、その場合は、経路が担っていたはずの運用責任を自ら負うことになります。自前で構築するより速いという理由でエンジニアが選ぶようになったとき、プラットフォームは成功しています。

エンジニアリングの進め方

私たちのアプローチ

最も大きな制約から順に取り除くようにデリバリーの仕組みを改善し、変更のたびにその前後を計測します。

  1. 01

    現状のバリューストリームの可視化

    一つの変更をコミットから本番まで追跡し、すべてのステージ、待ち時間、手作業の工程を、ベースラインとなるDORAメトリクスとともに記録します。これにより、どこで時間が失われ、どこで不具合が持ち込まれているかが分かります。

  2. 02

    ビルドとテストの安定化

    ビルドを再現可能にし、不安定なテストを隔離して修正し、フィードバックが速くなるようパイプラインを再構成します。エンジニアが信頼しないパイプラインは迂回されるため、新しい機能よりも信頼性を優先します。

  3. 03

    アーティファクトと環境の標準化

    各サービスはイミュータブルなアーティファクトを一つビルドし、同じコードで定義された環境を順に昇格させます。設定とシークレットは、デプロイ時にマネージドストアから注入します。

  4. 04

    セキュリティゲートとポリシーゲートの組み込み

    SAST、依存関係、コンテナ、シークレットの各スキャンを、調整したルールと合意した重大度のしきい値とともに追加します。SBOM生成、署名、アドミッションポリシーは、ビルドが安定した後に続けて導入します。

  5. 05

    GitOpsとプログレッシブデリバリーの導入

    デプロイをGitからのリコンサイルに移行し、カナリアまたはブルー/グリーンの戦略と、サービスのメトリクスに連動した自動ロールバックを組み合わせます。フィーチャーフラグによって、リリースの判断をデプロイから切り離します。

  6. 06

    成果のゴールデンパス化

    機能しているパターンを、ほかのチームが採用できるテンプレートとセルフサービスのツールにまとめます。次の改善の指針とするため、メトリクスの収集は継続します。

トレードオフ

設計を左右する判断

アーキテクチャを確定する前に、お客様のチームとともに検討する問いです。

トランクベース開発か、GitFlowか
継続的にデプロイするサービスには、トランクベース開発を選びます。短命なブランチ、フィーチャーフラグ、常にリリース可能なメインブランチによって、統合のコストを低く保てます。リリースブランチのモデルを選ぶのは、パッケージソフトウェアや、ストアの審査サイクルに縛られるモバイルアプリのように、市場に出ている複数のバージョンを同時にサポートしなければならない場合に限ります。GitFlowの長命なブランチは、日々の統合と引き換えに定期的なマージのリスクを抱え込むもので、Webサービスにとって割に合うことはまれです。
カナリア、ブルー/グリーン、ローリングのどのデプロイ方式か
適切なヘルスチェックを備えたステートレスなサービスには、ローリングアップデートが妥当なデフォルトです。統計的に意味のある比較ができるだけのトラフィックがあり、全面公開の前に自動検証を行いたい場合は、カナリアを使います。バージョンを共存させられない場合、即座に切り戻す必要がある場合、あるいはカナリア分析にはトラフィックが少なすぎる場合は、ブルー/グリーンを使います。その際、キャパシティのコストが一時的に2倍になることは受け入れてください。
プッシュ型のCI/CDデプロイか、プル型のGitOpsか
Argo CDやFluxによるプル型のGitOpsは、Kubernetes環境に適しています。クラスターがGitをもとに自らをリコンサイルし、CIはクラスターの認証情報を必要とせず、ドリフトは自動的に修正されます。リコンサイル用のコントローラーを持たないサーバーレス、仮想マシン、マネージドサービスが対象の場合は、パイプラインからのプッシュ型デプロイのほうが依然としてシンプルです。多くの組織は、対象プラットフォームごとに分けて両方を運用しています。
セキュリティの検出結果でビルドをブロックすべきか、警告にとどめるべきか
ブロックの対象は、範囲が狭く確度の高いものに絞ります。漏えいしたシークレット、修正が提供されているクリティカルな脆弱性、署名のない、または未承認のベースイメージです。それ以外はすべて警告とし、担当者と修正期限を定めて追跡します。ノイズの多い検出結果でブロックすると、チームはパイプラインを迂回することを覚えます。何もブロックしなければ、スキャナーは飾りになります。
モノレポか、サービスごとのリポジトリか
モノレポは、サービスをまたぐアトミックな変更、共有ライブラリ、一貫したツールの利用を容易にしますが、Bazel、Nx、Turborepoのように、変更された部分だけをテストするビルドツールが必要です。リポジトリを分けると、チームの独立性とシンプルなパイプラインが得られる代わりに、横断的な変更が難しくなり、共有コードのバージョンがずれていきます。実態としてサービスがどれだけ密結合か、そしてどれだけのビルドエンジニアリングを維持できるかで選んでください。
社内開発者プラットフォームを構築するか、チームごとのパイプラインを維持するか
チームが数えるほどの規模であれば、共有のパイプラインテンプレートと適切なドキュメントで十分であり、プラットフォームチームはオーバーヘッドになります。作業の重複、一貫しないセキュリティ管理策、時間のかかるオンボーディングが計測できるコストになった時点で、プラットフォームに投資します。役に立つ最小限のゴールデンパスから始め、実際の需要に応じて育てていきます。

本番対応

本番運用に耐える条件

セキュリティの確保

パイプラインは、保存されたキーを一切使わず、OIDCフェデレーションと短命なトークンでクラウドプロバイダーに認証し、ジョブごとに最小権限を付与したエフェメラルランナーで実行します。ブランチ保護、必須レビュー、署名付きコミットがソースを守り、署名と来歴の検証が本番へ向かうアーティファクトを守ります。

スケーリング

パイプラインのキャパシティは、オートスケールするランナー、リモートビルドキャッシュ、テストシャーディングによってスケールするため、コードベースが大きくなってもビルド時間は横ばいを保ちます。再利用可能なテンプレートにより、サービス数が増えてもパイプラインの保守負担が同じ割合で増えることはありません。

監視

すべてのデプロイをイベントとして記録し、サービスのダッシュボードに重ねて表示するため、性能や品質の悪化を、その原因となった変更に結び付けることができます。パイプラインの所要時間、キュー待ち時間、失敗の原因、DORAメトリクスを、第一級の運用データとして追跡します。

デプロイ

イミュータブルな単一のアーティファクトを、各ステージでの自動チェックを伴うプルリクエストによって環境間で昇格させ、本番では段階的にロールアウトします。ロールバックはGitでのrevertまたは自動的なトラフィックの切り替えであり、あらかじめリハーサルしておきます。

システム連携

パイプラインは、APIとWebhookを通じて、課題管理システム、チャット、アーティファクトレジストリ、シークレットストア、脆弱性管理、変更管理の各システムと連携します。正式な変更承認が求められる場合は、手作業の工程を追加するのではなく、パイプラインが証跡を自動的に提出します。

使用技術

ワークロードとお客様の既存環境に合わせて選定します。

  • GitHub Actions
  • GitLab CI
  • Jenkins
  • Argo CD
  • Argo Rollouts
  • Flux
  • Terraform
  • Helm
  • Docker
  • Trivy
  • Semgrep
  • Sigstore Cosign
  • Open Policy Agent
  • Backstage

ゼロから本番へ

エンジニアリングライフサイクル

  1. 01

    アイデア

  2. 02

    ディスカバリー

  3. 03

    システムアーキテクチャ

  4. 04

    UX・プロダクトデザイン

  5. 05

    アプリケーション開発

  6. 06

    AI・データレイヤー

  7. 07

    クラウドインフラ

  8. 08

    セキュリティ

  9. 09

    QA・パフォーマンス

  10. 10

    デプロイ

  11. 11

    オブザーバビリティ

  12. 12

    継続的な進化

FAQ

よくあるご質問

DevOpsとDevSecOpsの違いは何ですか

DevOpsは開発と運用を統合し、自動化された再現可能なパイプラインを通じてソフトウェアを届けます。DevSecOpsは、その同じパイプラインの中にセキュリティ管理策を配置します。コード解析、依存関係とイメージのスキャン、シークレット検出、署名、ポリシー適用が、すべての変更に対して自動的に実行されます。実際には、うまく構築されたデリバリーの仕組みは両方を備えており、違いは重点の置き方にあります。

セキュリティスキャンを追加するとパイプラインは遅くなりますか

適切に設計すれば、大きく遅くなることはありません。差分に対する静的解析とシークレット検出はプルリクエスト上で数秒で完了し、重いスキャンはテストと並列に、またはスケジュールで実行します。より大きなリスクはノイズです。そのため、検出結果が対処できるだけの具体性を持つようになるまで、ルールセットとしきい値を調整します。

既存のCI/CDツールのままで対応できますか

はい。原則はツールに依存せず、また、機能しているCIシステムを置き換えることが最も価値の高い変更であることはまれです。現在お使いのツールの中で構成、速度、セキュリティを改善し、移行を推奨するのは、現行のプラットフォームが必要な機能の妨げになっている場合に限ります。

GitOpsの導入にKubernetesは必要ですか

リコンサイル用コントローラーを使う形のGitOpsはKubernetesネイティブのものですが、その根底にあるプラクティスはどこにでも適用できます。あるべき状態をGitに置き、変更はプルリクエストで行い、適用を自動化し、ドリフトを検出するというものです。クラウドリソース向けのTerraformパイプラインやサーバーレスのデプロイも、クラスターなしで同じモデルに従うことができます。

デリバリーが改善したかどうかはどう測りますか

パイプラインとインシデントのデータから取得した4つのDORAメトリクスを、開始時に記録したベースラインと比較します。あわせて、パイプラインの所要時間、不安定なテストの割合、エンジニアが環境を待つ時間も追跡します。これらが、主要なメトリクスが動く理由を説明するためです。

本番環境で動くシステムが必要な方へ

構築しようとしているものをお聞かせください。エンジニアが内容を拝見し、2営業日以内にご返信します。