【AWS CDK】WSL2 Ubuntu環境上にAWS CDK v2環境を構築する

# はじめに
WSL2のUbuntuディストリビューション上に、AWS CDK v2の実行環境を構築する手順をまとめます。
すでに山ほどあるだろうと思ってググったのですが、断片的な情報が多い／余計な情報が付加されているものが多いので、自分用にまとめました。


# 環境
環境構築に用いたディストリビューションは下記のとおりです。

- WSL2
    - Ubuntu 22.04.2 LTS

本稿の手順でWSL2 Ubuntu上にインストールされるもの、およびインストールされるバージョン（2023/6/24現在）は以下のとおりです。
Node.jsはOSに直接インストールするのではなく、nvmを利用してインストールします。

- AWS CLI v2 2.12.3
- Node環境
    - nvm v0.39.3
    - node.js v18.16.1
- AWS CDK 2.85.0 (build 4e0d726)

本稿の手順は、実際にAWSアカウントにCDKのサンプルをデプロイします。
AWS環境は下記のとおりです。

- AWS環境
    - AWS AccountID: 123456789012
    - 利用したリージョン: us-west-2
    - AWS CLIプロファイル名: yourprofile


# 作業手順（概要）
作業ステップは下記のとおりです。
なお環境構築完了後、CDKのサンプルをデプロイし、意図したとおりに動くことを確認します。


1. WSL2(Ubuntu)の初期化
2. AWS CDK v2環境の構築（各ツールのインストール）
    2-1. AWS CLI v2のインストール
    2-2. Node環境構築
        2-2-1. nvmのインストール
        2-2-2. node.jsのインストール
    2-3. AWS CDKのインストール
3. 動作確認
    3-1. cdk bootstrapの実行
    3-2. AWS CDKのサンプルを取得
    3-3. 適当なサンプルをデプロイ

# 作業手順（詳細）
## 1. WSL2(Ubuntu)の初期化
Ubuntuディストリビューション環境が汚れている場合は、必要に応じてアンインストール／再インストールします。
再インストール手順は以下を参照してください。

https://qiita.com/tmiki/items/fefde80d7bf3c65fed1a

## 2. AWS CDK v2環境の構築（各ツールのインストール）
### 2-1. AWS CLI v2のインストール
まずは以下の公式ドキュメントに従い、AWS CLI v2をインストールします。

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions

unzipコマンドがおそらくインストールされていないので、インストールします。

```:unzipコマンドのインストール
$ sudo apt install unzip
```

ドキュメント通りに実行し、AWS CLI v2をインストールします。

```:AWS CLI v2インストール
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
```

インストール直後はパスが通っていないので、シェルを新しく実行しなおします。
その後、バージョンを確認します。

```:AWS CLIバージョン確認
# シェルの実行しなおし
$ exec bash

# バージョン確認
$ aws --version
aws-cli/2.12.3 Python/3.11.4 Linux/5.15.90.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.22 prompt/off
```

インストール後、必要に応じてAWS CLIのプロファイルを設定しておきます。
本稿では、 `yourprofile` という名称で設定します。

```:aws configure
$ aws configure --profile yourprofile
AWS Access Key ID [None]: ****************
AWS Secret Access Key [None]: ****************
Default region name [None]: us-west-2
Default output format [None]: json
```

### 2-2. Node環境構築
#### 2-2-1. nvmのインストール
Node環境のバージョン切り替え、作り直しが容易になるよう、nvmをインストールします。

下記、インストール手順に従いインストールします。

https://github.com/nvm-sh/nvm#installing-and-updating

```:nvmのインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
```

インストール後、nvmのバージョンを確認します。

```:nvmのバージョン確認
# シェルの実行しなおし
$ exec bash

# バージョン確認
$ nvm --version
0.39.3
```

#### 2-2-2. node.jsのインストール
nvmから、Node.jsの最新のLTSを確認します。

```:最新LTSの確認
$ nvm ls-remote --lts
※途中省略
       v16.20.0   (LTS: Gallium)
       v16.20.1   (Latest LTS: Gallium)
       v18.12.0   (LTS: Hydrogen)
       v18.12.1   (LTS: Hydrogen)
       v18.13.0   (LTS: Hydrogen)
       v18.14.0   (LTS: Hydrogen)
       v18.14.1   (LTS: Hydrogen)
       v18.14.2   (LTS: Hydrogen)
       v18.15.0   (LTS: Hydrogen)
       v18.16.0   (LTS: Hydrogen)
       v18.16.1   (Latest LTS: Hydrogen)
```

本稿時点ではv18.16.1が最新なのでこれをインストールします。

