【AWS CDK】AWS CDKを触ってみた！

# はじめに
<!-- 発端や概要を記載 -->
本記事ではAWS CDKの基本的な使い方を書いたもの（セットアップからTypeScriptを使ったプロジェクト構築まで）になります。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. AWS CDKとは
2. AWS CDK環境構築をする
3. プロジェクトを作成する
4. 各ファイル/ディレクトリの役割
5. cdkコマンドを使ってみる
6. まとめ

<!-- 各チャプター -->
# AWS CDKとは
最新のプログラミング言語を使用して AWS のインフラストラクチャをコードとして定義し、それをデプロイ、管理する事ができるソフトウェア開発フレームワークです。つまり、 CloudFormation や Terraform のような IaC  （ Infrastructure as Code ）の手段の 1 つということです。

CloudFormation や Terraform との違いとして、
「慣れ親しんだ言語を使用できる」というメリットがあります。（Python、TypeScript、Javaなどなど）

プログラマー出身の人からすると、とっつきやすいIaCかもしれませんね。

# AWS CDK環境を構築する

では、CDKを始めるためのセットアップ作業をしていきましょう。
セットアップß端末のOSはLinux(Red Hat)を想定しています。

#### node.jsをインストールする

・cdkパッケージ
・TypeScriptの実行環境
を用意するために必要なNode.jsをインストールしていきましょう。

```
sudo dnf install -y nodejs
```

#### AWS CLIをインストール

CDKからAWSリソースをデプロイする際にIAMユーザーの認証情報が必要になります。
AWS CLIで事前に認証情報を定義することができますのでインストールしましょう。

```
sudo dnf install -y aws-cli
```

#### AWS CLIの設定を行う

認証情報を設定していきます。

```
aws configure
```

| 項目 | 説明 |
|:-----------|:------------|
| AWS Access Key ID | IAMユーザーのアクセスキー        |
| AWS Secret Access Key | IAMユーザーのシークレットキー |
| Default region name | 作成したいリージョン |
| Default output format | json |

アクセスキー/シークレットキーは
1. 右上のIAMユーザー名をクリック
2. セキュリティ認証情報をクリック
3. アクセスキーを作成
で取得することができます。

下記コマンドで設定した内容を確認することができます。

```
aws configure list
```

#### TypeScriptコンパイラをインストールする

```
npm install -g typescript
```

#### AWS CDKをインストールする

最後に、cdkをインストールしましょう。

```
npm install -g aws-cdk
```

これにて、準備作業は完了になります。

# プロジェクトを作成する
では、いよいよAWS CDK環境を構築していきます。

#### AWS CDK用の作業ディレクトリを作成する

cdkプロジェクトを作成するためのディレクトリを用意します。
以降このディレクトリで作業していきます。

```
mkdir <cdkプロジェクト名>
```

```
cd <cdkプロジェクト名>
```

#### CDKプロジェクトを作成

ではお待ちかねのcdkプロジェクトを作成していきましょう！
languageにはtypescriptを指定します。

```
cdk init app --language typescript
```

#### dotenvパッケージをインストールする

最後にdotenvパッケージをインストールしておきます。
dotenvは、.env ファイルに定義された環境変数をNode.jsの process.env にロードするためのライブラリです。

```
npm install dotenv
```

cdkプロジェクト配下に.enxファイルを作成しておきましょう。

```
touch .env
```

これで環境構築は完了となります。

# 各ファイル/ディレクトリの役割

cdkプロジェクトにある各ファイル/ディレクトリの役割を体系的に把握しておきましょう。

```
my-cdk-app/
├── bin/                # アプリケーションエントリポイント
│   └── my-cdk-app.ts   # Appインスタンスを作成しスタックをロード
├── lib/                # スタック定義を配置するディレクトリ
│   └── my-cdk-app-stack.ts
├── test/               # ユニットテスト用
├── cdk.json            # CDK設定ファイル
├── package.json        # npm設定ファイル
└── tsconfig.json       # TypeScript設定ファイル
```

#### bin
binディレクトリは、アプリケーションのエントリポイントとなるコードを配置する場所です。
libディレクトリで定義されたスタック（Stack）をロードしてデプロイ対象に含めます。

```typescript:
#!/usr/bin/env node
import 'dotenv/config';
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { NetworkStack } from '../lib/network-stack';
import { ApplicationStack } from '../lib/application-stack';

const AWS_ACCOUNT = process.env.AWS_ACCOUNT;
const AWS_REGION = process.env.AWS_REGION;

const app = new cdk.App();

// ネットワークスタックの作成
const networkStack = new NetworkStack(app, 'NetworkStack', {
    env: {
        account: AWS_ACCOUNT,
        region: AWS_REGION,
    },
});

// アプリケーションスタックの作成
new ApplicationStack(app, 'ApplicationStack', {
    env: {
        account: AWS_ACCOUNT,
        region: AWS_REGION,
    },
    vpc: networkStack.vpc, // ネットワークスタックの出力を使用
});
```

#### lib
CDKスタック（Stack）を定義するためのコードを配置する場所です。
AWSリソースを作成・管理するためのCDKスタック（Stackクラス）が定義されます。

```
lib/
├── network-stack.ts       # ネットワーク関連のリソース
├── database-stack.ts      # データベース関連のリソース
├── application-stack.ts   # アプリケーション関連のリソース
```

# cdkコマンドを使ってみる
折角cdkプロジェクトを構築できましたので
動作検証も兼ねて、cdkコマンドを軽く触っていきたいと思います。

#### 新しいcdkプロジェクトを初期化する

先ほど実施したコマンドですね。
languageに好きな言語を指定することで、その言語に基づいたテンプレートが生成されます。

```
cdk init
```

#### CloudFormationテンプレートの生成

CDKコードをCloudFormationテンプレートに変換するコマンドです。デプロイ前に内容を確認するのに便利です。

```
cdk synth
```

#### 初期デプロイの準備

初回デプロイの前に実行するコマンドで、CDKが使用する必要なリソース（S3バケットなど）をAWSアカウントに作成します。
特定のスタックのみをデプロイする場合は、スタック名を指定します。

```
cdk bootstrap
```

#### スタックのデプロイ

作成したCDKスタックをAWSにデプロイするコマンドです。

```
cdk deploy
```

#### スタックの削除

デプロイ済みのCDKスタックを削除するコマンドです。リソースを削除したいときに使用します。
特定のスタックのみを削除する場合は、スタック名を指定します。

```
cdk destroy
```

#### スタックの一覧確認

現在のCDKアプリに定義されているスタックの一覧を表示します。

```
cdk list
```
#### CDK環境のチェック

CDK環境に問題がないかチェックするためのコマンドです。問題が発生したときのトラブルシューティングに役立ちます。

```
cdk doctor
```

#### 差分の確認

ローカルのCDKアプリと、デプロイ済みのCloudFormationテンプレートの差分を確認するコマンドです。

```
cdk diff
```

# まとめ
今回はAWS-CDKを使ってみましたが、プログラミングをしながらリソースを作成できることに終始感動してました笑
とは言いつつも投稿主はTypescriptを触ったことがないので、まずは言語の学習から入ることになりそうです。

あとは、コンテナにCDK環境を構築してみたいと思いましたね。
もし実現できたら備忘録がてらにブログ投稿したいと思います。

では、またノシ