Platform Engineering実践入門2025 - 開発者体験を劇的に向上させる基盤構築
Platform Engineeringの概念から実装まで徹底解説。Internal Developer Platform(IDP)の構築方法、Backstageの活用、開発生産性の向上テクニックを実例とともに紹介します。
Platform Engineeringの基本概念から実装まで徹底解説。内部開発者ポータル、セルフサービス化、自動化による開発者体験(DevEx)の向上方法を、具体的な事例とともに紹介します。
「開発者が本来の仕事に集中できる環境を作る」—— これが Platform Engineering の本質です。2025 年、多くの企業が devops の次なるステップとして、Platform Engineering への投資を加速させています。
本記事では、Platform Engineering の基本概念から、実際の導入方法、開発者体験(DevEx)を劇的に向上させる具体的な手法まで、包括的に解説します。
Platform Engineering は、開発チームが効率的にソフトウェアを構築・デプロイできるよう、セルフサービス型の開発プラットフォームを構築・運用する実践です。
チャートを読み込み中...
観点 | DevOps | Platform Engineering | 効果 |
---|---|---|---|
責任範囲 | 各チームが独自に構築 | プラットフォームチームが基盤提供 | 重複作業の削減 |
スキル要件 | 全員がインフラ知識必要 | 専門チームに集約 | 学習コストの削減 |
標準化 | チームごとにバラバラ | 組織全体で統一 | 運用効率の向上 |
スケール | チームごとに限界 | 組織全体で最適化 | 大規模対応可能 |
イノベーション | インフラ作業で時間消費 | ビジネスロジックに集中 | 価値創出の加速 |
開発者が使えるリソースの可視化
クリック一つでリソース作成
全ての情報を一箇所に集約
アプリケーションの健全性を一覧
# Backstageアプリケーションの作成
npx @backstage/create-app@latest
# 依存関係のインストール
cd my-backstage-app
yarn install
# 開発サーバーの起動
yarn dev
基本的な設定ファイル(app-config.yaml):
app:
title: My Developer Portal
baseUrl: http://localhost:3000
backend:
baseUrl: http://localhost:7007
cors:
origin: http://localhost:3000
integrations:
github:
- host: github.com
token: ${GITHUB_TOKEN}
catalog:
import:
entityFilename: catalog-info.yaml
pullRequestBranchName: backstage-integration
# catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-service
description: 決済処理を行うマイクロサービス
tags:
- java
- spring-boot
- payment
annotations:
github.com/project-slug: myorg/payment-service
backstage.io/techdocs-ref: dir:.
spec:
type: service
lifecycle: production
owner: team-payment
system: ecommerce-platform
providesApis:
- payment-api
consumesApis:
- user-api
- notification-api
dependsOn:
- resource:database/payment-db
- resource:cache/redis-payment
// Kubernetes統合プラグイン
import { KubernetesPlugin } from '@backstage/plugin-kubernetes';
// GitHub Actions統合
import { GithubActionsPlugin } from '@backstage/plugin-github-actions';
// コスト管理プラグイン
import { CostInsightsPlugin } from '@backstage/plugin-cost-insights';
// プラグインの登録
export const App = () => (
<BackstageApp>
<AppRouter>
<Route path="/kubernetes" element={<KubernetesPlugin />} />
<Route path="/github-actions" element={<GithubActionsPlugin />} />
<Route path="/cost-insights" element={<CostInsightsPlugin />} />
</AppRouter>
</BackstageApp>
);
// カスタムテンプレートの作成
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
export const createMicroserviceAction = createTemplateAction<{
name: string;
language: string;
framework: string;
}>({
id: 'custom:microservice:create',
schema: {
input: {
required: ['name', 'language', 'framework'],
type: 'object',
properties: {
name: { type: 'string' },
language: {
type: 'string',
enum: ['java', 'typescript', 'python', 'go']
},
framework: { type: 'string' }
}
}
},
async handler(ctx) {
const { name, language, framework } = ctx.input;
// テンプレートからプロジェクト生成
await ctx.templateEngine.render({
template: `./templates/${language}-${framework}`,
values: { name, ...ctx.input },
targetPath: ctx.workspacePath
});
// GitHubリポジトリ作成
await ctx.github.createRepository({
name,
description: `${framework} microservice`,
visibility: 'private'
});
// CI/CDパイプライン設定
await setupCICD(name, language, framework);
}
});
# 担当者への依頼
1. インフラチームにメール
2. 承認待ち(数日)
3. 手動でリソース作成
4. 設定情報の共有
5. アクセス権限の設定
# 問題点
- 待ち時間が長い
- 人的ミスのリスク
- 標準化されていない
- 追跡が困難
# developer-portal/templates/infrastructure.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: create-kubernetes-namespace
title: Kubernetesネームスペース作成
spec:
type: infrastructure
parameters:
- title: 基本情報
properties:
name:
title: ネームスペース名
type: string
team:
title: チーム名
type: string
environment:
title: 環境
type: string
enum: ['dev', 'staging', 'prod']
steps:
- id: create-namespace
name: ネームスペース作成
action: kubernetes:create-namespace
input:
name: ${{ parameters.name }}
- id: apply-rbac
name: RBAC設定
action: kubernetes:apply
input:
manifest: |
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ${{ parameters.team }}-admin
namespace: ${{ parameters.name }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- kind: Group
name: ${{ parameters.team }}
# 担当者への依頼
1. インフラチームにメール
2. 承認待ち(数日)
3. 手動でリソース作成
4. 設定情報の共有
5. アクセス権限の設定
# 問題点
- 待ち時間が長い
- 人的ミスのリスク
- 標準化されていない
- 追跡が困難
# developer-portal/templates/infrastructure.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: create-kubernetes-namespace
title: Kubernetesネームスペース作成
spec:
type: infrastructure
parameters:
- title: 基本情報
properties:
name:
title: ネームスペース名
type: string
team:
title: チーム名
type: string
environment:
title: 環境
type: string
enum: ['dev', 'staging', 'prod']
steps:
- id: create-namespace
name: ネームスペース作成
action: kubernetes:create-namespace
input:
name: ${{ parameters.name }}
- id: apply-rbac
name: RBAC設定
action: kubernetes:apply
input:
manifest: |
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ${{ parameters.team }}-admin
namespace: ${{ parameters.name }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- kind: Group
name: ${{ parameters.team }}
// プラットフォーム層の実装例
class PlatformService {
// アプリケーションデプロイメントの標準化
async deployApplication(config: AppConfig): Promise<DeploymentResult> {
// 1. 入力検証
this.validateConfig(config);
// 2. セキュリティスキャン
await this.runSecurityScans(config.sourceCode);
// 3. コンテナイメージビルド
const image = await this.buildContainer({
source: config.sourceCode,
dockerfile: config.dockerfile || this.generateDockerfile(config),
buildArgs: this.getStandardBuildArgs()
});
// 4. イメージスキャン
const vulnerabilities = await this.scanImage(image);
if (vulnerabilities.critical > 0) {
throw new SecurityError('Critical vulnerabilities found');
}
// 5. Kubernetes マニフェスト生成
const manifests = this.generateK8sManifests({
image,
replicas: config.replicas || this.calculateReplicas(config),
resources: this.standardizeResources(config.resources),
healthChecks: this.generateHealthChecks(config),
networkPolicies: this.generateNetworkPolicies(config),
podSecurityPolicy: this.getSecurityPolicy(config.environment)
});
// 6. デプロイメント実行
const deployment = await this.kubectl.apply(manifests);
// 7. 監視設定
await this.setupMonitoring({
deployment,
alerts: this.generateAlerts(config),
dashboards: this.generateDashboards(config)
});
// 8. ロギング設定
await this.configureLogging({
deployment,
logLevel: config.logLevel || 'info',
retention: this.getLogRetention(config.environment)
});
return {
deployment,
endpoints: await this.getEndpoints(deployment),
monitoring: await this.getMonitoringUrls(deployment)
};
}
// リソース標準化
private standardizeResources(requested?: ResourceConfig): ResourceConfig {
const defaults = {
cpu: { request: '100m', limit: '500m' },
memory: { request: '128Mi', limit: '512Mi' }
};
if (!requested) return defaults;
// 最小要件の保証
return {
cpu: {
request: this.max(requested.cpu?.request, defaults.cpu.request),
limit: this.max(requested.cpu?.limit, defaults.cpu.limit)
},
memory: {
request: this.max(requested.memory?.request, defaults.memory.request),
limit: this.max(requested.memory?.limit, defaults.memory.limit)
}
};
}
}
メトリクス | 測定方法 | 目標値 | 改善アクション |
---|---|---|---|
デプロイ頻度 | CI/CDツールから自動収集 | 1日複数回 | パイプライン最適化 |
リードタイム | コミットからデプロイまで | < 1時間 | 自動化の推進 |
MTTR | インシデント管理ツール | < 30分 | 自動復旧の実装 |
開発者満足度 | 定期アンケート | > 4.0/5.0 | フィードバック対応 |
セルフサービス利用率 | ポータルアクセスログ | > 80% | UI/UX改善 |
// 開発者体験の継続的改善システム
class DevExImprovement {
private metrics: MetricsCollector;
private feedback: FeedbackSystem;
private analytics: AnalyticsEngine;
async analyzeDevExperience(): Promise<DevExReport> {
// 定量データの収集
const quantitativeData = await this.collectMetrics();
// 定性データの収集
const qualitativeData = await this.collectFeedback();
// 問題領域の特定
const painPoints = this.identifyPainPoints({
deploymentFrequency: quantitativeData.deploymentFrequency,
leadTime: quantitativeData.leadTime,
developerSurvey: qualitativeData.satisfaction,
toolUsage: quantitativeData.toolAdoption
});
// 改善提案の生成
const improvements = painPoints.map(point => ({
issue: point,
priority: this.calculatePriority(point),
solution: this.proposeSolution(point),
effort: this.estimateEffort(point),
impact: this.estimateImpact(point)
}));
return {
score: this.calculateDevExScore(quantitativeData, qualitativeData),
trends: this.analyzeTrends(),
improvements: improvements.sort((a, b) => b.priority - a.priority),
recommendations: this.generateRecommendations(improvements)
};
}
// 自動改善アクション
async executeImprovements(improvements: Improvement[]): Promise<void> {
for (const improvement of improvements) {
if (improvement.type === 'automation') {
await this.implementAutomation(improvement);
} else if (improvement.type === 'documentation') {
await this.updateDocumentation(improvement);
} else if (improvement.type === 'tooling') {
await this.deployNewTool(improvement);
}
// 効果測定のスケジューリング
this.scheduleImpactMeasurement(improvement, '2weeks');
}
}
}
開発プロセスの課題を特定
プラットフォームチームの立ち上げ
最小限の機能でスタート
パイロットチームでの検証
フィードバックを基に改善
メトリクスに基づく最適化
アンチパターン | 症状 | 原因 | 回避策 |
---|---|---|---|
象牙の塔 | 誰も使わないプラットフォーム | 開発者ニーズの無視 | 継続的なフィードバック |
過度な標準化 | 柔軟性の欠如 | 一律ルールの強制 | 例外処理の仕組み |
ビッグバン導入 | 混乱と抵抗 | 急激な変更 | 段階的移行 |
メトリクス至上主義 | ゲーミング行為 | 数値目標の過度な重視 | 定性評価の併用 |
サイロ化 | チーム間の断絶 | コミュニケーション不足 | 定期的な交流会 |
Platform Engineering を導入した企業の 87%が、開発者の生産性が向上したと報告しています。特に、ai を活用した自動化とセルフサービス化が進展し、開発者体験は劇的に改善されています。
# platform-services/developer-experience/service-catalog.yaml
apiVersion: v1
kind: ServiceCatalog
metadata:
name: platform-services
spec:
categories:
- name: compute
services:
- name: kubernetes-namespace
description: Kubernetes名前空間の作成
sla: 99.9%
provisioning: automated
- name: serverless-function
description: サーバーレス関数のデプロイ
sla: 99.95%
provisioning: automated
- name: data
services:
- name: postgresql-instance
description: PostgreSQLインスタンスの作成
versions: ['13', '14', '15']
backup: automated
- name: redis-cache
description: Redisキャッシュクラスタ
modes: ['standalone', 'cluster']
- name: observability
services:
- name: monitoring-stack
description: Prometheus + Grafana
features:
- custom-dashboards
- alert-management
- slo-tracking
Platform Engineering は、開発者体験を向上させ、組織全体の生産性を高める重要な実践です。成功の鍵は、開発者のニーズを深く理解し、段階的に価値を提供していくことです。
2025 年以降、Platform Engineering はさらに進化し、ai やマルチクラウド、エッジコンピューティングなど、新たな技術との統合が進むでしょう。今こそ、開発者体験の向上に投資し、競争力のある開発組織を構築する時です。