AWS CDK でプログラミング言語による IaC - コンストラクトとスタックの設計

CDK による TypeScript/Python でのインフラ定義、L1/L2/L3 コンストラクトの使い分け、テスト手法を解説します。

CDK の概要

CDK は TypeScript、Python、Java、C#、Go の 5 言語で AWS インフラを定義する IaC フレームワークです。CloudFormation の YAML/JSON テンプレートを手書きする代わりに、プログラミング言語のクラスとメソッドでリソースを定義します。CDK が CloudFormation テンプレートを自動生成し、デプロイを実行します。

コンストラクトとテスト

L1 コンストラクトは CloudFormation リソースの 1 対 1 マッピングで、全プロパティを明示的に指定します。L2 コンストラクトはベストプラクティスのデフォルト値が適用され、例えば S3 バケットは暗号化とバージョニングがデフォルトで有効です。L3 コンストラクト (パターン) は複数のリソースを組み合わせた高レベルの抽象化で、LambdaRestApi は API GatewayLambda を一括で構築します。Assertions モジュールで hasResourceProperties を使用し、生成されたテンプレートに期待するリソースとプロパティが含まれることをテストします。

CDK Pipelines によるセルフミューテーション

CDK Pipelines はパイプライン自体を CDK で定義し、パイプラインの構成変更もパイプライン経由でデプロイする「セルフミューテーション」パターンを実現します。 CodePipeline をバックエンドとして、ソース取得 → cdk synth → セルフアップデート → デプロイの各ステージを自動構成します。マルチアカウント・マルチリージョンのデプロイでは、 Wave と Stage の概念で並列デプロイと順序制御を宣言的に記述できます。たとえば、開発環境を先にデプロイし、手動承認を挟んで本番環境にデプロイするフローを数十行のコードで定義できます。 cdk diff をプルリクエストのチェックに組み込むと、インフラ変更の影響範囲をレビュー時に可視化でき、意図しないリソース削除や置換を事前に検出できます。 開発ツールの知見を広げたい場合はAmazon の専門書も活用できます。

Aspects とカスタムルールによるガバナンス

CDK の Aspects 機能は、スタック内の全コンストラクトを走査して横断的な検証やプロパティの強制適用を行う仕組みです。たとえば、全 S3 バケットに暗号化を強制する Aspect や、全 Lambda 関数にタグを付与する Aspect を作成できます。cdk-nag ライブラリは AWS のベストプラクティスや NIST、HIPAA などのコンプライアンスルールを Aspects として提供し、cdk synth 時に違反を検出します。独自の Aspect を作成して組織固有のルール (命名規則、特定リージョンの禁止、パブリックアクセスの禁止など) を強制することも可能です。これにより、CloudFormation Guard や Config Rules による事後検出ではなく、コード記述時点でのポリシー違反の防止を実現できます。

CDK の料金

CDK 自体に追加料金は発生しません。CDK は CloudFormation テンプレートを生成するツールであり、コストはデプロイされる AWS リソースの利用料金のみです。CDK Pipelines で CI/CD パイプラインを構築する場合、CodePipeline と CodeBuild の料金が発生します。cdk synth で生成されるテンプレートの S3 保存 (CDK ブートストラップバケット) にも少額のストレージ料金がかかりますが、実質的に無視できる金額です。CloudFormation の YAML を手書きする場合と比較して、CDK の導入による追加コストはゼロです。

CloudFormation との関係と選定

CDK は、プログラミング言語で書いたコードを、最終的に CloudFormation のテンプレートに変換してデプロイします。つまり、デプロイの実体は CloudFormation であり、CDK はそれをより書きやすくする層という位置づけです。単純で静的な構成なら、CloudFormation を直接書くほうが分かりやすい場合もあります。一方、繰り返しや条件分岐が多く、再利用可能な部品として整理したい場合は、プログラミング言語の表現力を活かせる CDK が有利です。サーバーレス中心なら専用のフレームワーク、複数クラウドを扱うなら別のツール、というように、要件に応じて選びます。

言語の力を活かした抽象化

CDK の最大の利点は、使い慣れたプログラミング言語の機能をインフラ定義に持ち込めることです。繰り返しの構成はループで生成し、環境による違いは条件分岐で表現できます。よく使う構成を、入力に応じて適切なリソース群を組み立てる部品 (コンストラクト) としてまとめれば、再利用できます。組織の標準的な構成を部品化してパッケージとして共有すれば、チーム全体で一貫した設計を効率よく展開できます。コードとして抽象化することで、重複を減らし、変更を一箇所に集約できる点が、大規模なインフラ管理での生産性を高めます。

デプロイとライフサイクル

CDK には、開発から運用までを支える仕組みがあります。利用を始める前に、デプロイに必要なリソースを準備する初期設定を行います。変更をデプロイする前には、現在の構成との差分を確認でき、何が変わるのかを把握してから反映できます。環境ごとに設定を分け、開発・本番へ同じコードから異なる構成をデプロイできます。手元で実際に作られたリソースが、コードの定義からずれていないかを意識し、変更は必ずコードを通して行うことで、構成の一貫性を保てます。これらを通じて、安全で再現性のあるインフラ運用を実現できます。

まとめ

CDK はプログラミング言語の表現力を活かして AWS インフラを定義する IaC フレームワークです。L1〜L3 のコンストラクト階層で抽象度を選択でき、CDK Pipelines でセルフミューテーション型の CI/CD を構築し、Aspects でガバナンスルールをコードレベルで強制できます。CloudFormation の宣言的な制約を超えた、条件分岐やループを含む柔軟なインフラ定義が最大の強みです。