1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Backstage+Crossplane+ArgoCDで構築するPlatform Engineeringの設計と導入

1
Last updated at Posted at 2026-03-09

Backstage+Crossplane+ArgoCDで構築するPlatform Engineeringの設計と導入

この記事でわかること

  • Platform Engineeringの基本概念と、なぜ従来のDevOpsだけでは開発者体験が向上しないのか
  • Backstage・Crossplane・ArgoCDの「Golden Triangle」アーキテクチャでIDP(内部開発者プラットフォーム)を設計する方法
  • Crossplane CompositionとBackstage Software Templateを組み合わせたセルフサービスインフラ構築の実装例
  • Golden Path(推奨パス)の設計原則と、開発者の認知負荷を40〜50%削減するための戦略
  • DORA・SPACEメトリクスによるPlatform Engineering導入効果の測定手法

対象読者

  • 想定読者: Kubernetesの基本操作を理解しているMLエンジニア・インフラエンジニア
  • 必要な前提知識:
    • Kubernetes v1.28以降の基本操作(kubectl apply、マニフェスト作成)
    • YAML記法の基礎
    • GitOpsの概念(Gitリポジトリを信頼できる唯一の情報源として扱う考え方)
    • Helmチャートの基本的な利用経験

結論・成果

Platform Engineeringを導入した組織では、Gartnerの調査によると開発者のセルフサービス率が向上し、インフラリクエストのチケット待ち時間が数日から数分に短縮されたと報告されています。Backstage+Crossplane+ArgoCDの「Golden Triangle」構成により、開発者はKubernetesのマニフェストやクラウドAPIの詳細を意識せず、Backstageのカタログからワンクリックでインフラをプロビジョニングできるようになります。

Jellyfish社の調査では、成熟したPlatformチームが開発者の認知負荷を40〜50%削減し、Developer Experience Index(DXI)で1ポイント改善するごとに開発者1人あたり週13分の時間節約、100人規模の組織で年間約$100Kのコスト削減効果があると報告されています。

Platform Engineeringの基礎を理解する

DevOpsとPlatform Engineeringの違い

DevOpsは「開発チームと運用チームの壁を取り払う」という文化的ムーブメントとして広まりました。しかし実際には、各開発チームがCI/CDパイプライン、Kubernetesマニフェスト、モニタリング設定などを個別に構築・管理する状況が生まれ、「全員がインフラも担当する」という認知負荷の増大を招いたケースが多く報告されています。

Platform Engineeringは、この問題に対して社内向けの製品(Internal Developer Platform: IDP)を構築するアプローチで対処します。Platformチームがインフラの複雑さを抽象化し、開発者にはセルフサービスのインターフェースだけを提供します。

観点 従来のDevOps Platform Engineering
インフラ管理 各チームが個別に管理 Platformチームが共通基盤を提供
開発者体験 ツール選定から自力で実施 Golden Pathで推奨構成を提供
認知負荷 全員がKubernetes/IaCを理解 必要な抽象レベルのみ公開
ガバナンス チームごとにバラバラ Policy-as-Codeで統一
スケーラビリティ チーム数に比例して複雑化 プラットフォームが吸収

IDP(内部開発者プラットフォーム)とは

IDP(Internal Developer Platform)は、開発者がコードのデプロイやインフラリクエストなどの日常的な作業をセルフサービスで実行できるようにする、標準化されたツールと技術の集合体です。Red Hatの定義によると、IDPは技術的な複雑さを抽象化し、開発者の認知負荷を削減することを目的としています。

IDPには「Developer Portal」(Backstageなど)と「Developer Platform」(Crossplane + ArgoCDなど)の2つの側面があります。Portalはカタログ・ドキュメント・テンプレートを提供するUIレイヤーで、Platformはインフラプロビジョニング・デプロイ・ポリシー適用を担うバックエンドレイヤーです。

注意: IDPは「Internal Developer Portal」と「Internal Developer Platform」の2つの意味で使われることがあります。Portalは情報の集約とUI提供、Platformはインフラ自動化とセルフサービスを指します。本記事では両者を含む「プラットフォーム」の意味でIDPを使用します。

Platform as a Productの考え方

Platform Engineeringで最も重要な原則は、プラットフォームを社内製品として扱うことです。InfoWorldが報告する8つのアンチパターンの筆頭に「プロダクト思考の欠如」が挙げられています。

