AWS CLI で、画面で押していた操作をコマンドにできるようになった。ところが、検証環境と同じものを本番にも作ってと言われると、どのコマンドをどの順で打ったかがもう分からない。 設計書を見ると「CloudFormation で管理」「CDK で書く」「Terraform の state」と、似たような言葉が並んでいて、どれが何をしているのかが区別できない。
この記事は、IaC(Infrastructure as Code)を「インフラの設計図をコードで書き、道具にその通りに作らせるやり方」として整理し、宣言型、3つの道具の位置づけ、ドリフトまでをつなげます。
この記事の結論
- IaC は、サーバーやネットワークなどのインフラの構成をコードで書き、道具にその通りに作らせるやり方です。
- IaC の利点は、同じ構成を何度でも同じように作れ、変更の差分を Git でレビューできることです。
- 宣言型の IaC では「あるべき姿」を書き、今の状態との差を埋める手順は道具が決めます。
- AWS CloudFormation は AWS の IaC の土台で、AWS CDK はプログラミング言語から CloudFormation のテンプレートを作る道具です。
- コードの外で手作業の変更をすると、コードと実物がずれる「ドリフト」が起きます。
IaC とは(手作業と何が違うか)
IaC は、インフラの構成をコードとして書き、そのコードから実際の環境を作ったり直したりするやり方です。Terraform の公式ドキュメントは、IaC の道具を「画面の操作ではなく設定ファイルでインフラを管理するもの」と説明しています。
たとえるなら、手作業は「職人がその場の判断で家を建てる」形、IaC は「先に図面を書き、図面どおりに建ててもらう」形です。 図面があれば、同じ家を何軒でも建てられます。間取りを変えるときも、図面のどこを直したかを見れば、何が変わるかが分かります。
BY HAND OR BY CODE手作業と IaC
構成を人の記憶に残すか、コードに残すか
手作業
- 手順は人の記憶と手順書書き漏れがあっても気づけない
- 作るたびに差が出る抜け・打ち間違い
- 変更は変えたあとに確かめる誰が何を変えたかを探す
IaC
- 構成はコードそのものテンプレートが正しい姿
- 同じコードから同じ環境検証と本番をそろえられる
- 差分を見てから適用するGit の履歴とレビューが残る
たとえから正確な言葉に戻して、手作業と比べます。
| 観点 | 手作業(コンソール・都度のコマンド) | IaC |
|---|---|---|
| 構成がどこに残るか | 人の記憶と、あとから書いた手順書 | コード(テンプレート)そのもの |
| 同じものをもう1つ作る | 手順をなぞり直す。抜けや打ち間違いで差が出る | 同じコードを別の環境に適用する |
| 変更を確かめる | 変えたあとに画面で確認する | 適用する前に差分を見て、レビューしてから反映する |
| 誰が何を変えたか | 操作の記録を探す | Git の履歴に、誰が・なぜ変えたかが残る |
| 片付け | 作ったものを1つずつ探して消す | まとめて作ったものを、まとめて消せる |
コードを Git で管理すると、インフラの変更もアプリのコードと同じように、差分を見てレビューしてから取り込めます。Git の基本は先に押さえておくと読みやすくなります。
READ ALSO — 未経験向け・段0 土台
Git とは何か|「上書き保存」と「版を残す」の違いを、最初の3つの動作で理解する
宣言型とは何か(手順ではなく、あるべき姿を書く)
IaC の書き方には、大きく2つの型があります。
- 手続き型 … 「VPC を作る → サブネットを作る → EC2 を起動する」と、手順を順番に命令として書く。AWS CLI を並べたスクリプトはこちらに近い形です。
- 宣言型 … 「VPC が1つ、サブネットが2つ、EC2 が1台ある状態」と、最終的な姿を書く。今の状態との差を埋める手順は、道具が考えます。
違いが出るのは、2回目以降です。手続き型のスクリプトをもう一度流すと、すでにある VPC をもう一度作ろうとして失敗したり、二重に作ったりします。 宣言型では、道具が今の状態と書かれた姿を比べ、足りない分だけ作り、違う分だけ直すので、同じコードを何度適用しても同じ姿に落ち着きます。
Terraform の公式ドキュメントも、その設定言語を「あるべき最終状態を記述する宣言型」で、手順を一つずつ書く手続き型とは異なると説明しています。 AWS CloudFormation のテンプレートも、作りたいリソースとその設定を並べる宣言型の書き方です。
「差分を見てから適用する」が基本の動き
宣言型の道具は、適用する前に「何を作り・何を変え・何を消すか」を見せる機能を持っています。 CloudFormation では 変更セット、Terraform では plan と呼びます。とくに、設定の変更によってリソースが作り直し(置き換え)になる場合があるので、データを持つリソースでは適用の前にここを確かめてから適用する、という運用が一般的です。
CHECK 1ここまでの確認
「宣言型」の IaC の説明として正しいものは?
答えと解説
答え: 2. 最終的にどうなっていてほしいか(あるべき姿)を書き、差を埋める手順は道具が決める
宣言型は「何がどうあってほしいか」を書く書き方です。手順を並べる手続き型との違いは「宣言型とは何か」の章を読み直してください。
CloudFormation・CDK・Terraform はどう位置づけられるか
AWS で名前を聞く IaC の道具は、主にこの3つです。似ていますが、「どの言葉で書くか」と「誰が実際に作るか」が違います。
CODE TO CLOUDコードから実物へ
書いた姿と今の姿の差だけを、道具が埋める
-
書く
テンプレート・CDK・HCL
-
差分を見る
変更セット・plan
-
適用する
道具が API を呼ぶ
-
実物ができる
VPC・EC2・ロール
-
状態を記録
スタック・state
AWS CloudFormation — AWS の IaC の土台
AWS CloudFormation は、JSON か YAML で書いた テンプレート から、AWS のリソースをまとめて作る AWS のサービスです。 テンプレートから作ったリソースのまとまりを スタック と呼び、作成・更新・削除をスタック単位で行います。スタックの状態は CloudFormation 側が持つので、利用者が状態のファイルを管理する必要はありません。
AWS CDK — プログラミング言語で書いて、CloudFormation に渡す
AWS CDK(Cloud Development Kit)は、TypeScript や Python などのプログラミング言語でインフラを定義する道具です。 CDK のコードは 合成(synth) という段階で CloudFormation のテンプレートに変換され、実際の作成と更新は CloudFormation のスタックとして行われます。 つまり CDK は CloudFormation の代わりではなく、CloudFormation のテンプレートを書く手間を、プログラミング言語の部品(コンストラクト)で減らす道具です。
サーバーレスの構成には、CloudFormation の書き方を短くした AWS SAM もあります。これも最終的には CloudFormation で展開されます。
Terraform — 複数のクラウドを同じ書き方で扱う
Terraform は HashiCorp が提供する IaC の道具で、HCL という専用の設定言語で書きます。 プロバイダー という部品を通じて、AWS だけでなく他のクラウドや SaaS も同じ書き方で扱えます。 Terraform は、コードと実物の対応を state(状態のファイル)に記録します。CloudFormation と違って、この state の置き場所と共有の仕方を利用者が決める必要があります。
| 観点 | AWS CloudFormation | AWS CDK | Terraform |
|---|---|---|---|
| 書く言葉 | JSON / YAML のテンプレート | TypeScript・Python などのプログラミング言語 | HCL(専用の設定言語) |
| 実際に作るのは | CloudFormation | CloudFormation(テンプレートに変換してから) | Terraform がプロバイダー経由で API を呼ぶ |
| 状態を持つ場所 | CloudFormation のスタック | CloudFormation のスタック | state ファイル(置き場所は利用者が決める) |
| 適用前の差分 | 変更セット | cdk diff と変更セット | terraform plan |
| 扱える範囲 | AWS | AWS | AWS と、他のクラウド・SaaS |
どれが優れているかではなく、職場で何を使っているか、AWS 以外も扱うか、チームがプログラミング言語に慣れているかで選ばれます。 3つとも宣言型の考え方と「差分を見てから適用する」流れは共通なので、1つを理解すれば残りは読めるようになります。
CHECK 2ここまでの確認
AWS CDK と AWS CloudFormation の関係として正しいものは?
答えと解説
答え: 1. CDK はプログラミング言語で書いた定義から CloudFormation のテンプレートを作り、CloudFormation がそれを使って作る
CDK のコードは合成(synth)で CloudFormation のテンプレートになり、実際の作成と更新は CloudFormation のスタックとして行われます。「CloudFormation・CDK・Terraform」の章を読み直してください。
ドリフトとは何か(コードと実物がずれるとき)
IaC で作った環境でも、障害対応の最中に誰かがコンソールでセキュリティグループのルールを1本足した、ということは起こります。 このとき、コードに書いた姿と実物の姿がずれます。この状態を ドリフト と呼びます。
DRIFT BREAKS THE LOOPドリフトで切れる輪
手で変えると輪が切れる。正しい姿をコードに戻す
コード
が正しい姿
- コードを書く
- 差分を確かめる
- 適用する
- 手で変えるコードの外の変更
- ドリフト検出
正しい変更
コードに書いて取り込む
レビューを通して履歴に残す
誤った変更
適用し直して戻す
実物をコードの姿にそろえる
ドリフトが困るのは、次に誰かがコードを適用したときです。宣言型の道具はコードの姿に合わせようとするので、手で足したルールが、次の適用で黙って消えることがあります。 逆に、手で変えた設定が正しかった場合でも、それがコードに無いので、同じ環境を別の場所に作ったときには再現されません。
CloudFormation には、スタックのリソースがテンプレートの姿からずれていないかを調べる ドリフト検出 があります。テンプレートとパラメータから期待される値と実際の値を比べ、プロパティごとに差を示します。 Terraform では、plan を流したときに実物との差として表れます。
ずれに気づいたら、直し方は2つです。
- 手の変更が正しいなら … コードに同じ変更を書き、レビューして取り込む(コードを実物に合わせる)。
- 手の変更が誤りなら … コードを適用し直して、実物をコードの姿に戻す。
どちらにしても、正しい姿はコードにある状態に戻すのが目的です。そのためにチームで「IaC で作ったものは手で直さない。急ぎで直したら、あとでコードに書く」と決めておくのが、ドリフトを小さく保つ基本です。
CHECK 3ここまでの確認
IaC で作った環境の設定を、誰かがコンソールで直接変えたときに起きる状態は?
答えと解説
答え: 2. コードに書いた姿と実物がずれる「ドリフト」が起き、次に適用すると手で変えた分が上書きされるおそれがある
コードの外で変えると、コードと実物がずれます。これをドリフトと呼びます。気づき方と直し方は「ドリフトとは何か」の章を読み直してください。
IaC を始めるときに何を押さえるか
最初の1本を書く前に、事故になりやすい点を3つ押さえておきます。
IaC で事故になりやすい3つ
- パスワードやアクセスキーをテンプレートやコードに直接書き、Git に残してしまう
- データベースのような消えて困るリソースで、差分の「置き換え」を見落として適用する
- IaC で作った環境を手で直し続け、コードと実物の差が大きくなる
1つめは、秘密の値をコードに書かずに、AWS Secrets Manager などに置いて参照する形にします。 2つめは、適用の前に変更セットや plan で置き換えの有無を確かめ、CloudFormation なら削除や置き換えのときにスナップショットを残す設定(DeletionPolicy)を検討します。 3つめは、前の章のドリフトの話です。
IaC の効き目が最も大きいのは、同じ構成を複数の環境やアカウントに配るときです。アカウントを境界として分ける設計では、StackSets のように1つのテンプレートを多数のアカウントへ配る仕組みが前提になります。
READ ALSO — プロフェッショナル向け・段4 設計
マルチアカウント設計|アカウントを「境界」として使い、Organizations と SCP で組織のガードレールを引く
参照ソース
- What is AWS CloudFormation?(AWS CloudFormation ユーザーガイド) — テンプレートとスタックの定義、AWS のリソースをまとめて作る仕組み(2026年9月時点)
- Update CloudFormation stacks using change sets(AWS CloudFormation ユーザーガイド) — 適用前に変更内容と置き換えの有無を確かめる変更セット(2026年9月時点)
- Detect unmanaged configuration changes to stacks and resources with drift detection(AWS CloudFormation ユーザーガイド) — ドリフトの定義と、テンプレートの期待値と実際の値を比べる検出の仕組み(2026年9月時点)
- DeletionPolicy attribute(AWS CloudFormation ユーザーガイド) — 削除時にリソースを残す・スナップショットを取る設定(2026年9月時点)
- What is the AWS CDK?(AWS CDK v2 デベロッパーガイド) と Configure and perform CDK stack synthesis(同) — プログラミング言語での定義と、CloudFormation テンプレートへの合成(2026年9月時点)
- What is Infrastructure as Code with Terraform?(HashiCorp Developer) — IaC の定義と、宣言型の設定言語の説明(2026年9月時点)
- State(Terraform ドキュメント、HashiCorp Developer) — state がコードと実物の対応を記録する役割(2026年9月時点)


