既存のCDKプロジェクトをCDK v2.0 に移行する

:::note alert
この情報は古いです。最新の手順はこちらを参照してください:
[Migrating to AWS CDK v2](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/migrating-v2.html)
:::

AWS CDK v2.0が[alphaリリースされていた](https://github.com/aws/aws-cdk/releases/tag/v2.0.0-alpha.0)ので、とりあえず導入してみた際の覚書。


# 前提
AWS CDK 1.77.0 を利用しているプロジェクト(以下、1系)がすでに存在するとします。
本記事では、そのプロジェクトをAWS CDK v2.0に移行させることを目的にします。

# 改修が必要なポイント
既存プロジェクトをCDK v2.0に移行する上で、最低限必要な変更点をまとめます。

## `package.json`
従来のCDKでは、AWSサービスごとのライブラリを個別にインストールする必要がありました。(例: `@aws-cdk/aws-codebuild`, `@aws-cdk/aws-lambda` など)
CDK v2.0では、これらは単一のパッケージに集約されています。

このため、 `package.json` は下記のように変更します。


```json:変更前
{
  "name": "cdk-sample",
  "version": "0.1.0",
  "bin": {
    "app": "bin/app.ts"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@aws-cdk/assert": "1.77.0",
    "@types/jest": "^26.0.10",
    "@types/node": "10.17.27",
    "jest": "^26.4.2",
    "ts-jest": "^26.2.0",
    "aws-cdk": "1.77.0",
    "ts-node": "^9.0.0",
    "typescript": "~3.9.7"
  },
  "dependencies": {
    "@aws-cdk/core": "1.77.0",
    "@aws-cdk/aws-lambda": "1.77.0",
    "@aws-cdk/aws-apigateway": "1.77.0",
  }
}
```
↓

```json:変更後
{
  "name": "cdk-sample",
  "version": "0.1.0",
  "bin": {
    "app": "bin/app.ts"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/jest": "^26.0.10",
    "@types/node": "10.17.27",
    "jest": "^26.4.2",
    "ts-jest": "^26.2.0",
    "aws-cdk": "^2.0.0-alpha.0",
    "ts-node": "^9.0.0",
    "typescript": "~3.9.7"
  },
  "dependencies": {
    "aws-cdk-lib": "^2.0.0-alpha.0",
    "constructs": "^3.0.4"
  }
}
```

変更点は下記です:
1. `@aws-cdk/assert` を削除
2. `@aws-cdk/*` を削除
3. `aws-cdk` のバージョンをalpha版に書き換え
3. `aws-cdk-lib`, `constructs` を追加

[`aws-cdk-lib` ライブラリ](https://www.npmjs.com/package/aws-cdk-lib) が、今まで個別にインストールしていたパッケージが集約されたものです。
今後は使うサービスが増える度に `package.json` を書き換える必要がなくなりますね。

[`constructs` ライブラリ](https://www.npmjs.com/package/constructs) は、CDK v2.0から明示的にインストールすることが必要になるようでした。
(これまでは各モジュールの依存になっており、別々にインストールされていたようです)

[`@aws-cdk/assert` ライブラリ](https://www.npmjs.com/package/@aws-cdk/assert) はCDKのテスト用ライブラリでしたが、v2.0版は用意されていないようです。
サンプルでもjestの関数を多用するような形に書き換えられていました。
今後のCDKテストベストプラクティスはまた探っていければと思います。



## パッケージのimport方法
合わせて、パッケージをimportする書き方も変わります。
下記はTypeScriptの例です。

下記の順番で機械的に置換すれば良さそうです:

1. `@aws-cdk/core` → `aws-cdk-lib` に
2. `@aws-cdk` → `aws-cdk-lib` に


```ts:変更前
import * as apigateway from "@aws-cdk/aws-apigateway";
import * as lambda from "@aws-cdk/aws-lambda";
import { App, Duration, Stack, StackProps } from "@aws-cdk/core";
```
↓

```ts:変更後
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as lambda from "aws-cdk-lib/aws-lambda";
import { App, Duration, Stack, StackProps } from "aws-cdk-lib";
```

# 動かしてみる
上記の変更をした上で、 `npm install`, `npm run build`, `npm run cdk synth` してみましょう。
特に今までと変わりない挙動で動きました！


# まとめ
今のところは、CDK1系→2系への移行は容易にできそうです。
CDK v2.0の変更点やロードマップは下記にまとまっていますが、1系のつらみを解消してくれる点も多いので、ぜひ乗り換えたいですね。

* https://github.com/aws/aws-cdk-rfcs/blob/master/text/0079-cdk-2.0.md
* https://github.com/aws/aws-cdk/projects/10

※ ただしsemvarの規則の通り、メジャーアップデートでは後方互換性のない変更が多々ある(`@deprecated` の削除など)と思われます。
このため、ロードマップやRFCを見て事前に準備しておくのが良いでしょう。