古いCDKプロジェクトのバージョンアップデートを実施した話

## はじめに
普段はインフラエンジニアとして仕事を実施しているのですが、
CDKをバージョンアップするにあたって色々と手間取ってしまったため、忘れないための備忘録になります。

また、NodeJSのプロジェクトを長期管理したこともなかったので、プロジェクト管理についてもあまりよくわかってなかったところのため、これを機に備忘録として残します。


## エラー内容
結論からいうと、CDK コマンドを実行した際古いプロジェクトだった故もあり、AMAZON_LINUX_2023がサポートされていない旨が出力されました。
(CDK始めたてであり、AmazonLinux2023も出たばっかりに作ったプロジェクトだった)

```
$ cdk synth
/path/to/sample_project/node_modules/ts-node/src/index.ts:859
    return new TSError(diagnosticText, diagnosticCodes, diagnostics);
           ^
TSError: ⨯ Unable to compile TypeScript:
lib/simple_ec2_webapp-stack.ts:53:92 - error TS2551: Property 'AMAZON_LINUX_2023' does not exist on type 'typeof AmazonLinuxGeneration'. Did you mean 'AMAZON_LINUX_2022'?

53             machineImage: new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2023 }),
                                                                                              ~~~~~~~~~~~~~~~~~

  node_modules/aws-cdk-lib/aws-ec2/lib/machine-image.d.ts:301:5
    301     AMAZON_LINUX_2022 = "al2022"
            ~~~~~~~~~~~~~~~~~
    'AMAZON_LINUX_2022' is declared here.
```

エラーがあったmachine-image.d.tsコードを見てみるとAmazonLinux2023がサポートされていない..
```typescript:
/**
 * What generation of Amazon Linux to use
 */
export declare enum AmazonLinuxGeneration {
    /**
     * Amazon Linux
     */
    AMAZON_LINUX = "amzn",
    /**
     * Amazon Linux 2
     */
    AMAZON_LINUX_2 = "amzn2",
    /**
     * Amazon Linux 2022
     */
    AMAZON_LINUX_2022 = "al2022"
}
```

CDKの最新Verである２．１１４の公式ドキュメントを見てみると、列挙型 **AmazonLinuxGeneration** で定義可能な値でちゃんと`AMAZON_LINUX_2023`もサポートされていることが確認できます。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.AmazonLinuxGeneration.html

以前利用していたCDKぷろじぇくとのVerが古くて未だAmazonLinux2023をサポートされていない
ので今回はCDKプロジェクト のアップデートについて説明していきたいと思います。


まず、利用可能なパッケージの最新Verについて確認します。
```bash
$ npm outdated
Package       Current    Wanted   Latest  Location                  Depended by
@types/node  18.11.15  18.11.15  20.13.0  node_modules/@types/node  simple_ec2_webapp
aws-cdk        2.58.1    2.58.1  2.144.0  node_modules/aws-cdk      simple_ec2_webapp
aws-cdk-lib    2.58.1    2.58.1  2.144.0  node_modules/aws-cdk-lib  simple_ec2_webapp
typescript      4.9.5     4.9.5    5.4.5  node_modules/typescript   simple_ec2_webapp
```

また、package.jsonに記載されているパッケージのアップデートを確認するには`npm-check-updates`を実行すれば、最新のパッケージを確認することができます。

```sh
$ npm-check-updates
 @types/jest   ^29.2.4  →  ^29.5.12
 @types/node  18.11.15  →   20.13.0
 aws-cdk        2.58.1  →   2.144.0
 aws-cdk-lib    2.58.1  →   2.144.0
 constructs    ^10.0.0  →   ^10.3.0
 jest          ^29.3.1  →   ^29.7.0
 ts-jest       ^29.0.3  →   ^29.1.4
 ts-node       ^10.9.1  →   ^10.9.2
 typescript     ~4.9.4  →    ~5.4.5

Run ncu -u to upgrade package.json
```

上記のコマンドでも`Run ncu -u to upgrade package.json`と律儀に記載されているので`ncu -u`を実行してpackage.jsonファイル内のパッケージをアップデートします。

```
$ ncu -u
Upgrading 

 @types/jest   ^29.2.4  →  ^29.5.12
 @types/node  18.11.15  →   20.13.0
 aws-cdk        2.58.1  →   2.144.0
 aws-cdk-lib    2.58.1  →   2.144.0
 constructs    ^10.0.0  →   ^10.3.0
 jest          ^29.3.1  →   ^29.7.0
 ts-jest       ^29.0.3  →   ^29.1.4
 ts-node       ^10.9.1  →   ^10.9.2
 typescript     ~4.9.4  →    ~5.4.5

Run npm install to install new versions.
```

またも丁寧に`npm install`と記載されているので、実行してnpmパッケージを最新化します。

```sh
npm install
```


これで最新のパッケージを更新することができました。最初に実行した`npm-check-updates`を再度実行してアップデート可能なパッケージがあるか確認します。

```
$ ncu

All dependencies match the latest package versions :)
```

これで無事にアップデートすることができました。


仕切り直して`cdk synth`を実行し、成功できればOKになります。