【AWS】もう迷わない、AWS CDKのはじめかた【CDK】

## はじめに
CDKを始めるにあたり、AWSドキュメントを参考に環境設定を試してみました
ドキュメントだけでは詰まったり方法に迷うところがあったので
手順の画面キャプチャと発生したエラーやその対応内容などを記事にしました

【CDKに関するAWSドキュメント】

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/getting_started.html

## この記事のゴール
AWS CDK環境を構築してローカル環境のVisualStudioからAWS環境にCloudFormationのスタックを反映する


# AWS CDK のはじめかた

## 1．ローカルPC側の環境準備 ①インストーラーからツールのインストール
### ①VisualStudioCodeのインストール
私が試した環境ではVisualStudioCode(VSCode)を利用してローカル環境でCDKを利用しました
VSCodeのインストーラーは以下のページよりダウンロードしてください

https://azure.microsoft.com/ja-jp/products/visual-studio-code

### ②npmインストール
CDK関連のツールをインストールする際にnpmコマンドを使うため、npmもインストールしてください
インストーラーは以下のページよりNode.jsをダウンロードしてください

https://nodejs.org/en

インストーラーからインストールが完了したら、Windows環境ではパスの設定をしてください
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/d091a68f-3f23-59a6-5ea7-6867fc091ab0.png" width=50%>

私の環境では「Path」に
C:\Program Files\nodejs\
を追加しました

## 2．ローカルPC側の環境準備 ②VSCodeの環境整備
### ①AWS CLIのインストール
以下のURLよりインストーラーをダウンロードしてAWS CLIのインストールを実行してください
これによりターミナルから「aws~」のコマンドが実行可能になります

https://awscli.amazonaws.com/AWSCLIV2.msi

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/7f453498-a7a4-f717-8c86-c929d8c93029.png" width=50%>

インストールが完了したら、VSCodeを再起動して以下のコマンドを実行し、バージョンが表示されることを確認してください
```
aws -- version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/25b594aa-c4db-7c8a-2ff1-2b985673af7d.png)

### ②CDK CLI のインストール
VSCodeのヘッダメニューから「View」→「Terminal」を選択してターミナルを開きます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/8cda76ba-8c81-31f3-a845-e6f65f9e6386.png" width=50%>
ターミナルで以下のコマンドを実行してAWS CLIをインストールします

```
npm install -g aws-cdk
```
:::note warn
CDKのバージョンによって、この先のBootstrap実行時にエラーが出ることがあります
エラーが発生する場合は以下のコマンドでバージョン指定をおこなっってインストールしなおしてください
```
npm install -g aws-cdk@2.163.1 
```

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/a23e110c-e9af-4434-4ced-3446bd378d4e.png)
```
npm list -g
```
インストールされたらWindowsの環境変数にパスを設定してください
パスの確認は以下のコマンドで行えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/5e7b88fe-667b-19ee-88ee-076a3051a7a0.png)
このコマンドにより確認できる
C:\Users\【ユーザー名】\AppData\Roaming\npm\
をパス登録してください
パスが通っていれば、バージョン確認のコマンドでバージョンが確認できます
```
cdk --version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/9b6886c6-5488-df88-07a4-c154cb10cadf.png)

:::note warn
【発生しやすいエラー】
①powershell(.ps1)の実行を無効に設定されている
→「Get-ExecutionPolicy」コマンドを実行した際に「Restricted」となっているとCDKのコマンドが実行できなくなっています
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
を実行して設定を変更してください

:::

## 3．AWS側の準備（IAM Identity Center）
### ①ユーザ作成
ローカルPC側のCDKからデプロイコマンドを使ってAWS環境にスタック作成をする際に必要になる認証情報の設定を行います
AWSコンソール画面から「IAM Identity Center」からユーザー追加を行います
※画面の指示に従い、ユーザ情報を入力して追加を行ってください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/df296391-6731-40e2-b1c3-1799107a3c2c.png)

### ②ユーザグループの作成
各種操作の許可を与えるためのユーザーグループを設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/7f21b7a4-7f56-a0e5-a03d-08b39e11e418.png)
グループには先ほど作成したユーザを含めるようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/83fdcee1-799e-e152-ea50-9ee343c9f379.png)

### ③許可セットの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/e1bbe69e-caaf-0042-d642-dbd860e89b57.png)

必要な許可セットは以下のサービスに関するものを設定してください
・AmazonEC2ContainerRegistry～
・AmazonS3～
・AmazonSSM～
・AWSCloudFormation～
・AWSConfigUserAccess
・IAM～
・AWSLambda～
### ④許可セットの紐づけ
AWSアカウントから作成したユーザやユーザグループに対して許可セットの設定を行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/75d49ff0-6b23-dc78-592b-8a0e9491de65.png)


