🚀

AWS CDKの超詳細解説

2023/11/18に公開

はじめに

この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧はこちら

この記事では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が存在しています。

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

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

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

  1. AWS CDKプロジェクトの初期化
    AWS CDKで新しくアプリケーションを作る際には必ずプロジェクトの初期化が必要なのでそれを実行します。
cdk init --language python
  1. Lambda関数のコードを追加
    HelloWorldLambdaStackクラス内のlambda_handler.pyファイルにLambda関数のコードを記述します。
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello, World!'
    }
  1. CDKスタックの定義
    hello_world_lambda_stack.py ファイルでAWS CDKスタックを定義します。
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'),  # コードのパスを指定
        )
  1. CDKアプリケーションのエントリーポイントを作成
    app.py ファイルでCDKアプリケーションのエントリーポイントを作成します。
from aws_cdk import core
from hello_world_lambda.hello_world_lambda_stack import HelloWorldLambdaStack

app = core.App()
HelloWorldLambdaStack(app, "HelloWorldLambdaStack")
app.synth()
  1. デプロイ
    以下のコマンドでCDKアプリケーションをデプロイします。
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をしてテストするという手法をとることができます。

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

まとめ

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

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

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

Discussion