具体的には以下の実践を意味します。

  • ユーザーリサーチ: 開発者へのインタビューとアンケートで課題を把握
  • プロダクトロードマップ: 四半期ごとの機能追加計画を公開
  • ドッグフーディング: Platformチーム自身がプラットフォームの最初のユーザーになる
  • NPS測定: 四半期ごとに開発者満足度を計測し、改善サイクルを回す

よくある間違い: 最初は「既存のインフラチームをPlatform Engineeringチームにリブランディングすればよい」と考えがちですが、実際にはプロダクトマネージャーの役割を含むチーム構成が必要です。技術だけでなく、ユーザーリサーチやフィードバックループの設計が成功の鍵になります。

Golden Triangleアーキテクチャを設計する

Backstage・ArgoCD・Crossplaneを組み合わせた「Golden Triangle」は、CNCF(Cloud Native Computing Foundation)プロジェクトを中心としたIDP構築の定番アーキテクチャとして2025〜2026年に広く採用されています。

Backstage: 開発者ポータルを構築する

BackstageはSpotifyが開発しオープンソース化した開発者ポータルフレームワークです。CNCFのIncubatingプロジェクトであり、組織を横断したソフトウェアのカタログ管理、テンプレートによるプロジェクト作成、ドキュメント集約を1つのUIで提供します。2026年時点で、IDPを導入した組織の約89%がBackstageを採用しているとRoadie社のレポートで報告されています。

Backstageの核となる機能はSoftware Template(Scaffolder)です。開発者がUIから必要なパラメータを入力すると、テンプレートに基づいてGitリポジトリの作成、Kubernetesマニフェストの生成、カタログへの登録を自動実行します。

以下は、PostgreSQLデータベースをCrossplane経由でプロビジョニングするBackstage Software Templateの例です。

# backstage-templates/postgres-database/template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: provision-postgres
  title: PostgreSQL Database Provisioning
  description: Crossplane経由でRDS PostgreSQLインスタンスを作成します
  tags:
    - database
    - postgresql
    - crossplane
spec:
  owner: platform-team
  type: resource

  # 開発者が入力するパラメータ定義
  parameters:
    - title: Database Configuration
      required:
        - name
        - environment
      properties:
        name:
          title: Database Name
          type: string
          description: データベースの識別名
          pattern: "^[a-z][a-z0-9-]{2,28}[a-z0-9]$"
        environment:
          title: Environment
          type: string
          enum:
            - development
            - staging
            - production
          description: デプロイ先環境
        instanceSize:
          title: Instance Size
          type: string
          default: small
          enum:
            - small    # db.t3.micro
            - medium   # db.t3.small
            - large    # db.r6g.large
          description: インスタンスサイズ(本番はmedium以上推奨)
        storageGB:
          title: Storage Size (GB)
          type: integer
          default: 20
          minimum: 20
          maximum: 1000

  # テンプレートの実行ステップ
  steps:
    # Crossplane Claimマニフェストを生成してGitリポジトリにpush
    - id: create-claim
      name: Generate Crossplane Claim
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          environment: ${{ parameters.environment }}
          instanceSize: ${{ parameters.instanceSize }}
          storageGB: ${{ parameters.storageGB }}

    - id: publish
      name: Push to GitOps Repository
      action: publish:github:pull-request
      input:
        repoUrl: github.com?repo=infra-gitops&owner=my-org
        title: "feat: provision PostgreSQL ${{ parameters.name }}"
        branchName: "provision-db-${{ parameters.name }}"
        description: |
          Crossplane経由でPostgreSQL (${{ parameters.environment }}) を作成

    # Backstageカタログに登録
    - id: register
      name: Register in Catalog
      action: catalog:register
      input:
        catalogInfoUrl: https://github.com/my-org/infra-gitops/blob/main/databases/${{ parameters.name }}/catalog-info.yaml

なぜBackstageを選んだか:

  • CNCF Incubatingプロジェクトとして活発にメンテナンスされている
  • プラグインエコシステムが豊富(2026年時点で200以上の公開プラグイン)
  • Software TemplateのScaffolderにより、任意のワークフローをノーコードで定義可能
  • 他のIDPツール(Port、Cortexなど)と比較してベンダーロックインが少ない

注意: Backstageは柔軟性が高い反面、初期構築に一定の工数が必要です。Roadie社のレポートでは「DIYでのBackstage構築は運用コストが想定以上にかかる」と指摘されており、小規模チーム(10人以下)の場合はマネージドBackstageサービス(Roadie、Cortex等)の検討も有効です。

