EXERCISE 90分

ストーリー

田中VPoE
IDP概要、Backstage、サービスカタログ、スキャフォールディング。IDPの構成要素を一通り学んだ。実際にCloudOps社のIDPを設計してもらう
あなた
Backstageベースで、25マイクロサービスを管理するIDPですね
田中VPoE
そうだ。サービスカタログの設計からテンプレートの定義、ヘルススコアカードの設計まで、IDPの全体像を設計してくれ
あなた
開発者が「これさえ見れば何でもわかる」ポータルにします
田中VPoE
いい心構えだ。ただし、最初から完璧を目指す必要はない。TVPの原則を忘れるな。Phase 1で最も価値のある機能を特定し、そこに集中する

ミッション概要

項目内容
演習タイトルInternal Developer Portalの設計
想定時間90分
成果物IDP設計書(カタログ + テンプレート + スコアカード)
対象組織CloudOps社(Step 1から継続)

Mission 1: サービスカタログの設計

要件

CloudOps社の25マイクロサービスを管理するサービスカタログを設計してください。

  1. データモデル(Domain、System、Component、API、Resource)を定義する
  2. 代表的なサービス3つのcatalog-info.yamlを記述する
  3. ヘルススコアカードの項目と配点を設計する
解答例

データモデル

DomainSystemComponentsAPIs
Paymentspayment-systempayment-service, payment-workerpayment-api
Usersuser-systemuser-service, auth-serviceuser-api, auth-api
Notificationsnotification-systemnotification-service, email-workernotification-api
Analyticsanalytics-systemanalytics-service, report-serviceanalytics-api
Platformplatform-systemapi-gateway, config-servicegateway-api

catalog-info.yaml(payment-service)

apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: payment-service
  description: "決済処理のコアサービス。Stripe/PayPay連携、課金管理を担当"
  tags: [typescript, nestjs, production, tier-1]
  annotations:
    github.com/project-slug: cloudops/payment-service
    backstage.io/techdocs-ref: dir:.
    datadoghq.com/service-name: payment-service
    argocd/app-name: payment-service
spec:
  type: service
  lifecycle: production
  owner: payment-team
  system: payment-system
  providesApis: [payment-api]
  consumesApis: [user-api, notification-api]
  dependsOn: [resource:payment-db, resource:payment-redis]

ヘルススコアカード

カテゴリ項目配点自動チェック方法
オーナーシップownerが設定されている10catalog-info.yaml
ドキュメントTechDocs存在 + 3ヶ月以内更新10GitHubファイル確認
API仕様OpenAPI定義あり10catalog-info.yaml
CI/CDパイプラインが設定・稼働10GitHub Actions API
テストカバレッジ70%以上10CI実行結果
セキュリティSAST有効 + Critical 0件15Semgrep結果
監視SLO定義 + アラート設定15Datadog API
依存関係依存パッケージが最新-2以内10Dependabot結果
デプロイGolden Path準拠10GitOps設定確認

Mission 2: ソフトウェアテンプレートの設計

要件

CloudOps社で使用するソフトウェアテンプレートを設計してください。

  1. テンプレート一覧(最低4種類)と各テンプレートの概要を定義する
  2. 最も利用頻度が高いテンプレートのtemplate.yamlを記述する
  3. テンプレートから生成されるスケルトンコードのディレクトリ構成を設計する
解答例

テンプレート一覧

テンプレート用途含まれるもの優先度
typescript-apiREST APIサービスNestJS, Prisma, Jest, Docker, k8s, CI/CDPhase 1
typescript-workerバックグラウンドワーカーNestJS, SQS, DLQ, Docker, k8sPhase 1
react-webWebフロントエンドNext.js, Storybook, CypressPhase 1
python-mlML推論サービスFastAPI, PyTorch, Docker, k8sPhase 2
documentationドキュメントサイトMkDocs Material, TechDocsPhase 2

template.yaml(typescript-api)

apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: typescript-api-service
  title: TypeScript APIサービス
  description: "NestJS + Prisma のREST APIサービス"
spec:
  owner: platform-team
  type: service
  parameters:
    - title: サービス情報
      required: [name, owner]
      properties:
        name:
          title: サービス名
          type: string
          pattern: "^[a-z][a-z0-9-]{2,30}$"
        owner:
          title: オーナー
          type: string
          ui:field: OwnerPicker
    - title: オプション
      properties:
        database:
          title: データベース
          type: string
          enum: [none, postgresql, redis, both]
          default: none
        size:
          title: サイズ
          type: string
          enum: [small, medium, large]
          default: small
  steps:
    - id: generate
      name: コード生成
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          owner: ${{ parameters.owner }}
    - id: publish
      name: リポジトリ作成
      action: publish:github
      input:
        repoUrl: github.com?owner=cloudops&repo=${{ parameters.name }}
    - id: argocd
      name: Argo CD登録
      action: argocd:create-application
      input:
        appName: ${{ parameters.name }}
    - id: register
      name: カタログ登録
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
        catalogInfoPath: /catalog-info.yaml

ディレクトリ構成

${{ values.name }}/
├── src/
│   ├── domain/
│   ├── application/
│   ├── adapters/
│   ├── app.module.ts
│   └── main.ts
├── test/
├── docs/index.md
├── k8s/platform.yaml
├── catalog-info.yaml
├── Dockerfile
├── .github/workflows/ci.yaml
├── package.json
└── README.md

Mission 3: IDP導入ロードマップ

要件

CloudOps社のIDP導入ロードマップを策定してください。

  1. 3フェーズの導入計画(各フェーズの機能、期間、成功指標)を定義する
  2. 導入のリスクと対策を3つ以上特定する
  3. 開発者への展開戦略(Opt-inアプローチ)を設計する
解答例

3フェーズ導入計画

フェーズ期間機能成功指標
Phase 11-2ヶ月サービスカタログ(25サービス登録)、検索カタログ登録率100%、週次アクセス数50+
Phase 23-4ヶ月テンプレート3種、TechDocs、セルフサービスDBテンプレート利用率80%、新規サービス作成時間10分以内
Phase 35-6ヶ月ヘルススコア、コスト可視化、全セルフサービス平均ヘルススコア70+、セルフサービス率80%

リスクと対策

リスク影響対策
catalog-info.yamlの情報が古くなるIDPの信頼性低下CI/CDで情報鮮度チェック、スコアカードで可視化
開発者が使わない投資の無駄Opt-inアプローチ、アーリーアダプター3チームから開始
Backstageのアップデート追従技術的負債月次アップデートサイクルの確立、E2Eテスト

展開戦略

段階対象施策
Week 1-2payment-team(アーリーアダプター)1対1で導入支援、フィードバック収集
Week 3-4user-team, notification-team成功事例を共有、ハンズオンセッション
Month 2全チーム全体向けデモ、ドキュメント整備
Month 3+自然拡大テンプレート利用の利便性で自発的採用

達成度チェック

観点達成基準
サービスカタログデータモデルが設計され、catalog-info.yamlが記述できている
ヘルススコア自動チェック項目と配点が定義されている
テンプレート4種類以上のテンプレートが定義され、template.yamlが記述できている
導入ロードマップ3フェーズの計画、リスク対策、展開戦略がある
実現可能性CloudOps社の技術スタックとチーム規模に適合している

推定所要時間: 90分