通常のAWS CDK App開発もprojen使ったら快適だった

projen使って、いい感じの設定されているCDKプロジェクトをサクッと作る。
2022.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「カジュアルにCDK使う時もprojenいいかも!」

簡単に作れて作り直しもしやすいため、検証用の使い捨ての環境をAWS CDKで作ることがあります。

今まで私の中のprojenのイメージは、Construct Library 作る時に使うツールというの認識でした。(勉強不足でした)

通常のCDK App開発もprojen使ったら快適だったので共有します。

projenとは

projenは、プロジェクト構成ファイル(pacakge.json ts-config.json cdk.json等)をコードで管理することができるツールです。

projen/projen: A new generation of project generators

projen synthesizes project configuration files such as package.json, tsconfig.json, .gitignore, GitHub Workflows, eslint, jest, etc from a well-typed definition written in JavaScript.

projenは、JavaScriptで記述された適切に型指定された定義から、package.json、tsconfig.json、.gitignore、GitHubワークフロー、eslint、jestなどのプロジェクト構成ファイルを合成します。

使用するメリット

  • プロジェクト構成を1ファイルで管理できる
    • package.json ts-config.json cdk.json .gitignore GithubActionsワークフローファイル 等を管理できる
  • CIやlintが設定済みの状態でプロジェクトが作成される

通常、パッケージ関連のファイルやCIの設定ファイルやなど個別に編集する必要がありますが、projenを使うことで.projenrc.jsを編集するだけで各ファイルを生成・管理できます。

ざっくりした流れは以下です。

  1. 公式のAPIリファレンスを見て.projenrc.jsを編集
  2. projenコマンド実行(npx projen)
  3. 各ファイルに変更が反映される

複数ファイルを編集しなくていいのが嬉しいですね。

また、CIやlintの設定がされた状態でプロジェクトが作成されます。

一時的な検証リソースをCDKで作った際に、「eslint設定した方が快適だな、でも長期間運用するわけでもないからコピペ面倒だな」と葛藤することがたまにありました。

(テンプレートリポジトリ作ればいいんですが、作ろうと思い何ヶ月か。。。)

projenを使えば、この辺も設定済みの状態でプロジェクト作ってくれるのでありがたいです。

やってみた

新規プロジェクトの作成

適当なディレクトリに移動して、プロジェクト作成のコマンドを実行します。

今回は、Construct Libraryではなく通常のCDKプロジェクトなのでawscdk-app-tsを指定しました。

$ cd sample-projen
$ npx projen new awscdk-app-ts

ディレクトリ構成

生成されるファイルを見てみます。

$ tree -a -I node_modules -I .git
.
├── .eslintrc.json
├── .gitattributes
├── .github
│   ├── pull_request_template.md
│   └── workflows
│       ├── build.yml
│       ├── pull-request-lint.yml
│       └── upgrade.yml
├── .gitignore
├── .mergify.yml
├── .npmignore
├── .projen
│   ├── deps.json
│   ├── files.json
│   └── tasks.json
├── .projenrc.js
├── LICENSE
├── README.md
├── cdk.json
├── package.json
├── src
│   └── main.ts
├── test
│   └── main.test.ts
├── tsconfig.dev.json
├── tsconfig.json
└── yarn.lock

.projenrc.js

このファイルを編集することで、各ファイルに情報を反映できます。

const { awscdk } = require('projen');
const project = new awscdk.AwsCdkTypeScriptApp({
  cdkVersion: '2.1.0',
  defaultReleaseBranch: 'main',
  name: 'sample-projen',

  // deps: [],                /* Runtime dependencies of this module. */
  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */
  // devDeps: [],             /* Build dependencies for this module. */
  // packageName: undefined,  /* The "name" in package.json. */
});
project.synth();

例えば、以下のようにcdkVersionを変更します。

.projenrc.js

+  cdkVersion: '2.31.0',
-  cdkVersion: '2.1.0',

その後、projenのコマンドを実行すると、pacakge.jsonyarn.lockに変更が反映されます。

$ npx projen #変更の反映

pacakge.json

  "dependencies": {
+    "aws-cdk-lib": "^2.31.0",
-    "aws-cdk-lib": "^2.1.0",
    "constructs": "^10.0.5"
  },

yarn.lock

+ aws-cdk-lib@^2.31.0:
- aws-cdk-lib@^2.1.0:

使用できるオプションはAPIリファレンスで確認できます。

.projen/

projenによって生成されるファイルです。 手動で編集することはありません。

projenで管理しているファイル(files.json)やタスク(tasks.json)の一覧などを確認できます。

.projen/files.json

{
  "files": [
    ".eslintrc.json",
    ".gitattributes",
    ".github/pull_request_template.md",
    ".github/workflows/build.yml",
    ".github/workflows/pull-request-lint.yml",
    ".github/workflows/upgrade.yml",
    ".gitignore",
    ".mergify.yml",
    ".npmignore",
    ".projen/deps.json",
    ".projen/files.json",
    ".projen/tasks.json",
    "cdk.json",
    "LICENSE",
    "tsconfig.dev.json",
    "tsconfig.json"
  ],
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
}

.github/

デフォルトでは、パッケージ自動アップグレードやPRごとのビルドのワークフローが用意されます。 他のファイルと同様に.projenrc.js を編集して無効化することもできます。

ワークフローを正常に動作させるためには、GithubでPAT(Personal Access Token)を作成してリポジトリシークレットに登録する必要があります。

  • シークレット名: PROJEN_GITHUB_TOKEN
  • PAT権限: repo workflow write:pacakges admin:repo_hook

projen/docs/github.md · projen/projen

おわりに

何となくprojenはConstruct Library作るようなCDK上級者向けのツールのイメージがありました。

プロジェクト構成をよしなに設定してくれるため、CDK触り始めた方やいい感じの設定されているCDKプロジェクトをサクッと作りたい方にもおすすめです。

lintやCIとか慣れていないと割と設定に時間かかると思いますが(コピペも面倒です)、projenを使うことでショートカットして快適な開発ができます。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考

projen ではじめる快適 AWS CDK Construct Library 開発生活 - Qiita

【レポート+やってみた】projen – a CDK for software project configuration #CDK Day | DevelopersIO