Crossplane: Kubernetesネイティブのインフラプロビジョニング

Crossplaneは、Kubernetes APIを通じてクラウドリソースをプロビジョニングするCNCF Graduatedプロジェクトです。2025年11月にCNCFを卒業し、成熟度と広範な採用が認められました。

Crossplaneの核心はCompositionという仕組みです。複数のクラウドリソース(例: RDSインスタンス + セキュリティグループ + サブネットグループ)を1つのカスタムリソースとして抽象化し、開発者には簡潔なインターフェースだけを公開します。

まず、XRD(CompositeResourceDefinition)で開発者向けのAPIを定義します。

# crossplane/xrd-postgres.yaml
apiVersion: apiextensions.crossplane.io/v2
kind: CompositeResourceDefinition
metadata:
  name: postgresinstances.database.example.com
spec:
  group: database.example.com
  names:
    kind: PostgresInstance
    plural: postgresinstances
  # Namespaced scopeで開発者がClaimとして利用可能
  claimNames:
    kind: PostgresClaim
    plural: postgresclaims
  versions:
    - name: v1
      served: true
      referenceable: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                # 開発者が指定するパラメータ(最小限に抑える)
                environment:
                  type: string
                  enum: ["development", "staging", "production"]
                storageGB:
                  type: integer
                  default: 20
                  minimum: 20
                  maximum: 1000
                instanceSize:
                  type: string
                  enum: ["small", "medium", "large"]
                  default: "small"
              required:
                - environment
            status:
              type: object
              properties:
                endpoint:
                  type: string
                port:
                  type: integer
                status:
                  type: string

次に、Compositionで実際のAWSリソースへのマッピングを定義します。

# crossplane/composition-postgres-aws.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: postgres-aws
  labels:
    provider: aws
    database: postgresql
spec:
  compositeTypeRef:
    apiVersion: database.example.com/v1
    kind: PostgresInstance
  mode: Pipeline
  pipeline:
    - step: patch-and-transform
      functionRef:
        name: crossplane-contrib-function-patch-and-transform
      input:
        apiVersion: pt.fn.crossplane.io/v1beta1
        kind: Resources
        resources:
          # RDS SubnetGroup
          - name: subnet-group
            base:
              apiVersion: rds.aws.upbound.io/v1beta1
              kind: SubnetGroup
              spec:
                forProvider:
                  region: ap-northeast-1
                  subnetIds:
                    - subnet-xxxxxxxxx
                    - subnet-yyyyyyyyy
                  tags:
                    managed-by: crossplane

          # RDS Instance
          - name: rds-instance
            base:
              apiVersion: rds.aws.upbound.io/v1beta2
              kind: Instance
              spec:
                forProvider:
                  region: ap-northeast-1
                  engine: postgres
                  engineVersion: "16.4"
                  autoMinorVersionUpgrade: true
                  backupRetentionPeriod: 7
                  deletionProtection: true
                  storageEncrypted: true
                  # パスワードはKubernetes Secretから参照
                  passwordSecretRef:
                    name: db-master-password
                    namespace: crossplane-system
                    key: password
            patches:
              # instanceSizeに基づくインスタンスクラスのマッピング
              - type: FromCompositeFieldPath
                fromFieldPath: spec.instanceSize
                toFieldPath: spec.forProvider.instanceClass
                transforms:
                  - type: map
                    map:
                      small: db.t3.micro
                      medium: db.t3.small
                      large: db.r6g.large
              # storageGBのマッピング
              - type: FromCompositeFieldPath
                fromFieldPath: spec.storageGB
                toFieldPath: spec.forProvider.allocatedStorage
              # ステータスへのエンドポイント書き戻し
              - type: ToCompositeFieldPath
                fromFieldPath: status.atProvider.endpoint
                toFieldPath: status.endpoint

開発者は以下の簡潔なClaimだけを書けばデータベースが作成されます。

# 開発者が書くのはこれだけ
apiVersion: database.example.com/v1
kind: PostgresClaim
metadata:
  name: my-app-db
  namespace: team-alpha
spec:
  environment: staging
  instanceSize: medium
  storageGB: 50

