FOR PRACTITIONERS実務向け

LIaC・CI/CD・開発運用段3基盤層とは

AWS CDK とは何か|プログラミング言語でインフラを書き、CloudFormation に変換して作る仕組み

AWS CDK とは何か|プログラミング言語でインフラを書き、CloudFormation に変換して作る仕組み

引き継いだリポジトリを開くと、YAML ではなく TypeScript や Python のファイルが並んでいて、「これを実行したら何が作られるのか」が見えない。そんな場面から始めます。コードを動かすと AWS に直接リソースが作られるのか、cdk synth や cdk deploy や cdk bootstrap は何をするのか。CDK と CloudFormation の関係が分かれば、この疑問はほぼ解けます。

この記事の結論

  • AWS CDK(Cloud Development Kit)は、プログラミング言語でインフラを定義し、AWS CloudFormation 経由でプロビジョニングするオープンソースのフレームワークです。
  • 構成は「Construct Library(construct の部品集)」と「CDK Toolkit(cdk コマンド)」の2つで、app → stack → construct の入れ子で書きます。
  • construct には、CloudFormation リソース1つに対応する L1、既定値つきの高水準な L2、複数リソースのパターンである L3 の3段階があります。
  • cdk synth でテンプレートを作り、cdk deploy でスタックとして更新します。デプロイ先の環境には事前に cdk bootstrap が必要です。
  • ループや条件分岐、テストが使える反面、生成されるテンプレートを読めないと障害時に困ります。CloudFormation の知識は不要になりません。

AWS CDK とは何か|コードで書いて CloudFormation に変換する

AWS CDK は、インフラの設計図を TypeScript や Python などのプログラミング言語で書けるようにした仕組みです。公式の説明では、コードでインフラを定義し、それを CloudFormation でプロビジョニングするとされています。つまり CDK 自身がリソースを作るのではなく、CDK は書き方の層、実際に作るのは CloudFormation という分担です。

IaC の「宣言型」の考え方(あるべき姿を書き、差を埋めるのは道具に任せる)は、IaC とは何かで扱いました。CDK はその考え方を保ったまま、あるべき姿の書き方を YAML から普通のプログラミング言語に変えたものです。

READ ALSO — 学習中向け・段2 構成 IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ

書き方が変わると、次のことができるようになります。

  • 同じ形の定義を、ループで繰り返し書かずに生成できる
  • 環境(開発・本番)によって値や構成を条件分岐で変えられる
  • 関数やクラスに切り出して再利用できる
  • コードなので、テストや型チェック、エディタの補完が使える

試験の文脈でも、「使い慣れた言語でインフラをコードとして定義し、CloudFormation テンプレートに合成してデプロイする」道具として問われるのは CDK です。CloudFormation そのものは、テンプレートを書いてスタックとして作成・更新・削除するサービスで、CDK はその上に乗る書き方の一つ、という位置づけで覚えておくと混ざりません。

CODE TO STACKコードからリソースまで

CDK は書き方の層で、作るのはCloudFormation

  1. コード

    TypeScript・Python など

  2. cdk synth

    テンプレートに合成

  3. テンプレート

    CloudFormation の形式

  4. cdk deploy

    スタックとして渡す

  5. スタック

    ここでリソースができる

出典: AWS CDK 開発者ガイド

CHECK 1ここまでの確認

CDK で書いたアプリをデプロイするとき、AWS 上にリソースを実際に作成・更新するのはどれ?

答えと解説

答え: 2. CDK が合成したテンプレートを、CloudFormation がスタックとして処理する

CDK は書き方の層で、公式も「CloudFormation 経由でプロビジョニングする」と説明しています。「AWS CDK とは何か」の章を読み直してください。

CDK は何でできているのか|app・stack・construct と L1・L2・L3

CDK は2つの部品でできています。

部品 役割
Construct Library construct(インフラの部品)の集まり。コードの中で new して使う
CDK Toolkit cdk コマンド。合成・差分の確認・デプロイなどを行う

コードの構造は、入れ子の3階層で考えると読めます。

  • app: 全体の入り口。1つのプログラムの単位
  • stack: デプロイの単位。CloudFormation のスタックに対応する
  • construct: stack の中に置く部品。S3 バケットや Lambda 関数など

stack が CloudFormation のスタックに対応することが、CDK と CloudFormation をつなぐ要点です。CDK のリポジトリで stack のクラスが2つあれば、デプロイすると CloudFormation のスタックが2つできる、と読めます。

L1・L2・L3 の違い

construct は抽象度の違いで3段階に分かれます。

区分 中身 自由度と手間
L1 CloudFormation リソース1つにそのまま対応する(CFN リソースとも呼ばれる) 全項目を自分で指定する。抽象化は無い
L2 L1 に既定値や便利な書き方を足した高水準の部品 少ない記述で書ける。細部は部品の既定に従う
L3 複数のリソースを組み合わせた、よくある構成のパターン 一括で作れるが、中身を把握しにくい