## 4．CDKアプリケーションの作成：初期設定
### ①CDK プロジェクトの作成
以下のコマンドでプロジェクトの初期構成を作成します
※私はPythonが使い慣れているので言語はPythonを指定しています
```
cdk init app --language python
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/95531f75-825e-4da1-ede8-4e3b61dffb37.png)

↓このようにプロジェクトの中身ができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/f07cab81-d64d-db7c-1e44-0be8771a964f.png)

Pythonの場合は以下のコマンドを実行して実行環境に必要な設定を行います
```
.venv/Scripts/activate
python -m pip install -r requirements.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/431a298c-7c0c-4948-64a8-99cb0d8b631a.png)


### ②AWS環境の設定
SSO情報を入力してAWS環境との接続セッションを確立します
```
aws configure sso
```
上記コマンドを実行すると「SSO start URL」「SSO Region」などの入力を求められます
これらの値はAWSの「アクセスポータル」画面から確認することができますので、それらの値を入力してください
↓こんな画面から参照できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/10c0d02c-a46f-bfe9-3834-b56aaf7acdcc.png)


### ③CDK スタックの環境を設定する方法
プロジェクトの「app.py」というファイルにアカウントIDとリージョン名を設定します
#!/usr/bin/env python3
import os

import aws_cdk as cdk

from cdk_pj.cdk_pj_stack import CdkPjStack
``` app.py
app = cdk.App()
CdkPjStack(app, "CdkPjStack",
    # If you don't specify 'env', this stack will be environment-agnostic.
    # Account/Region-dependent features and context lookups will not work,
    # but a single synthesized template can be deployed anywhere.

    # Uncomment the next line to specialize this stack for the AWS Account
    # and Region that are implied by the current CLI configuration.

    #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),

    # Uncomment the next line if you know exactly what Account and Region you
    # want to deploy the stack to. */

    env=cdk.Environment(account='【アカウントID】', region='【リージョン名】'),

    # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html
    )

app.synth()
```

### ④AWS 環境のブートストラップ
以下のコマンドを実行することで、CDK デプロイのために環境が準備されます。

```
cdk bootstrap --profile 【プロファイル名】

```
:::note warn
【発生しやすいエラー】
①CDKのバージョンによってはエラーが発生する
→npm install -g aws-cdk@2.163.1 で別バージョンをインストールして試してください
②Encountered a permissions error performing・・・などの権限関連エラーが出る
→AWS関連の設定に記載したポリシー設定を追加/修正してください

:::


↓成功するとこのようなログが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/290a7ec3-942a-20d0-797f-17e86c20c372.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/cbf23e59-048a-6574-a6d0-f3726edbcaa4.png)

AWS側を確認すると、CloudFormationのコンソール画面でCDKで作成したスタックが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/d050570e-1cb3-12f8-9d59-d4843709c95b.png)


## 5．CDKアプリケーションの作成：リソースの作成とデプロイ
### ①Lambda関数の作成
AWSに反映するリソースの例として今回はLambda関数を作成します
プロジェクトのフォルダ内にあるスタック定義のファイル(今回はcdk_pj_stack.py)を編集します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/8c5a8631-4c13-af52-0f50-46a6061aedec.png" width=50%>
編集内容はAWSドキュメントのステップ6の内容と同じく、「Hello World!」を返すように修正します

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/hello_world.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/ef9b1607-52b0-68e5-66b3-3afd1a8ca801.png)


### ②CloudFormationのテンプレートを作成
以下のコマンドを実行し、CloudFormationのテンプレートを作成します

```
cdk synth
```
成功すると生成されたCloudformationテンプレートの内容がログとして出力されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/2b0b478a-6ef3-7dbc-9a35-500998cc81c8.png)


### ③デプロイ
以下のコマンドを実行し、AWS環境にCloudFormationのテンプレートを反映してスタックを作成します

```
cdk deploy --profile 【プロファイル名】
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1c42e092-feeb-2e53-cce1-fe7cd580a20f.png)

:::note warn
セッションのタイムアウトにより、SSOの再接続が必要な場合があります
エラーメッセージで「Please log in using "aws sso login"」というメッセージが表示された場合は
以下のコマンドからSSO接続を再度行ってください

```
aws configure sso
```

:::

## 6．結果確認
### ①スタック一覧で確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/c014f6be-68ca-dd68-c146-d1856af9f8eb.png)

### ②Lambda関数ができたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/36e49c8d-6db8-8b2c-efaf-ca9ca0f770d2.png)


## さいごに
AWSドキュメントのチュートリアルを進めることで、経験がないAWSサービスの理解を深めることができます
ただし、実際に動かしてみると意外と予想外のエラーでつまづくこともあるので
もし余裕があればドキュメントを読むだけではなく実際に手を動かしてみてください