制約条件: Crossplaneは強力ですが、すべてのクラウドリソースをサポートしているわけではありません。AWSプロバイダー(upbound/provider-aws)はほとんどのサービスをカバーしていますが、新しいAWSサービスへの対応には数週間のラグがあります。また、Compositionのデバッグは複雑で、crossplane beta traceコマンドによるリソース依存関係の追跡が必要になる場面があります。

ArgoCD: GitOpsでデプロイを自動化する

ArgoCDは、Gitリポジトリの状態をKubernetesクラスタに自動同期するGitOpsコントローラーです。CNCF Graduatedプロジェクトであり、Gitに格納されたマニフェストを「Single Source of Truth」としてクラスタの状態を宣言的に管理します。

Golden Triangleにおいて、ArgoCDは以下の役割を担います。

  1. Backstageが生成したマニフェストの自動デプロイ: Backstage TemplateがGitリポジトリにpushしたCrossplane Claimを自動検知し、クラスタに適用
  2. ドリフト検知: クラスタの実態とGitの宣言の差分を検知・修正
  3. マルチクラスタ管理: 複数のKubernetesクラスタへのデプロイを一元管理
# argocd/application-infra.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: infra-crossplane-claims
  namespace: argocd
spec:
  project: platform
  source:
    repoURL: https://github.com/my-org/infra-gitops
    targetRevision: main
    path: crossplane-claims/
    directory:
      recurse: true
  destination:
    server: https://kubernetes.default.svc
    namespace: crossplane-system
  syncPolicy:
    automated:
      prune: true       # Git上で削除されたリソースはクラスタからも削除
      selfHeal: true     # 手動変更を自動的にGitの状態に戻す
    syncOptions:
      - CreateNamespace=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

トレードオフ: ArgoCDのselfHeal: trueは強力ですが、緊急時のホットフィックス(直接kubectl editする運用)が無効化されます。本番環境ではselfHealを有効にしつつ、緊急時の一時停止手順(argocd app pause-sync相当)を運用マニュアルに含める必要があります。

Golden Pathを設計して開発者体験を向上させる

Golden Pathとは

Golden Path(推奨パス)は、プラットフォームが提供する「最も推奨される開発・デプロイの道筋」です。Red Hatの定義によると、Golden Pathは開発者の日常的な作業(クラウドへのデプロイ、他チームへのサービスリクエストなど)をセルフサービスで実行できるようにするものです。

重要なのは、Golden Pathは強制ではなくガイドレールであることです。開発者は推奨パスから外れることもできますが、推奨パスに従えば「セキュリティ・コンプライアンス・監視がデフォルトで組み込まれた」環境を得られます。

Golden Path設計の5原則

Golden Pathを設計する際に守るべき5つの原則を紹介します。

1. 90%ルール: ユースケースの90%をカバーすることを目指し、残り10%のエッジケースは個別対応とする。Xebia社の報告では、この割り切りがプラットフォームの複雑さを指数的に削減すると述べられています。

2. Composability(構成可能性): テンプレートは組み合わせ可能な小さなモジュールとして設計する。「Webアプリ + PostgreSQL + Redis」のように、必要なコンポーネントを選択して組み合わせられるようにします。

3. Escape Hatch(脱出口): Golden Pathに従えないケースのために、手動設定やカスタムCompositionへの移行パスを用意する。

4. Progressive Disclosure(段階的開示): 初期設定では最小限のパラメータだけを表示し、詳細設定は「Advanced」セクションに隠す。Backstage TemplateのJSONスキーマで実現できます。

5. Feedback Loop(フィードバックループ): テンプレートの利用率・完了率・エラー率を計測し、四半期ごとに改善する。

ハマりポイント: Golden Pathのテンプレート数を増やしすぎると、開発者がどれを選べばよいか分からなくなる「Choice Paralysis(選択のパラドックス)」が発生します。最初は3〜5個のテンプレートから始め、利用データに基づいて段階的に追加するのが効果的です。

セルフサービスフローの実装例

Backstage TemplateからCrossplane経由でインフラをプロビジョニングし、ArgoCDが自動デプロイするフローを実装してみましょう。

以下は、開発者がBackstage UIから新規マイクロサービスを作成する際のテンプレート例です。

# backstage-templates/microservice/template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: create-microservice
  title: Create New Microservice
  description: |
    Golden Path: Kubernetes上にデプロイされる
    マイクロサービスの雛形を作成します