普段の実務で最も多く目にするのは L2 です。L2 は必要な既定値を持ち、関連する権限の設定を補ってくれる場合もあります。便利な分、書いていない設定が裏で入ることになるので、何が作られるかはテンプレートで確かめる習慣が要ります。次の章がその話です。

CONSTRUCT LEVELSconstruct の3段階

上の層ほど楽、下の層ほど自由

L1

  • L1: CloudFormation リソース1つに対応
  • L2: 既定値つきの高水準な部品
  • L3: 複数リソースのパターン

L2

  • L1: CloudFormation リソース1つに対応
  • L2: 既定値つきの高水準な部品
  • L3: 複数リソースのパターン

L3

  • L1: CloudFormation リソース1つに対応
  • L2: 既定値つきの高水準な部品
  • L3: 複数リソースのパターン

自分で指定する部品が補う

出典: AWS CDK 開発者ガイド(Constructs)

CHECK 2ここまでの確認

CloudFormation のリソース1つにそのまま対応し、既定値などの抽象化を持たない construct はどれ?

答えと解説

答え: 1. L1

L1 は CFN リソースとも呼ばれ、テンプレートのリソースと1対1です。L2 は既定値つき、L3 は複数リソースのパターンです。「構成」の章を読み直してください。

コードからリソースができるまでの流れは?|synth・diff・deploy

cdk コマンドの役割を、順番に並べます。

  1. cdk synth: コードを実行して、CloudFormation テンプレートに合成する(synthesize)。出力はテンプレート
  2. cdk diff: 現在デプロイされている内容と、これからデプロイする内容の差を見る
  3. cdk deploy: 合成したテンプレートをスタックとしてデプロイする。実際の作成・更新は CloudFormation が行う

ここで大事なのは、コードを実行した時点ではまだ何も作られていない点です。コードは「テンプレートを生成するプログラム」で、AWS 上の変更はデプロイで初めて起きます。

synth の出力は普通のテンプレートなので、デプロイ前に目で読めます。L2 の既定値で何が補われたか、IAM の権限がどう生成されたかは、ここで確認できます。CDK のコードを読んでも見えないものが、テンプレートには全部出ています。

各コマンドの引数やバージョンごとの違いはここでは扱いません。公式の CDK ガイドで確認してください(この記事では個別コマンドのページまでは確かめていません)。

なお、CDK で書いたアプリのデプロイをパイプラインに載せる場合は、CDK Pipelines という仕組みで、パイプライン自体もコードで定義できます。詳しい話は CI/CD の記事で扱います。

READ ALSO — 学習中向け・段2 構成 CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由

CHECK 3ここまでの確認

cdk synth の出力として正しいものは?

答えと解説

答え: 2. CloudFormation テンプレート

synth はコードをテンプレートに合成する段階です。デプロイ前に中身を目で確認できるのが利点です。「流れ」の章を読み直してください。

cdk bootstrap とは何か|デプロイの前に環境へ置かれるもの

初めて CDK を使う環境では、デプロイの前に cdk bootstrap が必要です。これは、デプロイを成り立たせる土台をその環境に用意する作業です。公式の説明では、bootstrap によって次のものが作られます。

  • アセット(Lambda のコードなど、テンプレートに収まらないファイル)を置く S3 バケット
  • コンテナイメージを置く ECR リポジトリ
  • デプロイなどに使う IAM ロール

これらは、既定では CDKToolkit という名前のスタックとして作られます。つまり bootstrap も、中身は CloudFormation のスタックです。

押さえる点は、環境ごとに必要ということです。環境とは「アカウントとリージョンの組」のことで、アカウントやリージョンが増えるたびに、その環境で bootstrap が要ります。「他のアカウントでは動くのに、新しいアカウントでデプロイが失敗する」とき、最初に疑う項目の一つです。

CHECK 4ここまでの確認

新しいアカウント・リージョンに初めて CDK でデプロイする前に、bootstrap が要るのはなぜ?

答えと解説

答え: 2. アセットの置き場や実行用の権限など、デプロイの土台を環境に用意するため

bootstrap は S3 バケット・ECR リポジトリ・IAM ロールなどを環境ごとに用意します。環境ごとに独立しているので、環境が増えればその数だけ必要です。「bootstrap」の章を読み直してください。

CDK と CloudFormation(YAML)・Terraform はどう使い分けるか

3つを並べて比べます。

観点 CDK CloudFormation(YAML) Terraform
書く言語 TypeScript・Python などのプログラミング言語 YAML または JSON のテンプレート 専用の設定言語
実行する裏側 CloudFormation(テンプレートに合成して渡す) CloudFormation Terraform 自身がプロバイダ経由で API を呼ぶ
状態の持ち方 CloudFormation のスタックが持つ CloudFormation のスタックが持つ Terraform の状態として別に持つ

