AWS CDKの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://zenn.dev/tech4anyone/articles/c05ee9777c6de0)。

この記事ではAWS CDKに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- AWS CDKとは
- AWS CDKの仕組み
- AWS CDK for Advance

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- AWS CDKがどういうサービスか説明できるようになりたい人
- AWS CDKを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS CDKとは
AWS CDKとは高水準言語でインフラストラクチャを記述できるサービスです。
CloudFormationはYAMLかJSONでテンプレートを記述する必要がありました。
しかし、AWS CDKを用いると高水準言語のTypeScript、Python、Java、.NET、C#および Goでインフラストラクチャを定義することが可能です。

これによって、アプリケーションのコードとインフラストラクチャのコードを同じ言語で記述可能となります。
その結果、特にLambdaやECS/EKSを用いたアプリケーションを構築する際には開発者に求められるなスキルセットが最小限で済むようになります。

# AWS CDKの仕組み
AWS CDKはAWS SAMと同様、裏側にCloudFormationが存在しています。

![](https://storage.googleapis.com/zenn-user-upload/e575a71ec357-20231118.png)

そのため、cdk synthというコマンドをCDK CLIで打つとCloudFormationテンプレートを生成することが可能です。
ただし、必ずCloudFormationテンプレートを生成してCloudFormationを実行する必要があるわけではなく、AWS CDKで書いたソースコードから直接デプロイすることも可能です。

ちなみに、AWS CDKでアプリケーションを構築する際は、アプリケーション本体、スタック、エントリポイントの3つが必要です。

具体例を見ながらのほうがわかりやすいと思うので例えば、HelloWorldを表示するLambdaをPythonで作るまでの手順を具体的に書いていきます。
なお、ここではcdk synthは行わず、直接デプロイを想定しています。

1. AWS CDKプロジェクトの初期化
AWS CDKで新しくアプリケーションを作る際には必ずプロジェクトの初期化が必要なのでそれを実行します。

```bash
cdk init --language python
```

2. Lambda関数のコードを追加
HelloWorldLambdaStackクラス内のlambda_handler.pyファイルにLambda関数のコードを記述します。

```python
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello, World!'
    }
```

3. CDKスタックの定義
hello_world_lambda_stack.py ファイルでAWS CDKスタックを定義します。

```python
from aws_cdk import (
    aws_lambda as _lambda,
    core,
)

class HelloWorldLambdaStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Lambda関数を作成
        hello_world_function = _lambda.Function(
            self, 'HelloWorldFunction',
            runtime=_lambda.Runtime.PYTHON_3_8,
            handler='lambda_handler.lambda_handler',
            code=_lambda.Code.from_asset('path/to/your/code'),  # コードのパスを指定
        )
```

4. CDKアプリケーションのエントリーポイントを作成
app.py ファイルでCDKアプリケーションのエントリーポイントを作成します。

```python
from aws_cdk import core
from hello_world_lambda.hello_world_lambda_stack import HelloWorldLambdaStack

app = core.App()
HelloWorldLambdaStack(app, "HelloWorldLambdaStack")
app.synth()
```

5. デプロイ
以下のコマンドでCDKアプリケーションをデプロイします。

```bash
cdk deploy
```

これで、PythonでHelloWorldを表示するLambda関数がAWS CDKを使用してデプロイされます

CDKスタックの定義がCloudFormationテンプレートに最も近いので見比べてみるとCloudFormationテンプレートと比較して記述量がかなり少ないことがわかると思います。

# AWS CDK for Advance
ここまでAWS CDKの基本を説明しましたがLambdaを具体例に挙げたのでAWS SAMとどう違うのか戸惑っている方もいるでしょう。

そこで、ここからはAWS SAMとの比較や統合を説明していきます。

## AWS SAMとの比較
AWS SAMとAWS CDKの比較を以下にまとめました。

| 比較軸 | AWS SAM | AWS CDK |
|--- | --- | ---|
| 対象サービス | サーバレスアプリケーションに使うAWSサービス特化 | 全AWSサービス |
| 利用可能言語 | JSON、YAML | TypeScript、Python、Java、.NET、C#および Go |
| ローカルテスト | 可 | 不可※バリデーションチェックのみ可能 |

AWS CDKと比較したときのAWS SAMの制約事項はサーバレスアプリケーション特化であることとJSONまたはYAMLのみ使用可能であることです。

一方、AWS SAMのメリットはLambdaアプリケーションをローカルでテスト可能なことです。

AWS CDKはcdk synthを利用してCloudFormationテンプレートにできるのかを通したバリデーションチェックはできますが、アプリケーションの動作までは確認できません。

なので、基本的にはAWS CDKをメインで採用することがおすすめです。

## AWS SAMとの統合
AWS CDKをメインで採用したがローカルでサーバレスアプリケーションのテストは行いたい、という場合もあるでしょう。

そういう場合にはAWS CDKでcdk synthを用いてCloudFormationテンプレートを生成した後にSAM CLIでlocal invokeをしてテストするという手法をとることができます。

![](https://storage.googleapis.com/zenn-user-upload/011a26468857-20231118.png)

この方法はCloudFormationテンプレートがある前提でSAM CLIコマンドを実行するので、必ずcdk synthを実施してからlocal invokeしてください。

# まとめ
この記事ではAWS CDKに関連する内容を超詳細にまとめました。

- AWS CDKとは
- AWS CDKの仕組み
- AWS CDK for Advance

次回はStep Functionsを超詳細解説します。