LESSON 30分

ストーリー

田中VPoE
サービスカタログで「既存のサービス」を管理できるようになった。次は「新しいサービスの立ち上げ」を自動化する。ソフトウェアテンプレートとスキャフォールディングだ
あなた
サーベイで「新しいサービスを作るたびにインフラチームにチケットを出して数日待つ」が最大のペインポイントでしたね
田中VPoE
そうだ。テンプレートを選んで、サービス名とチーム名を入力するだけで、リポジトリ、CI/CD、Kubernetesマニフェスト、モニタリング、ドキュメントのすべてが自動生成される。3日が10分になる
あなた
Create React Appのインフラ版みたいなものですか
田中VPoE
近い。ただし、Create React Appは初期構成を生成するだけだ。プラットフォームのテンプレートはその先まで行く。GitHubリポジトリの作成、CI/CDの設定、Argo CDへの登録、サービスカタログへの登録。すべてが一気通貫で自動化される

Backstage Software Templates

テンプレートの仕組み

テンプレート実行フロー:

1. 開発者がBackstage UIでテンプレートを選択

2. パラメータ入力フォーム
   ├── サービス名
   ├── チーム名
   ├── 言語/フレームワーク
   ├── データベース要否
   └── サイズ

3. テンプレートエンジン(Scaffolder)が実行
   ├── ステップ1: Cookiecutterでコード生成
   ├── ステップ2: GitHubリポジトリ作成
   ├── ステップ3: GitHub Actionsワークフロー設定
   ├── ステップ4: Kubernetesマニフェスト生成
   ├── ステップ5: Argo CDアプリケーション登録
   ├── ステップ6: Datadogモニタリング設定
   └── ステップ7: カタログ登録

4. 完了通知(Slack、メール)
   └── リポジトリURL、アクセス情報

テンプレート定義(template.yaml)

apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: typescript-api-service
  title: TypeScript APIサービス
  description: "NestJSベースのREST APIサービスを作成します"
  tags:
    - typescript
    - nestjs
    - recommended
spec:
  owner: platform-team
  type: service

  parameters:
    - title: サービス情報
      required:
        - name
        - owner
      properties:
        name:
          title: サービス名
          type: string
          pattern: "^[a-z][a-z0-9-]{2,30}$"
          ui:help: "小文字英数字とハイフンのみ(例: payment-service)"
        description:
          title: サービスの説明
          type: string
        owner:
          title: オーナーチーム
          type: string
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind: Group
    - title: 技術オプション
      properties:
        database:
          title: データベース
          type: string
          enum: ["none", "postgresql", "redis", "both"]
          default: "none"
        size:
          title: サイズ
          type: string
          enum: ["small", "medium", "large"]
          default: "small"
        monitoring:
          title: モニタリング
          type: boolean
          default: true

  steps:
    - id: fetch-template
      name: テンプレートコードの生成
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          owner: ${{ parameters.owner }}
          description: ${{ parameters.description }}
          database: ${{ parameters.database }}
          size: ${{ parameters.size }}

    - id: create-repo
      name: GitHubリポジトリの作成
      action: publish:github
      input:
        repoUrl: github.com?owner=cloudops&repo=${{ parameters.name }}
        description: ${{ parameters.description }}
        defaultBranch: main
        protectDefaultBranch: true
        requireCodeOwnerReviews: true

    - id: create-argocd-app
      name: Argo CDアプリケーションの登録
      action: argocd:create-application
      input:
        appName: ${{ parameters.name }}
        repoUrl: https://github.com/cloudops/${{ parameters.name }}
        path: k8s/

    - id: register-catalog
      name: カタログへの登録
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }}
        catalogInfoPath: /catalog-info.yaml

    - id: notify-slack
      name: Slackで通知
      action: slack:send-message
      input:
        channel: "#platform-notifications"
        message: |
          新しいサービスが作成されました
          サービス名: ${{ parameters.name }}
          オーナー: ${{ parameters.owner }}
          リポジトリ: ${{ steps['create-repo'].output.remoteUrl }}

  output:
    links:
      - title: リポジトリ
        url: ${{ steps['create-repo'].output.remoteUrl }}
      - title: サービスカタログ
        url: ${{ steps['register-catalog'].output.entityRef }}

テンプレートの種類

CloudOps社のテンプレートカタログ

テンプレート名用途含まれるもの
TypeScript APIサービスNestJSベースのREST APINestJS, Prisma, Jest, Docker, k8s
TypeScript BFFBackend for FrontendサービスNestJS, GraphQL, Apollo
TypeScript WorkerバックグラウンドワーカーNestJS, Bull(SQS), Dead Letter Queue
Python MLサービス機械学習推論APIFastAPI, PyTorch, Docker
React WebアプリフロントエンドアプリケーションReact, Next.js, Storybook
ドキュメントサイト技術ドキュメントMkDocs, TechDocs

テンプレートの品質管理

基準チェック項目
テストテンプレートから生成されたコードが全テストに合格する
セキュリティSASTで脆弱性が0件
ベストプラクティスlinter、formatter、pre-commitフックが設定済み
ドキュメントREADME、API仕様、アーキテクチャ図が含まれる
CI/CDパイプラインが正しく動作する
バージョン管理テンプレートのバージョンが管理されている

スケルトンコードの設計

ディレクトリ構成(TypeScript APIサービス)

${{ values.name }}/
├── src/
│   ├── domain/
│   │   ├── entities/
│   │   └── ports/
│   │       ├── in/
│   │       └── out/
│   ├── application/
│   │   └── use-cases/
│   ├── adapters/
│   │   ├── in/
│   │   │   └── http/
│   │   └── out/
│   │       └── persistence/
│   ├── app.module.ts
│   └── main.ts
├── test/
│   ├── unit/
│   ├── integration/
│   └── e2e/
├── docs/
│   └── index.md
├── k8s/
│   └── platform.yaml          # Application CRD
├── catalog-info.yaml           # Backstageカタログ定義
├── Dockerfile
├── .github/
│   └── workflows/
│       └── ci.yaml
├── .eslintrc.js
├── .prettierrc
├── tsconfig.json
├── package.json
└── README.md

「テンプレートはプラットフォームの『第一印象』だ。開発者がテンプレートで新しいサービスを作った瞬間に『すごい、全部揃っている』と感じてもらえれば、プラットフォーム全体の信頼を勝ち取れる」 — 田中VPoE


まとめ

ポイント内容
テンプレートパラメータ入力だけで新規サービスを全自動生成
ScaffolderBackstageのテンプレート実行エンジン
テンプレートの種類APIサービス、BFF、Worker、ML、Webアプリ等
品質管理テスト、セキュリティ、ベストプラクティスの自動適用

チェックリスト

  • Backstage Software Templatesの仕組みを説明できる
  • template.yamlの構造を理解した
  • テンプレートの種類とカタログ設計ができる
  • スケルトンコードの設計方法を理解した

次のステップへ

次は演習です。CloudOps社のInternal Developer Portalを設計しましょう。


推定読了時間: 30分