環境構築からデプロイまでの初心者のAWS CDK

# AWS CDKの勉強を始めてみた
仕事でAWS CDKを使うので勉強をはじめました。
CCNAの勉強でAnsibleなどのインフラ構築ツールみたいなものの存在は知っており、AWS CDKについてもなんとなく資格勉強の時に「Pythonでインフラ構築できるやつ」という認識だったのでどんなものかは知っておりました。

今回は実際に環境構築してCDKでインフラ構築を行ってみたいと思います。
まずは環境構築ですが、node関係が必要なので下記記事を参考にPCにnodeやnpmを使える環境を構築していきます。

https://qiita.com/otaruit/items/63dc7ab5f113fcbdc7fd

# CDKインストール
```powershell
npm install -g aws-cdk
cdk --version
```

npmを実行したときに、PATHが設定されていないなど警告される場合
```powershell
fnm env --use-on-cd | Out-String | Invoke-Expression
```
を実行します。
上記を毎回実行するのが面倒であれば、
```
@echo off
fnm env --use-on-cd | Out-String | Invoke-Expression
```
テキストファイルに上記を記載し、「startup.bat」
として保存しておきます。右クリックでショートカットを作成し、
Win+Rで「shell:startup」と入力して、出てきたフォルダに先ほどのショートカットを放り込みます。
これでＰＣを立ち上げるたびに上のコマンドを入力する必要がなくなります。

問題なければ構築完了です。

# アクセスキー等の取得
AWS CLI の準備とアクセスキーを取得していきます。

https://zenn.dev/mo_ri_regen/articles/aws-cli-setting

https://qiita.com/yamasakk/items/3060d22faeed8e05ebe4

上記サイトで解説しているので参考にインストール＆設定が完了しました。

IAMでリソースへのアクセスを許可する設定が必要なので対応します。
![Screenshot 2024-10-24 142026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/8dea2e16-27fa-f0b1-4226-e64cea0f55ab.png)


IAMでポリシーを追加します。
AdministratorAccess または AWSCloudFormationFullAccessを検索して追加します。

再度
```powershell
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```
を実行します。

# プロジェクトの作成
下記コマンドでプロジェクトを作成します。
```powershell
cdk init --language typescript
```

AWS環境を設定します。
下記コマンドでアカウントの確認を行えます。
```powershell
aws sts get-caller-identity --query "Account" --output text
```

下記でリージョンの確認をします。
```powershell
aws configure get region
```

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

上記チュートリアルに従って下記を編集します。

bin/プロジェクト名.ts
```ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkDemoStack } from '../lib/cdk-demo-stack';

const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
  env: { account: 'アカウントナンバー', region: 'リージョン' },
});
```
CdkDemoStackはプロジェクト名が入ります。

# 準備が整いました
下記コードでデプロイする準備が完了します。
```powershell
cdk bootstrap
```
![Screenshot 2024-10-24 144501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/978f7c67-5083-498d-3271-bb29b3ba0e15.png)

構文にエラーがないか確かめる。
```powershell
npm run build
```

アプリ内のCDKスタックを一覧表示します。
```powershell
cdk list
```

CDKスタックについてはこちら

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

まだ完全に理解していないが、リソースみたいなものと理解している。

チュートリアル通り、まずLambdaを定義します。

lib/cdk-demo-stack.ts
```ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Import the Lambda module
import * as lambda from 'aws-cdk-lib/aws-lambda';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);


    // Define the Lambda function resource
    const myFunction = new lambda.Function(this, "HelloWorldFunction", {
      runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime
      handler: "index.handler",
      code: lambda.Code.fromInline(`
        exports.handler = async function(event) {
          return {
            statusCode: 200,
            body: JSON.stringify('Hello World!'),
          };
        };
      `),
    });
  }
}
```

下記にどのようにLambda関数をURLで実行するか定義していきます。
lib/cdk-demo-stack.ts
```ts
    // Define the Lambda function resource の塊の下に下記を記載
    
     // Define the Lambda function URL resource
      const myFunctionUrl = myFunction.addFunctionUrl({
        authType: lambda.FunctionUrlAuthType.NONE,
      });
  
      // Define a CloudFormation output for your URL
      new cdk.CfnOutput(this, "myFunctionUrlOutput", {
        value: myFunctionUrl.url,
      })
```

CloudFormationテンプレートを合成するコマンドを実行します。
AWS CDKは最終的にCloudFormationを実行することになるので下記コマンドでテンプレートを作成します。

```powershell
cdk synth
```
yaml形式のテンプレートが表示されます。

# デプロイを行う
下記コードでデプロイ完了です。
```powershell
cdk deploy
```
デプロイが完了するとエンドポイントURLが出力されるので控えておきます。

下記コマンドでURLをたたいてみます。
```powershell
curl [URL]
```
ステータスコード200,HelloWorldが返されており実行成功です。


![Screenshot 2024-10-24 153251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/a17e45fb-839b-ee06-8558-2023f9d9cf5a.png)

# スタックを変更してみる
Lambdaを実行して返すメッセージを変更します。
```ts
 return {
            statusCode: 200,
            body: JSON.stringify('Hello CDK!'),
          };
```

下記コマンドを実行してCloudFormationテンプレートを作り直します。
```powershell
cdk diff
```

実行すると差分を表示してくれました。
![Screenshot 2024-10-25 090758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/9302d61f-ef19-8601-f534-456f97419413.png)


デプロイしなおします。
```powershell
cdk deploy
```

実行して確かめます。
```powershell
curl [URL]
```

返すメッセージがちゃんと変更されました。
![Screenshot 2024-10-25 091148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/462cdd0e-6f7d-9080-ccd4-b85bb0eb0fab.png)


認証がないLambdaなのでセキュリティのために削除しておきます。
```powershell
cdk destroy
```

お金かかると怖いのできれいに削除しておきましょう。
![Screenshot 2024-10-25 091511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/a3ba80b3-a677-6d37-b2bf-54acd3fbb2d2.png)


# はじめてのCDKを終えてみて
意外と複雑でなくて使いやすいかもしれない。
細かい設定やVPCのリソースの立ち上げについてはめんどくさいらしいので、もうすこし勉強してみたいと思いました。