AWS CDK入門しました

はじめに

インフラエンジニアとしてOS周りの設定や管理に携わってきましたが、今回初めてAWSを扱う現場に参加しました。AWSに関する経験は浅いものの、ブログ投稿やイベント参加を通じて積極的に成長していきたいと思っています!

現在、AWS CDK(Cloud Development Kit)が必須のプロジェクトに参加しており、その学習内容をこのブログでアウトプットしていきます。将来的には、CDKを使ったWebアプリの3層構造構築ハンズオンを投稿する予定です!


AWS CDKとは?

AWS CDK(Cloud Development Kit)は、プログラミング言語を用いてクラウド上にアプリケーションを構築するためのツールです。

いわゆる「IaC(Infrastructure as Code)」ですね!有名なツールとしては、TerraformやAnsibleなどがあります。

AWS CDKはTerraformと同じ宣言型のアプローチを採用しています。CDKでは高い抽象化を活用することで、少ないコード量でインフラを定義できますが、その裏ではAWS CloudFormationが動作しており、コードはCloudFormationテンプレートに変換されてデプロイされます。

👉詳しくはこちら AWS Black Belt Webセミナー (YouTube)


AWS CDKの特徴

  • 柔軟性: 条件分岐やループを活用して、柔軟で効率的なコード記述が可能です。

  • 抽象化: 複雑なロジックをカプセル化し、読みやすく管理しやすいコードを実現。

  • 高レベル抽象化モデル(L3 Constructs): 特定のインフラ構成を簡潔に表現。必要最小限のIAMポリシー付与も可能。

  • 公式サポート: AWSサービスなので、公式サポートが利用可能(デベロッパーサポート以上が必要)。


AWS CDKの階層モデル

AWS CDKの階層モデルは、クラウドインフラをプログラム的に定義・管理するための設計構造で、3つの主要な要素(App、Stack、Construct)で構成されています。


引用:デベロッパーガイド>AWS CDK とは

App(アプリケーション)

CloudFormationを包括する最上位の要素で、プロジェクト全体を管理します。

主な役割:

  • アプリケーション全体の設定やスタックの管理
  • すべてのスタックを統括し、デプロイのベースを提供

Stack(スタック)

CloudFormationテンプレートに対応し、AWSリソースの構成単位を表します。
これはCloudFormationのスタック相当で、リソースのデプロイはスタック単位で行われます。

主な役割:

  • リソース群(例: EC2, S3, RDSなど)をグループ化して管理
  • プロジェクト単位で独立したデプロイ可能な単位を形成

例:

from aws_cdk import (
    App,
    Stack,
    aws_s3 as s3
)

# Appの作成(CDKアプリケーション全体のエントリポイント)
app = App()

# Stackの作成
class MyFirstStack(Stack):
    def __init__(self, scope: App, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)

        # S3バケットをスタック内に追加
        s3.Bucket(self, "MyFirstBucket",
                  versioned=True,  # バージョニングを有効化
                  encryption=s3.BucketEncryption.S3_MANAGED)  # マネージド型暗号化を有効化

# Appにスタックを追加
my_stack = MyFirstStack(app, "MyFirstStack")

# CloudFormationテンプレートを生成
app.synth()

この例では、App(アプリケーション)を作成し、その中に単一のStackを追加して、S3バケットをデプロイします。


Construct(コンストラクト)

AWSリソースの基本構成ブロックです。
簡単に言えば、AWSリソースを表現するクラスで、CDKアプリケーションを構築するための「部品」と考えることができます。

私の理解⇒*1つの部品(コンストラクト)が単一のAWSリソース(例えば、S3バケットやEC2インスタンス)を表します。それらの部品を組み合わせることでより高度なインフラが構築できるようになる。
👉詳しくはこちら AWS CDK コンストラクト

主な役割:

  • 再利用可能なAWSリソースの組み合わせを表現
  • 抽象化レイヤーを提供し、簡潔な構文でリソースを定義可能

コンストラクトのレベル

CDKアプリケーションの抽象化の度合いを示す概念であり、コンストラクトは以下の3つのレベルに分類されます。それぞれのレベルは、AWSリソースの扱いや設計の柔軟性に応じた異なる抽象化を提供します。

