プラットフォームエンジニアリングは、Gartnerのバズワードから運用上の現実へと変貌しました。2026年までに、大規模なソフトウェアエンジニアリング組織の80%が、アプリケーションデリバリーのための再利用可能なサービス、コンポーネント、ツールを提供する専任のプラットフォームチームを持つようになるでしょう。成功している組織は、単にインフラを構築しているだけではなく、自社の開発者が実際に使いたいと思う製品を構築しています。
成功するInternal Developer Platformと、高価な棚ぼた製品との違いは一つに集約されます:プラットフォームを開発者を顧客とする製品として扱うことです。これは、導入率を測定し(単なる利用ではなく)、チーム全体で自発的な採用を獲得し、開発者ワークフローにおける摩擦を絶え間なく削減することを意味します。
このガイドでは、モダンなプラットフォームエンジニアリングの実践的なアーキテクチャを扱います — 何を構築すべきか、どのツールを使うか、チームをどう構成するか、そしてプラットフォームが実際に機能しているかをどう測定するかについてです。
プラットフォームエンジニアリングが存在する理由
プラットフォームエンジニアリングが解決する問題は明快です:組織がスケールするにつれて、開発者がやるべきこと(フィーチャーの出荷)と対処しなければならないこと(インフラ、セキュリティ、コンプライアンス、オブザーバビリティ)の間のギャップが広がり、最終的に運用の複雑さの重みで生産性が崩壊します。
プラットフォームなしでは、新しいサービスをデプロイするための典型的な開発者ワークフローは次のようになります:
- ランタイムを選択する(コンテナ?サーバーレス?VM?)
- Dockerfileを書く(安全であることを祈りながら)
- CI/CDをセットアップする(パイプライン、シークレット、環境の設定)
- インフラをプロビジョニングする(Terraform?CloudFormation?コンソールをクリック?)
- ネットワーキングを設定する(Ingress、ロードバランサー、DNS、TLS証明書)
- モニタリングをセットアップする(どのツール?ログはどこに?どのアラート?)
- シークレット管理を処理する(Vault?環境変数?最善を祈る?)
- セキュリティ要件に対応する(スキャニング、ポリシー、コンプライアンスチェック)
- ドキュメントを書く(たぶん)
- 変更レビュープロセスを通過する(いつかは)
各ステップには、ほとんどのアプリケーション開発者がする必要のない意思決定が含まれています。プラットフォームチームの仕事は、これらの意思決定をセルフサービス機能にエンコードし、開発者が「コードがある」から「プロダクションで稼働中」まで、セキュリティ、コンプライアンス、運用標準が自動的に満たされるガードレール付きでスキップできるようにすることです。
プラットフォームがあれば、同じワークフローは次のようになります:
- サービスカタログからテンプレートを選ぶ
- 空欄を埋める(サービス名、チーム、ティア)
- コードをプッシュする
- CI/CD、モニタリング、ネットワーキング、セキュリティが組み込まれた状態でデプロイされる
これが価値提案です:認知負荷を軽減しながら組織の標準を強制する、キュレートされたセルフサービス体験です。
Internal Developer Platformのアーキテクチャ
適切に構造化されたIDPには5つのレイヤーがあり、それぞれが異なる目的を果たします:
レイヤー1:開発者ポータル(インターフェース)
開発者ポータルはプラットフォームのショーフロントです。開発者がサービスを発見し、ドキュメントを読み、新しいプロジェクトを作成し、デプロイメントのステータスを表示する場所です。Backstageは元々Spotifyが構築し、現在はCNCFのインキュベーションプロジェクトであり、IDPを導入した組織の中で約89%の市場シェアを持っています。
ポータルは以下を提供します:
- ソフトウェアカタログ:すべてのチームが所有するすべてのサービス、API、ライブラリ、インフラコンポーネントのレジストリ。
- テンプレート(Golden Path):組織のベストプラクティスをエンコードした事前設定済みのプロジェクトスキャフォールド。
- TechDocs:ポータルで直接レンダリングされるDocumentation-as-Code。
- プラグインエコシステム:CI/CD、モニタリング、クラウドプロバイダー、セキュリティツールとの拡張可能な統合。
# catalog-info.yaml — Backstageにサービスを登録する
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-service
description: Handles payment processing and billing
annotations:
github.com/project-slug: myorg/payment-service
backstage.io/techdocs-ref: dir:.
pagerduty.com/service-id: P1A2B3C
tags:
- python
- payments
- tier-1
links:
- url: https://grafana.internal/d/payments
title: Grafana Dashboard
icon: dashboard
spec:
type: service
lifecycle: production
owner: team-payments
system: billing
providesApis:
- payments-api
dependsOn:
- component:user-service
- resource:payments-db
レイヤー2:Golden Path(舗装された道)
Golden Pathはプラットフォームの最もインパクトのある機能です。開発者が意思決定をする必要がないように、インフラを通る意見のある事前設定済みのパスです。キーワードは「意見のある」です — Golden Pathは「この会社ではPython APIサービスをこのように構築する」と述べ、ゼロからプロダクションまでに必要なすべてを提供します。
良いGolden Pathには以下が含まれます:
- 標準のディレクトリ構造を持つプロジェクトスキャフォールド
- 事前設定済みのCI/CDパイプライン
- セキュリティ標準に基づいて構築されたDockerfile
- Kubernetesマニフェストまたはデプロイメント設定
- モニタリングダッシュボードとアラートルール
- パイプラインに統合されたセキュリティスキャニング
- ドキュメントテンプレート
# template.yaml — Python API用のBackstage Software Template
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: python-api-service
title: Python API Service
description: |
Create a production-ready Python API service with FastAPI,
Docker, CI/CD, monitoring, and security scanning pre-configured.
tags:
- python
- fastapi
- recommended
spec:
owner: team-platform
type: service
parameters:
- title: Service Information
required:
- name
- owner
- description
properties:
name:
title: Service Name
type: string
pattern: '^[a-z][a-z0-9-]*$'
description: Lowercase alphanumeric with hyphens
description:
title: Description
type: string
maxLength: 200
owner:
title: Owner Team
type: string
ui:field: OwnerPicker
ui:options:
allowedKinds: [Group]
- title: Infrastructure
properties:
tier:
title: Service Tier
type: string
enum: [tier-1, tier-2, tier-3]
enumNames:
- "Tier 1 — Business critical (99.9% SLA)"
- "Tier 2 — Important (99.5% SLA)"
- "Tier 3 — Internal tooling (best effort)"
default: tier-2
database:
title: Database
type: string
enum: [none, postgresql, redis, both]
default: none
steps:
- id: scaffold
name: Generate Project
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
owner: ${{ parameters.owner }}
description: ${{ parameters.description }}
tier: ${{ parameters.tier }}
database: ${{ parameters.database }}
- id: publish
name: Create Repository
action: publish:github
input:
repoUrl: github.com?owner=myorg&repo=${{ parameters.name }}
description: ${{ parameters.description }}
defaultBranch: main
protectDefaultBranch: true
requireCodeOwnerReviews: true
- id: register
name: Register in Catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yaml
- id: create-argocd-app
name: Setup Deployment
action: argocd:create-application
input:
appName: ${{ parameters.name }}
repoUrl: ${{ steps.publish.output.remoteUrl }}
path: k8s/overlays/production
レイヤー3:インフラオーケストレーション
ポータルとテンプレートの背後には、実際にインフラをプロビジョニングし管理するレイヤーが必要です。2026年のベースラインスタックは:
- Kubernetes:コンテナオーケストレーション用(EKS、GKE、AKS、またはセルフマネージド)
- TerraformまたはOpenTofu:インフラプロビジョニング用
- ArgoCDまたはFlux:GitOpsベースのデプロイメント用
- Crossplane:Kubernetesネイティブのインフラ管理用
Crossplaneは特別な注目に値します。プラットフォームチームがインフラをKubernetesカスタムリソースとして公開できるからです。開発者がTerraformを書く代わりに、データベースを要求するYAMLマニフェストを提出し、CrossplaneがクラウドプロバイダーのAPIを通じてプロビジョニングします。
# Crossplaneを通じてPostgreSQLデータベースを要求する
apiVersion: database.platform.example.com/v1alpha1
kind: PostgreSQLInstance
metadata:
name: payment-service-db
namespace: team-payments
spec:
parameters:
storageGB: 50
version: "16"
tier: production # 適切なインスタンスクラスにマッピング
backup:
enabled: true
retentionDays: 30
compositionRef:
name: aws-postgresql # プラットフォームチームがこのCompositionを管理
writeConnectionSecretToRef:
name: payment-db-credentials
namespace: team-payments
開発者は必要なものを記述してデータベースを要求します。プラットフォームチームのCrossplane Compositionが方法を処理します — どのクラウドプロバイダー、どのインスタンスタイプ、どのネットワーク設定、どのバックアップポリシー。組織がAWSからGCPに移行する場合、プラットフォームチームがCompositionを更新し、開発者は一行も変更しません。
レイヤー4:CI/CDとデリバリー
デリバリーレイヤーは、コードコミットからプロダクションデプロイメントまでのパスを自動化します。モダンなプラットフォームは、チームがゼロから構築するのではなく継承する標準化されたパイプラインを提供します。
# .github/workflows/platform-pipeline.yaml
# Golden Pathテンプレートから継承 — チームはパイプラインコードではなく設定でカスタマイズ
name: Platform Standard Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
quality-gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Security Scan (SAST)
uses: platform/security-scan@v3
with:
severity-threshold: high
fail-on-vulnerability: true
- name: Dependency Audit
uses: platform/dependency-audit@v2
with:
policy: organizational-standards
- name: Unit Tests
run: make test
- name: Container Build & Scan
uses: platform/container-build@v4
with:
registry: registry.internal
scan-policy: strict
deploy-staging:
needs: quality-gates
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Deploy to Staging
uses: platform/gitops-deploy@v3
with:
environment: staging
auto-promote: false # プロダクションへの手動プロモーションが必要
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production # 承認が必要
steps:
- name: Deploy to Production
uses: platform/gitops-deploy@v3
with:
environment: production
strategy: canary
canary-percentage: 10
promotion-criteria:
error-rate-threshold: 0.1%
latency-p99-threshold: 500ms
レイヤー5:オブザーバビリティとフィードバック
最後のレイヤーはフィードバックループを閉じます。プラットフォームを通じてデプロイされたすべてのサービスは、組織標準に設定されたモニタリング、ロギング、アラーティングを自動的に取得します。
# Golden Pathテンプレートにより自動生成
# monitoring/alerts.yaml
groups:
- name: payment-service-slo
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{service="payment-service",status=~"5.."}[5m]))
/
sum(rate(http_requests_total{service="payment-service"}[5m]))
> 0.001
for: 5m
labels:
severity: critical
tier: "1"
team: payments
annotations:
summary: "ペイメントサービスのエラー率が0.1%を超過"
runbook: "https://portal.internal/docs/runbooks/payment-service/high-error-rate"
- alert: HighLatency
expr: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{service="payment-service"}[5m])) by (le)
) > 0.5
for: 5m
labels:
severity: warning
tier: "1"
team: payments
プラットフォームの成功を測定する
プラットフォームエンジニアリングの成熟度における重要な転換は、利用の測定から導入の測定への移行です。利用は人々がプラットフォームと対話していることを示します。導入は、代替手段がある中でプラットフォームを使うことを選択していることを示します。
主要メトリクス
導入率:新しいサービスの何パーセントがプラットフォームのGolden Pathを通じて作成されているか、手動と比較して?目標:12ヶ月以内に80%以上。
最初のデプロイメントまでの時間:新しい開発者が最初の変更をプロダクションにデプロイするまでにどのくらいかかるか?成熟したプラットフォームでは、1日未満であるべきです(オンボーディングを含む)。
プラットフォーム迂回率:チームがどのくらいの頻度でプラットフォームを回避しているか?すべての迂回は、プラットフォームが実際のニーズを満たしていないシグナルです。例外リクエストを追跡してください。
認知負荷の削減:四半期ごとに開発者を調査してください。質問:「インフラ対フィーチャー作業に費やす時間はどのくらいですか?」トレンドが絶対数より重要です。
平均復旧時間(MTTR):プラットフォーム上に構築されたサービスは、標準化されたモニタリング、ランブック、デプロイメントロールバックメカニズムがあるため、インシデントからより早く復旧するべきです。
# platform_metrics.py — プラットフォームの健全性メトリクスを追跡・報告
from dataclasses import dataclass
from datetime import datetime, timedelta
@dataclass
class PlatformMetrics:
total_services: int
platform_services: int # Golden Pathを通じて作成
manual_services: int # プラットフォーム外で作成
bypass_requests: int # 今四半期にリクエストされた例外
avg_first_deploy_hours: float
developer_satisfaction: float # アンケートによる1-10スケール
@property
def adoption_rate(self) -> float:
"""プラットフォームを使用しているサービスの割合。"""
if self.total_services == 0:
return 0.0
return (self.platform_services / self.total_services) * 100
@property
def bypass_rate(self) -> float:
"""チームがプラットフォームを回避する頻度。"""
if self.total_services == 0:
return 0.0
return (self.bypass_requests / self.total_services) * 100
def health_report(self) -> str:
"""プラットフォーム健全性サマリーを生成。"""
status = "healthy" if self.adoption_rate > 80 else "needs attention"
return (
f"Platform Health: {status}\n"
f" Adoption Rate: {self.adoption_rate:.1f}%\n"
f" Bypass Rate: {self.bypass_rate:.1f}%\n"
f" Avg First Deploy: {self.avg_first_deploy_hours:.1f} hours\n"
f" Developer Satisfaction: {self.developer_satisfaction:.1f}/10\n"
f" Total Services: {self.total_services} "
f"({self.platform_services} platform, "
f"{self.manual_services} manual)"
)
プラットフォームチームの構成
プラットフォームチームは、名前を変えたインフラチームではありません。この区別は重要です。なぜなら、採用から優先順位付けまでのすべてに影響するからです。
インフラチームはシステムを構築・維持します。顧客はマシンです。成功メトリクスは稼働率です。
プラットフォームチームは開発者向けの製品を構築します。顧客は人間です。成功メトリクスは導入率です。これは、プラットフォームエンジニアにプロダクト思考、ユーザーリサーチスキル、そして比例する価値なしに複雑さを追加するフィーチャーに「ノー」と言う能力が必要であることを意味します。
中規模組織(開発者200-500人)の典型的なプラットフォームチーム構成:
- Platform Product Manager(1名):ロードマップを管理し、開発者フィードバックに基づいて優先順位付けし、導入メトリクスを追跡。
- Platform Engineer(3-5名):プラットフォームコンポーネントを構築・維持 — Backstageプラグイン、Golden Pathテンプレート、Crossplane Composition、CI/CDパイプラインテンプレート。
- Developer Advocate(1-2名):チームのオンボーディング、ドキュメント作成、社内ワークショップの実施、フィードバックの収集。
- SRE/Reliability(1-2名):プラットフォーム自体の信頼性を確保し、Kubernetesクラスターを管理し、プラットフォームインフラのインシデントレスポンスを処理。
よくある間違い
**開発者と話さずに構築する。**プラットフォームが失敗する最大の理由は、プラットフォームチームが開発者が実際に必要とするものではなく、必要だと思うものを構築することです。ユーザーにインタビューしてください。作業を観察してください。時間を失っている箇所を測定してください。
**導入を獲得するのではなく義務化する。**チームをプラットフォームに強制しなければならないなら、プラットフォームが十分良くないということです。最高のプラットフォームは開発者体験で勝利します — 代替手段よりも速く、簡単で、信頼性が高いのです。
**早すぎる過度な抽象化。**最も一般的なサービスタイプのGolden Pathを一つから始めてください。正しく作ってください。そして拡張してください。初日からあらゆるユースケースをサポートしようとするプラットフォームは、結局どれも十分にサポートできません。
**エスケープハッチを無視する。**開発者にはGolden Pathが合わない場合にカスタマイズする能力が必要です。プラットフォームが出口のない塀で囲まれた庭なら、チームは個々の制限を回避するよりも完全に離脱するでしょう。
**一回限りのプロジェクトとして扱う。**プラットフォームは製品です。継続的な投資、フィードバックループ、イテレーションが必要です。プラットフォームを立ち上げたチームが1年後もまだ改善しているべきです。
はじめに
ゼロからスタートする場合、実践的な手順は次の通りです:
1-2ヶ月目:10の開発チームにインタビューする。デプロイメントワークフローをエンドツーエンドでマッピングする。3つの最大の摩擦点を特定する。基本的なソフトウェアカタログでBackstageをセットアップする。
3-4ヶ月目:組織で最も一般的なサービスタイプ(おそらくREST API)のための最初のGolden Pathを構築する。CI/CD、コンテナビルド、Kubernetesデプロイメント、基本的なモニタリングを含める。ボランティアチームと共にデプロイする。
5-6ヶ月目:パイロットチームのフィードバックに基づいてイテレーションする。TechDocs統合を追加する。2番目に一般的なサービスタイプのための2つ目のGolden Pathを構築する。3-5チームを追加でオンボーディングする。
7-12ヶ月目:導入をスケールする。セルフサービスインフラのためにCrossplaneを追加する。プラットフォームメトリクスのダッシュボードを構築する。プラットフォーム周辺の社内開発者コミュニティを確立する。新規サービスのGolden Path導入率50%を目標にする。
2026年にプラットフォームエンジニアリングから最も価値を得ている組織には共通の特徴があります:プラットフォームを自分たちが構築する最も重要な製品として扱っています — なぜなら、他のすべての製品がそれに依存しているからです。