spec:
  owner: platform-team
  type: service

  parameters:
    - title: Service Details
      required:
        - serviceName
        - owner
      properties:
        serviceName:
          title: Service Name
          type: string
          pattern: "^[a-z][a-z0-9-]{2,30}[a-z0-9]$"
        owner:
          title: Owner Team
          type: string
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind: Group
        language:
          title: Language
          type: string
          default: python
          enum:
            - python
            - typescript
            - go
        description:
          title: Description
          type: string

    - title: Infrastructure
      properties:
        needsDatabase:
          title: PostgreSQL Database
          type: boolean
          default: false
        needsRedis:
          title: Redis Cache
          type: boolean
          default: false
        environment:
          title: Initial Environment
          type: string
          default: development
          enum:
            - development
            - staging

  steps:
    # アプリケーションコードのスキャフォールディング
    - id: fetch-skeleton
      name: Fetch Service Skeleton
      action: fetch:template
      input:
        url: ./skeletons/${{ parameters.language }}
        values:
          serviceName: ${{ parameters.serviceName }}
          owner: ${{ parameters.owner }}
          description: ${{ parameters.description }}

    # Crossplane Claimの生成(DB/Redisが必要な場合)
    - id: generate-infra
      name: Generate Infrastructure Claims
      action: fetch:template
      input:
        url: ./infra-claims
        values:
          serviceName: ${{ parameters.serviceName }}
          needsDatabase: ${{ parameters.needsDatabase }}
          needsRedis: ${{ parameters.needsRedis }}
          environment: ${{ parameters.environment }}

    # GitHubリポジトリの作成
    - id: publish
      name: Create GitHub Repository
      action: publish:github
      input:
        repoUrl: github.com?repo=${{ parameters.serviceName }}&owner=my-org
        defaultBranch: main
        protectDefaultBranch: true
        repoVisibility: internal

    # Backstageカタログに登録
    - id: register
      name: Register Component
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
        catalogInfoPath: /catalog-info.yaml

  output:
    links:
      - title: Repository
        url: ${{ steps.publish.output.remoteUrl }}
      - title: Open in Backstage
        icon: catalog
        entityRef: ${{ steps.register.output.entityRef }}

このテンプレートが実行されると、以下が自動的に行われます。

  1. 選択した言語のボイラープレートコードを含むGitHubリポジトリが作成される
  2. DBやRedisが必要な場合、Crossplane Claimがリポジトリに含まれる
  3. ArgoCDが新しいリポジトリを検知し、Kubernetesへデプロイする
  4. Backstageカタログにサービスが登録され、オーナーやドキュメントが紐付く

アンチパターンを回避してPlatform Engineeringを成功させる

Platform Engineeringの導入には多くの落とし穴があります。InfoWorldの報告する8つのアンチパターンとserce.meの「Six Sins of Platform Teams」から、特に重要な4つを紹介します。

アンチパターン1: Big-Bang導入

問題: プラットフォーム全体を一度に構築・リリースしようとすること。完成までに6〜12ヶ月かかり、リリース時には開発者のニーズが変わっている。

対策: MVPアプローチを採用する。最初は最も痛みの大きい1つのユースケース(例: データベースのプロビジョニング)だけを自動化し、開発者のフィードバックを得てから拡張する。

# 段階的導入のロードマップ例
# platform_roadmap.py

phases = {
    "Phase 1 (Month 1-2)": {
        "goal": "最初のGolden Pathを1つ提供",
        "deliverables": [
            "Backstage初期セットアップ",
            "PostgreSQL Crossplane Composition",
            "ArgoCD GitOps設定",
        ],
        "success_metric": "3チーム以上がセルフサービスでDB作成",
        "anti_pattern": "全インフラをカバーしようとしない",
    },
    "Phase 2 (Month 3-4)": {
        "goal": "マイクロサービステンプレート追加",
        "deliverables": [
            "言語別スキャフォールディング",
            "CI/CDパイプライン自動生成",
            "監視ダッシュボード自動作成",
        ],
        "success_metric": "新規サービス作成の80%がテンプレート経由",
    },
    "Phase 3 (Month 5-6)": {
        "goal": "ガバナンスとセキュリティの統合",
        "deliverables": [
            "OPA/Kyverno Policy-as-Code",
            "コスト可視化ダッシュボード",
            "セキュリティスキャン自動化",
        ],
        "success_metric": "セキュリティ監査指摘事項ゼロ",
    },
}