レベル 使用するケース
L1 細かいカスタマイズが必要な場合や、最新のAWSリソースや機能を利用したい場合。
L2 一般的なユースケースを迅速に構築したい場合。柔軟性と効率のバランスが求められる場合。
L3 アプリケーション全体を構築したい場合や、高度な抽象化を利用して迅速にプロトタイプを作成したい場合。
  1. L1(低レベルコンストラクト)

    • AWS CloudFormationリソースを直接表現するクラスで、Cfnプレフィックスで始まります。
    • すべてのCloudFormationプロパティにアクセス可能。
    • 例:

      from aws_cdk.aws_s3 import CfnBucket
      
      bucket = CfnBucket(self, "MyBucket",
       bucket_name="my-cfn-bucket",
       versioning_configuration={"status": "Enabled"}
      )

      この例のバージョニング設定方法⇒CloudFormationのプロパティ形式を直接記述。

  2. L2(中レベルコンストラクト)

    • AWSサービスに特化し、適切なデフォルト設定を備えたクラス。
    • デフォルト値が用意されており、簡潔なコードで使用可能。
    • 例:

      from aws_cdk.aws_s3 import Bucket
      
      bucket = Bucket(self, "MyBucket",
       versioned=True,
       encryption=BucketEncryption.S3_MANAGED
      )

      この例のバージョニング設定方法⇒True/Falseでシンプルに設定。

L2とL1の主な違い

以下のポイントでL2とL1の違いを比較します。

特徴 L2コンストラクト L1コンストラクト
抽象度 高い(AWSリソースを簡単に操作できるよう抽象化されている)。 低い(AWS CloudFormationリソースを直接操作するため、詳細な制御が可能)。
簡潔さ シンプルで簡潔。少ないコードでリソースを構築可能。 CloudFormationのプロパティを手動で指定するため、記述量が多くなる。
カスタマイズ性 一般的なユースケースに対応し、便利なデフォルト設定を提供。ただし、細かい設定には制限がある場合がある。 CloudFormationの全プロパティにアクセス可能。細かい設定や高度なカスタマイズが可能。
プロパティの指定方法 パラメータとして渡す(例: versioned=Trueencryption=BucketEncryption.S3_MANAGED)。 CloudFormation仕様に基づき、辞書形式で指定(例: versioning_configurationbucket_encryption)。
利用対象 一般的なAWSリソースの操作を簡単に行いたい場合。 最新機能や特定のプロパティを必要とする場合。
AWSリソースとのタイムラグ AWSの新機能に対応するのに時間がかかる場合がある。 CloudFormationに対応しているため、AWSの新機能をすぐに利用可能。
  1. L3(高レベルコンストラクト)

    • いくつかのL2コンストラクトを組み合わせ、特定のユースケースに特化した再利用可能な構成を提供。
    • 例:

      from aws_cdk.aws_ecs_patterns import ApplicationLoadBalancedFargateService
      
      service = ApplicationLoadBalancedFargateService(self, "MyService",
       task_image_options={
           "image": ContainerImage.from_registry("amazon/amazon-ecs-sample")
       }
      )

      この例はALB(Application Load Balancer)付きのFargateサービスを構築する高レベルコンストラクト(ApplicationLoadBalancedFargateService)で少ないコードでロードバランサー付きのECS Fargateサービスを簡単にセットアップできます。

AWS CDKコマンド一覧

コマンド 機能
cdk list (ls) プロジェクト内で定義された全てのスタックを一覧表示します。
cdk synthesize 指定したスタックからAWS CloudFormationテンプレートを生成し、内容を表示します。
cdk bootstrap デプロイに必要なリソース(S3バケット、IAMロールなど)をAWSアカウントにセットアップします。
cdk deploy 指定したスタックをAWSにデプロイし、インフラを構築します。
cdk destroy デプロイしたスタックを削除し、リソースを破棄します。
cdk diff 現在のコードと既存のデプロイ済みテンプレートとの差分を確認します。
cdk metadata 指定したスタックに関連するメタデータを表示します。
cdk init プロジェクトの初期化を行い、テンプレートに基づいた必要な構成を作成します。
cdk context CDKのコンテキスト値(キャッシュされた情報)を管理します。
cdk docs (doc) ブラウザでAWS CDKの公式ドキュメントを開きます。
cdk doctor プロジェクトや環境の潜在的な問題をチェックします。
cdk watch コードの変更を監視し、自動的にスタックを更新・デプロイします。
cdk import 既存のAWSリソースをCDKスタックにインポートします。
cdk migrate 既存のCloudFormationテンプレートやリソースを新しいCDKプロジェクトに移行します。

AWS 公式ドキュメントには、CDKコマンドが網羅されています。
例えばcdk deployコマンドには多数のオプションが用意されており、すべてのスタックをデプロイする場合は**--all**を指定することにより実現できます。
コマンドやオプションがわからない場合は公式ドキュメントを見る癖を付けないとですね!
👉AWS CDK CLI コマンドリファレンスはこちら


まとめ

これからAWS CDKを使いこなし、スムーズなインフラ構築に挑戦していきます。
次回はCDKハンズオンを投稿していきたいと思います!

Last modified: 2025-01-14

Author