CDK VS CFN VS TERRAFORM書き方と裏側の違い

CDK と CloudFormation は裏側が同じ

CDK / CloudFormation

裏側は CloudFormation

  • 書く言語CDK はプログラミング言語、CFN は YAML
  • 状態スタックが持つ

Terraform

裏側は Terraform 自身

  • 書く言語専用の設定言語
  • 状態Terraform の状態として別に持つ
Terraform の詳細は iac-toha を参照

Terraform の中身は、IaC とは何かの範囲に留めます。ここで言えるのは次の整理です。

  • CDK と CloudFormation は、裏側が同じ。違うのは書き方だけで、デプロイ後に見える姿(スタックやイベント)は同じ
  • Terraform は裏側が別。AWS 以外も同じ道具で扱いたい、すでに Terraform の資産とスキルがある、といった事情で選ばれる
  • どれが優れているかは断定できない。書く人のスキル、既存資産、運用の体制で決まる

注意したい点

CDK は書きやすい反面、テンプレートを読めないと困ります。デプロイが失敗したとき、エラーは CloudFormation のイベントとして出ます。リソースの論理 ID も CDK が自動で付けたもので、コードの変数名とは違います。また、手作業でコンソールから変更された場合のドリフトも、CloudFormation の機能で検出します。CDK を使っても、CloudFormation の知識は不要になりません。

READ ALSO — プロフェッショナル向け・段4 設計 AWS CloudFormation とは何か|変更セット・ドリフト・StackSets で基盤をコードで持つ設計の入口

実務で CDK のリポジトリを渡されたら最初に見る場所

最初の1時間でやることを、順に並べます。動かす前に読むのが基本です。

  1. app の入り口を探す: どの stack をいくつ作っているか。stack の数がデプロイされるスタックの数になる
  2. 対象の環境を確認する: どのアカウント・リージョンに向けているか。bootstrap 済みかどうかもここで分かる
  3. cdk synth でテンプレートを出す: コードではなく、出力されたテンプレートでリソースの一覧と IAM の権限を確認する
  4. cdk diff で差を見る: 今デプロイされているものと、自分の変更の差を見てからデプロイする
  5. どの construct が L1・L2・L3 かを見る: L2・L3 は書いていない設定が入るので、裏のテンプレートと突き合わせる

この順番は、「コードを実行する前に、何が起きるかをテンプレートで確かめる」という考え方にそろえてあります。

Cloudory 執筆者(AWS 認定 全冠)

CDK は便利ですが、CDK を使っていることが「CloudFormation を知らなくてよい」理由にはなりません。この記事は公式ドキュメントを根拠にまとめたもので、CDK を本番で運用した経験として書いたものではありません。次に読む CloudFormation の記事とセットで、テンプレートを読む力をつけてください。

まとめ

  • CDK はプログラミング言語でインフラを書く層で、実際の作成は CloudFormation が行う。stack が CloudFormation のスタックに対応する
  • construct は L1(1対1)・L2(既定値つき)・L3(パターン)の3段階。L2 以上は書いていない設定が入る
  • cdk synth でテンプレートを作り、cdk diff で差を見て、cdk deploy でスタックとして更新する
  • 新しい環境(アカウントとリージョンの組)には、デプロイの前に cdk bootstrap が要る
  • テンプレートが読めれば、CDK は強い道具になる。次は CloudFormation を読む

参照ソース

SCOREこの記事の確認テスト

0/4問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

CDK は、設計図を手書きの定型書式ではなく、使い慣れた言語で書けるようにした道具です。書いた内容は定型書式の設計図に清書され、実際に建てるのは従来どおり CloudFormation という施工会社です。

前提を持たない人にそのまま渡せる記事です。「後輩に説明する」「顧客に理由を伝える」の材料として。

FAQよくある質問

CDK を使うと CloudFormation の知識は要らなくなる?

要ります。実際の作成は CloudFormation が行うため、失敗時のイベントやドリフトの表示は CloudFormation の言葉で出ます。CDK は書き方を楽にする層で、裏側を読む力は引き続き必要です。

CDK と Terraform はどちらを選ぶべき?

優劣は断定できません。書く言語、状態の持ち方、組織がすでに持っている資産やスキルで決めます。AWS だけを扱うのか、複数のクラウドを同じ道具で扱いたいのかも判断材料です。

CDK の料金はいくら?

CDK 自体の料金は、この記事では確認できていないため断定しません。公式ページで確認してください。なお、CDK で作ったリソース(EC2 や S3 など)には、そのサービスの料金が別に掛かります。

この記事の次は何を読めばいい?

裏側の CloudFormation を扱う cloudformation-toha です。変更セット、ドリフト、StackSets など、CDK のデプロイで起きることを CloudFormation の言葉で読めるようになります。

SAME TRACK同じ領域の記事

CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用
CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用 段2 構成運用
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計 段2 構成設計
CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由
CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由 段2 構成仕組み