# 各フェーズのKPI追跡
def calculate_adoption_rate(
    self_service_requests: int, total_requests: int
) -> float:
    """セルフサービス率 = セルフサービスリクエスト / 全リクエスト"""
    if total_requests == 0:
        return 0.0
    return (self_service_requests / total_requests) * 100

アンチパターン2: プロダクト思考の欠如

問題: プラットフォームを「インフラチームの内部ツール」として構築し、開発者のフィードバックを集めない。技術的に優れていても、開発者が使いたいと思わないプラットフォームになる。

対策: Platformチームにプロダクトマネージャーを配置し、開発者の痛みを定期的にヒアリングする。JellyFish社の推奨する17のメトリクスのうち、NPS(Net Promoter Score)と利用率を最低限追跡する。

アンチパターン3: 全ユースケースへの対応

問題: 全チームの全要件に対応しようとして、プラットフォームが複雑化する。Xebia社の報告では「最後の10%が複雑さを指数的に増加させる」と警告されています。

対策: 前述の90%ルールを厳守する。標準外の要件には、Crossplane Compositionのカスタマイズポイント(パラメータの追加)で対応し、Composition自体の分岐は避ける。

アンチパターン4: 単一障害点の人依存

問題: 数人のDevOpsエキスパートにプラットフォームの知識が集中し、その人が離職すると運用が破綻する。

対策: ドキュメント駆動開発を徹底する。BackstageのTechDocsプラグインを活用し、すべてのCompositionとTemplateにドキュメントを自動生成する。また、ペアプログラミングやローテーションで知識を分散させる。

アンチパターン 症状 対策 測定指標
Big-Bang導入 リリースが遅延し続ける MVP + 段階的拡張 Time to First User
プロダクト思考の欠如 利用率が上がらない PM配置 + NPS測定 NPS、月間アクティブユーザー
全ユースケース対応 Compositionが複雑化 90%ルール テンプレート数、Composition行数
人依存 特定メンバー不在で障害対応不能 TechDocs + ローテーション ドキュメントカバレッジ率

DORA・SPACEメトリクスで導入効果を測定する

Platform Engineeringの効果は、感覚ではなくデータで示す必要があります。2025年のState of Platform Engineering Reportでは、40.9%のプラットフォーム施策が初年度に測定可能な価値を示せなかったと報告されています。適切なメトリクス設計が不可欠です。

DORAメトリクスの活用

DORAメトリクスは、ソフトウェアデリバリのパフォーマンスを測定する業界標準フレームワークです。採用率40.8%で最も広く使われています。

メトリクス 説明 エリートチームの基準 Platform Engineering導入後の期待値
デプロイ頻度 コードを本番にデプロイする頻度 オンデマンド(1日複数回) 週次→日次への改善
変更リードタイム コミットから本番稼働までの時間 24時間以内 数日→数時間への短縮
変更失敗率 デプロイ後に障害が発生する割合 5%以下 Golden Pathの標準化で低減
復旧時間 障害発生から復旧までの時間 1時間以内 セルフヒーリング + 自動ロールバックで短縮

SPACEフレームワークの補完

DORAメトリクスだけでは開発者体験の全体像を捉えられません。SPACEフレームワーク(Satisfaction、Performance、Activity、Communication、Efficiency)を組み合わせることで、定量的・定性的の両面から評価できます。

# platform_metrics.py
# Platform Engineering効果測定ダッシュボードの構成例

from dataclasses import dataclass
from enum import Enum


class MetricCategory(Enum):
    DORA = "dora"
    ADOPTION = "adoption"
    DEVELOPER_EXPERIENCE = "developer_experience"
    BUSINESS_VALUE = "business_value"


@dataclass
class PlatformMetric:
    name: str
    category: MetricCategory
    description: str
    target: str
    measurement: str