```:Node.jsのインストール
nvm install v18.16.1
```

Node.jsがインストールされていることを確認します。

```:Node.jsの確認
$ node -v
v18.16.1

$ npm -v
9.5.1
```

### 2-3. AWS CDKのインストール
下記、Get Started with AWS CDKに従い、AWS CDKをインストールします。
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/module-one/
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/module-two/

まず、TypeScriptをインストールします。

```:TypeScriptのインストール
$ npm install -g typescript
```

その後、CDKをインストールします。

```:CDKのインストール
$ npm install -g aws-cdk
```

CDKのインストール後、バージョンを確認します。

```:CDKのバージョン確認
$ cdk --version
2.85.0 (build 4e0d726)
```

## 3. 動作確認
### 3-1. cdk bootstrapの実行
AWS環境上にデプロイするため、cdk bootstrapを実行します。

まず、AWS CLIに設定したプロファイルが有効であることを確認します。
aws sts get-caller-identityが成功すればOKです。

```:AWS CLIプロファイルの有効性を確認
$ aws --profile yourprofile sts get-caller-identity
{
    "UserId": "AROA***************:botocore-session-1687608871",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/OrganizationAccountAccessRole/botocore-session-1687608871"
}
```

cdk bootstrapを実行します。 `--profile` オプションの指定を忘れないように。

```:cdk bootstrapの実行
$ cdk --profile yourprofile bootstrap aws://123456789012/us-west-2

 ?  Bootstrapping environment aws://123456789012/us-west-2...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
CDKToolkit: creating CloudFormation changeset...
 ?  Environment aws://123456789012/us-west-2 bootstrapped.

```

### 3-2. AWS CDKのサンプルを取得
AWSが公式で公開しているCDKのサンプルを用います。

https://github.com/aws-samples/aws-cdk-examples

まず、WSL(Ubuntu)上で、上記リポジトリをcloneします。

```:AWS CDKサンプルのリポジトリのクローン
$ cd ~/
$ git clone https://github.com/aws-samples/aws-cdk-examples.git
```

### 3-3. 適当なサンプルをデプロイ
何をデプロイしてもよいですが、ここでは規模が小さい `typescript/lambda-cron` をデプロイしてみます。

まず、対象ディレクトリに移動します。

```:lambda-cronディレクトリへの移動
$ cd ~/aws-cdk-examples/typescript/lambda-cron/
```

`npm install` で必要なnode moduleをインストールしたのち、 `npm run build`および `cdk deploy` を実行します。

```:lambda-cronのデプロイ
# 必要なnode moduleのインストール
$ npm install

# npm run buildの実行
$ npm run build

# デプロイ
$ cdk deploy
```

このサンプルは、「LambdaCronExample」という名称のStackを作ります、
デプロイ完了後、このStackが生成され、またStatusが `CREATE_COMPLETE` となっていることを確認します。

```:生成されたCloudFormation Stackの確認
$ aws --profile yourprofile cloudformation describe-stacks --query 'Stacks[?StackName==`LambdaCronExample`]'
[
    {
        "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/LambdaCronExample/6ddf4cdb-ca3f-9712-f4f3-e7674e3470a2",
        "StackName": "LambdaCronExample",
        "ChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/cdk-deploy-change-set/03af9f30-872b-3fa4-e158-947d34daaab1",
        "Parameters": [
            {
                "ParameterKey": "BootstrapVersion",
                "ParameterValue": "/cdk-bootstrap/hnb659fds/version",
                "ResolvedValue": "18"
            }
        ],
        "CreationTime": "2023-06-24T13:48:16.177000+00:00",
        "LastUpdatedTime": "2023-06-24T13:48:23.238000+00:00",
        "RollbackConfiguration": {},
        "StackStatus": "CREATE_COMPLETE",
        "DisableRollback": false,
        "NotificationARNs": [],
        "Capabilities": [
            "CAPABILITY_IAM",
            "CAPABILITY_NAMED_IAM",
            "CAPABILITY_AUTO_EXPAND"
        ],
        "RoleARN": "arn:aws:iam::123456789012:role/cdk-hnb659fds-cfn-exec-role-123456789012-us-west-2",
        "Tags": [],
        "DriftInformation": {
            "StackDriftStatus": "NOT_CHECKED"
        }
    }
]

```

# おわりに
本稿の手順をそのままなぞるだけで、きちんと動く環境ができると思います。

なお環境構築手順は、環境構築するところで終わらせるのではなく、何らかのサンプルを実行したりデプロイしたりするところまで確認できるものがベターです。
本稿もそこまでの手順を記載しています。