結論を先に
CDK と Projen の概要
やったこと(検証)
パターン A:CDK CLI ― 全手順
パターン B:Projen ― 全手順
検証結果(項目別の詳細比較)
Projen のメリット / デメリット
まとめ
Projenというのを知ったときにCDK単体とどれぐらい違うのかわからなかったので試してみました。
観点 |
CDK 単体 |
Projen |
ターミナルで打つコマンド |
10 回 |
7 回 |
手書き設定ファイル |
6 件 |
4 件 |
CI YAML 手書き行数 |
約 100 行 |
0 行(自動生成) |
向く場面 |
単発 PoC・自由度優先 |
チーム運用・品質担保 |
ESLint・Jest・GitHub Actions CI を 0 手作業で生成
.projenrc.ts 1 枚で設定を IaC 化
projen upgrade で 依存更新 PR を自動生成
ツール / ファイル |
役割 |
Projen での扱い |
ESLint |
静的解析・コードスタイル統一 |
devDeps と .eslintrc.json を自動生成 |
Jest |
ユニット/スナップショットテスト |
jest.config.js と ts-jest を自動生成 |
CI YAML |
GitHub Actions:lint→test→build→synth→deploy |
約 100 行を自動生成(手書き不要) |
ツール |
ひと言で |
主な特徴 |
AWS CDK |
コードで CloudFormation を書く IaC フレームワーク |
TypeScript/Python でリソース定義 → cdk synth / deploy |
Projen |
設定を手書きしない プロジェクトジェネレーター |
.projenrc.ts → npx projen が ESLint/Jest/CI を生成し、projen build で lint→test→synth を一括実行 |
項目 | 内容 |
目的 | S3 バケット 1 個をデプロイ |
ツール | Node 20 / CDK 2.141.0 / Projen 0.94 |
測定 | ① コマンド数 ② 手書きファイル数 |
10 コマンド / 手書き 5 ファイル
mkdir cdk-only && cd $_
cdk init app --language typescript
npm i aws-cdk-lib constructs
lib/stack.ts にバケット実装
npm run build 6. cdk synth 7. cdk bootstrap 8. cdk deploy
ESLint 追加 → npm i -D eslint … + .eslintrc.js
Jest 追加 → npm i -D jest … + jest.config.js, test/stack.test.ts
npm test
.github/workflows/ci.yml(約 100 行)手書き
7 コマンド / 手書き 4 ファイル
mkdir projen-cdk && cd $_
npx projen new awscdk-app-ts --pm npm
mv src/main.ts bin/app.ts + lib/stack.ts 新規
lib/stack.ts にバケット実装
.projenrc.ts に appEntrypoint: 'bin/app.ts' 追記
npx projen(ESLint/Jest/CI YAML 自動生成)
npx projen build(lint → npm test → synth)
cdk bootstrap 9. npx projen deploy
指標 |
CDK 単体 |
Projen |
コマンド数 |
10 |
7 |
手書き設定ファイル |
5 |
4 |
種別 |
CDK が保守 |
Projen が保守 |
App & Stack |
bin/app.ts, lib/stack.ts |
同左 |
ESLint / Jest / CI |
手書き設定 + YAML |
自動生成 |
プロジェクト設定 |
— |
.projenrc.ts |
ESLint・Jest・CI を 0 手作業で生成
.projenrc.ts 1 枚で集中管理
projen upgrade による 依存アップデート自動 PR
.projenrc.ts の DSL を覚える必要
生成物を直接編集しづらい(再生成で上書き)
Node.js ランタイムが前提