AWS CDK をざっくり理解する！

## はじめに

AWS CDK（Cloud Development Kit）とは、AWSのインフラをコードで管理・定義できるフレームワークです。

CloudFormationと連携して動作し、インフラ構築をプログラミング言語で記述できます🤗

先日、実務で初めてCDKコードの改修をしたので色々とメモしておきます。

## 目次

1. [AWS CDKの特徴](#-aws-cdkの特徴)
2. [CDKの基本構成](#-cdkの基本構成)
3. [CDKの簡単な例](#-cdkの簡単な例)
4. [CDKのメリット](#-cdkのメリット)
5. [CDKとCloudFormationの違い](#-cdkとcloudformationの違い)
6. [npx cdk synth と cdk diff](#-npx-cdk-synth-と-cdk-diff)
7. [まとめ](#-まとめ)
8. [参考文献](#-参考文献)

## 🧷 AWS CDKの特徴
### 1. インフラをコードで管理（IaC）
* 従来は、AWSのインフラを構築するためにコンソールで手動設定したり、CloudFormationでYAML/JSONのテンプレートを書いていました。
* CDKでは、TypeScript, Python, Java, C#, Goなどのプログラミング言語でインフラを定義できるため、コードの再利用性や可読性が高まります。
### 2. CloudFormationと連携
* CDKは内部的にCloudFormationテンプレートを生成し、それをデプロイします。
* そのため、CDKで記述したコードはCloudFormationで実行される形になります。
### 3. 高レベルコンストラクト
* CDKではインフラを「コンストラクト」という単位で定義します。
* 例えば、EC2インスタンスやS3バケットを1行のコードで作成できます。
* 高レベルのコンストラクトはベストプラクティスを内包しているため、安全かつ効率的にリソースを定義できます。

## 🧷 CDKの基本構成
CDKのプロジェクトは以下のような構成になります。
```yml
my-cdk-app/
 ├── bin/              → エントリーポイント
 │     └── my-cdk-app.ts
 ├── lib/              → インフラを定義するコード
 │     └── my-cdk-app-stack.ts
 ├── cdk.json          → CDKの設定ファイル
 ├── package.json      → Node.jsの依存関係管理
 ├── README.md
 └── .gitignore
```
### 💡 主要なファイル
**bin/my-cdk-app.ts**
* CDKアプリケーションのエントリーポイント
* ここでスタックを作成してアプリを実行します。

**lib/my-cdk-app-stack.ts**
* インフラ構成を記述する場所

**cdk.json**
* CDKコマンドが使う設定ファイル

## 🧷 CDKの簡単な例
たとえば、S3バケットを作成するCDKコード（TypeScript）を見てみましょう！
### ① CDKプロジェクトの作成
```bash
# CDKのインストール
npm install -g aws-cdk

# 新規プロジェクト作成
cdk init app --language typescript
```

### ② インフラを定義
`lib/my-cdk-app-stack.ts` を編集します
```typescript
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    // S3バケットの作成
    new s3.Bucket(this, 'MyFirstBucket', {
      versioned: true, // バージョニング有効
      removalPolicy: cdk.RemovalPolicy.DESTROY, // 削除時にリソースも削除
      autoDeleteObjects: true
    });
  }
}
```

### ③ デプロイ
```bash
# デプロイ前にビルド（TypeScriptの場合）
npm run build

# CDKデプロイ
cdk deploy
```
これでAWS上にS3バケットが作成されます！✨

## 🧷 CDKのメリット
### ✅ コードでインフラ管理

TypeScriptやPythonなど、慣れた言語でインフラ構築できる
条件分岐やループなど、コードの柔軟性を活かせる
### ✅ 再利用性とモジュール化

コンストラクトを再利用できるので、コードの重複が減る
カスタムコンストラクトを作成してモジュール化も可能
### ✅ CI/CDと連携しやすい

GitHub ActionsやCodePipelineと連携することで、自動デプロイが容易

## 🧷 CDKとCloudFormationの違い
| 項目 | AWS CDK | CloudFormation |
|:-----------|:------------|:------------|
| 言語 | TypeScript, Python, etc. | YAML / JSON |
| 開発速度 | 高速（プログラム的に記述） | やや遅い（静的テンプレート） |
| メンテナンス性 | 高い（コードの再利用可） | 低い |
| ベストプラクティス | 組み込みコンストラクト有り | 手動で対応が必要 |

## 🧷 npx cdk synth と cdk diff
AWS CDK（Cloud Development Kit）を使っていると、 `npx cdk synth` と `cdk diff` はよく使うコマンドなので、それぞれの役割についてもついでに記載しておきます😊
### 1. npx cdk synth（CDKのテンプレートを生成する）
#### 🔹 役割
`cdk synth`（synthesize の略）は、CDKのコード（TypeScript, Python, Javaなど）をCloudFormationテンプレートに変換する コマンドです。
#### 🔹 実行方法
`npx cdk synth`
　または
`cdk synth`（npxをつけると、ローカルにCDKがインストールされてなくても実行できる）
#### 🔹 実行結果
コマンドを実行すると、CDKのコードからCloudFormationのYAMLまたはJSONテンプレートが生成され、ターミナルに表示されます。
例えば、TypeScriptで以下のようなCDKコードがあるとします。
```typescript
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

const app = new cdk.App();
const stack = new cdk.Stack(app, "MyStack");

new ec2.Instance(stack, "MyInstance", {
  instanceType: new ec2.InstanceType("t2.micro"),
  machineImage: ec2.MachineImage.latestAmazonLinux(),
}); // npx cdk synthを実行すると、CloudFormationのテンプレートが出力されます。

Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-12345678
```

#### 🔹 使う場面
* デプロイ前にCloudFormationテンプレートを確認したい時
* 生成されたテンプレートを手動で修正・利用したい時
⇨ [Infrastructure Composer](https://qiita.com/nao-United92/items/fa8018ae4c6d438cf028)でインフラ構成をGUI的に見たい時等に利用。
* CDKのコードが正しく変換されているかチェックしたい時

### 2. cdk diff（CDKの変更点を確認する）
#### 🔹 役割
`cdk diff` は、現在のスタックとデプロイ予定の変更点を比較する コマンドです。
 CloudFormationの `change set` に似ています。
#### 🔹 実行方法
`npx cdk diff`
#### 🔹 実行結果
例えば、以下のような変更を加えたとします。
 * 変更前: `t2.micro` のEC2インスタンス
 * 変更後: `t3.micro` へ変更

この状態で `cdk diff` を実行すると、以下のように変更点が表示されます。
```yml
Resources
[~] AWS::EC2::Instance MyInstance MyInstance
 ├─ [~] InstanceType
 │   ├─ [-] t2.micro
 │   └─ [+] t3.micro
```
#### 🔹 使う場面
* 本番環境の変更前に影響を確認したい時
* デプロイ前に予期しない変更がないかチェックしたい時
* 複数人でCDKを開発していて、変更の差分を共有したい時

### 3. cdk synth と cdk diff の違い
* `cdk synth`：CDKコードをCloudFormationテンプレート（YAML/JSON）に変換
* `cdk diff`：変更前後の差分に関する比較変更点をリスト化（追加・変更・削除）

### 4. cdk deploy の流れの中での役割
1. CDKコードを書く
2. `cdk synth` でCloudFormationテンプレートを確認
3. `cdk diff` で変更点を確認
4. `cdk deploy` で実際にデプロイ

CDKの開発フローをスムーズに進めるために、ぜひ活用してください！ 🚀
## 🎉 まとめ
 ✅ AWS CDKは、従来のCloudFormationよりもシンプルかつ効率的にインフラを構築できるツール。
 ✅ コードの再利用やCI/CD連携にも強く、クラウド開発を高速化できる。
 ✅ `npx cdk synth`：CDKコードをCloudFormationテンプレートに変換
 ✅ `cdk diff`：変更前後の差分を比較
 ✅ デプロイ前に **`synth` でテンプレートを確認し、`diff` で影響をチェック**するのがベストプラクティス！

✨ 次のステップ

* 実際にLambdaやAPI Gatewayを組み合わせた構成に挑戦する
* CDK PipelinesでCI/CDを自動化する

使いこなせるとめちゃくちゃ便利っす！😎

## 💫 参考文献
* [AWS CDK とは](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html)
* [AWS Cloud Development Kit](https://aws.amazon.com/jp/cdk/)
* [AWS CDKの言語はTypeScript一択！その理由と必要なスキルをご紹介](https://nodesigngallery.com/column/475/)