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