# Platform Engineering推奨メトリクスセット
PLATFORM_METRICS = [
    # DORA メトリクス
    PlatformMetric(
        name="deployment_frequency",
        category=MetricCategory.DORA,
        description="本番デプロイ頻度",
        target="日次以上",
        measurement="ArgoCD sync回数 / 日",
    ),
    PlatformMetric(
        name="lead_time_for_changes",
        category=MetricCategory.DORA,
        description="コミットから本番までのリードタイム",
        target="24時間以内",
        measurement="GitコミットからArgoCD sync完了までの時間",
    ),
    # 採用メトリクス
    PlatformMetric(
        name="self_service_rate",
        category=MetricCategory.ADOPTION,
        description="セルフサービスで完了したインフラリクエストの割合",
        target="80%以上",
        measurement="Backstage Template実行数 / 全インフラリクエスト数",
    ),
    PlatformMetric(
        name="time_to_first_deploy",
        category=MetricCategory.ADOPTION,
        description="新規サービスの初回デプロイまでの時間",
        target="30分以内",
        measurement="Backstage Template開始からArgoCD初回sync完了まで",
    ),
    # 開発者体験メトリクス
    PlatformMetric(
        name="developer_nps",
        category=MetricCategory.DEVELOPER_EXPERIENCE,
        description="プラットフォームに対する開発者NPS",
        target="30以上",
        measurement="四半期アンケート",
    ),
    PlatformMetric(
        name="cognitive_load_score",
        category=MetricCategory.DEVELOPER_EXPERIENCE,
        description="開発者の認知負荷スコア(1-10)",
        target="4以下",
        measurement="SPACE frameworkアンケート",
    ),
    # ビジネス価値メトリクス
    PlatformMetric(
        name="platform_roi",
        category=MetricCategory.BUSINESS_VALUE,
        description="プラットフォームROI",
        target="初年度で200%以上",
        measurement="(開発者時間節約額 + インフラ削減額) / Platformチームコスト",
    ),
]


def calculate_platform_roi(
    developer_hours_saved: float,
    hourly_rate: float,
    infra_savings: float,
    platform_team_cost: float,
) -> float:
    """
    Platform ROIの算出式(Jellyfish社推奨)
    ROI = (開発者時間節約額 + インフラ削減額) / Platformチームコスト
    """
    total_savings = (developer_hours_saved * hourly_rate) + infra_savings
    if platform_team_cost == 0:
        raise ValueError("Platform team cost must be greater than 0")
    return (total_savings / platform_team_cost) * 100

メトリクス導入時の注意点

注意: メトリクスの導入初期にありがちな失敗は、「測定すること自体が目的化する」ことです。JellyFish社は17のメトリクスを提示していますが、最初から全てを追跡する必要はありません。まずはセルフサービス率開発者NPSの2つに絞り、四半期ごとに追加メトリクスを検討することを推奨します。

よくある問題と解決方法

問題 原因 解決方法
Backstageの初期構築に時間がかかる プラグイン選定とカスタマイズの工数が大きい マネージドBackstage(Roadie等)の検討、または最小構成から開始
Crossplane Compositionのデバッグが困難 エラーがネストしたリソースの深い階層で発生 crossplane beta traceコマンドで依存関係を可視化
ArgoCDの同期が遅い 大量のリソースを監視している ApplicationSetでリソースを分割、syncオプションのチューニング
開発者がGolden Pathを使わない テンプレートが複雑、または要件に合わない 利用率データに基づくテンプレート改善、ユーザーインタビュー実施
Platformチームがボトルネックになる リクエスト対応に追われ、プラットフォーム開発が進まない セルフサービス化の優先、チケット対応のSLA設定
Compositionの変更でリソースが再作成される CrossplaneのmanagementPolicies設定不足 ObserveOnlyポリシーの活用、変更影響のdry-run確認

まとめと次のステップ

まとめ:

  • Platform Engineeringは、DevOpsの「全員がインフラを管理する」負荷を、社内製品としてのプラットフォームで解決するアプローチ
  • Backstage(Developer Portal)+ ArgoCD(GitOps)+ Crossplane(Infrastructure Provisioning)の「Golden Triangle」が2025-2026年のIDP構築の定番構成
  • Golden Path設計では90%ルールを守り、段階的に拡張する。Big-Bang導入は失敗の最大要因
  • DORA + SPACEメトリクスで効果を定量化し、セルフサービス率開発者NPSを最優先で追跡する
  • プラットフォームは「構築したら終わり」ではなく、継続的なフィードバックループで改善し続ける

次にやるべきこと:

  1. 現状分析: 開発者へのアンケートで最も痛みの大きいインフラ作業を特定する
  2. MVPの構築: Backstage + Crossplaneで1つのGolden Path(例: データベースのセルフサービス)を構築する
  3. メトリクスの設定: セルフサービス率と開発者NPSの計測を開始する

参考


注意: この記事はAI(Claude Code)により自動生成されました。内容の正確性については複数の情報源で検証していますが、実際の利用時は公式ドキュメントもご確認ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?