ストーリー
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 API | NestJS, Prisma, Jest, Docker, k8s |
| TypeScript BFF | Backend for Frontendサービス | NestJS, GraphQL, Apollo |
| TypeScript Worker | バックグラウンドワーカー | NestJS, Bull(SQS), Dead Letter Queue |
| Python MLサービス | 機械学習推論API | FastAPI, 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
まとめ
| ポイント | 内容 |
|---|---|
| テンプレート | パラメータ入力だけで新規サービスを全自動生成 |
| Scaffolder | Backstageのテンプレート実行エンジン |
| テンプレートの種類 | APIサービス、BFF、Worker、ML、Webアプリ等 |
| 品質管理 | テスト、セキュリティ、ベストプラクティスの自動適用 |
チェックリスト
- Backstage Software Templatesの仕組みを説明できる
- template.yamlの構造を理解した
- テンプレートの種類とカタログ設計ができる
- スケルトンコードの設計方法を理解した
次のステップへ
次は演習です。CloudOps社のInternal Developer Portalを設計しましょう。
推定読了時間: 30分