FOR LEARNERS学習中向け

LIaC・CI/CD・開発運用段2構成層とは

IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ

IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ

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コードから実物へ

書いた姿と今の姿の差だけを、道具が埋める

  1. 書く

    テンプレート・CDK・HCL

  2. 差分を見る

    変更セット・plan

  3. 適用する

    道具が API を呼ぶ

  4. 実物ができる

    VPC・EC2・ロール

  5. 状態を記録

    スタック・state

CDK は「書く」のあとに CloudFormation のテンプレートへ合成(synth)され、以降は CloudFormation が作る

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ドリフトで切れる輪

手で変えると輪が切れる。正しい姿をコードに戻す

コード

が正しい姿

  1. コードを書く
  2. 差分を確かめる
  3. 適用する
  4. 手で変えるコードの外の変更
  5. ドリフト検出

正しい変更

コードに書いて取り込む

レビューを通して履歴に残す

誤った変更

適用し直して戻す

実物をコードの姿にそろえる

ドリフトが困るのは、次に誰かがコードを適用したときです。宣言型の道具はコードの姿に合わせようとするので、手で足したルールが、次の適用で黙って消えることがあります。 逆に、手で変えた設定が正しかった場合でも、それがコードに無いので、同じ環境を別の場所に作ったときには再現されません。

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 で組織のガードレールを引く

参照ソース

SCOREこの記事の確認テスト

0/3問 正解

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

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

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

HAND IT OVER人に渡すなら

一言で説明するなら

IaC は、家を建てる前に図面を書き、職人に図面どおり建ててもらうやり方です。同じ図面なら何軒でも同じ家が建ち、どこを変えたかも図面の差分で分かります。

FAQよくある質問

CloudFormation と Terraform はどちらを学べばよいですか?

AWS だけを使う職場で、AWS の認定も目指すなら、まず CloudFormation の考え方(テンプレート・スタック・変更セット・ドリフト)を押さえると、CDK にもそのままつながります。複数のクラウドや SaaS をまとめて扱う職場では Terraform が使われていることが多いので、職場で使っている道具に合わせるのが近道です。宣言型・差分を見てから適用・ドリフトという考え方は共通です。

AWS CLI のスクリプトで作るのも IaC ですか?

手作業をコードに置き換えて繰り返せる点では IaC の一歩目ですが、多くは「手順を順に実行する」手続き型です。すでにあるものを二度作ろうとして失敗したり、途中で止まったときの状態が分からなくなったりしやすいので、環境を丸ごと管理するなら、あるべき姿を書いて差分を埋める宣言型の道具を使います。

IaC を学んだら、次に何を学べばよいですか?

同じテンプレートを複数のアカウントやリージョンに配る場面で IaC の効き目が大きくなります。アカウントを境界として分けるマルチアカウントの設計を読むと、StackSets のような配り方がなぜ要るかが分かります。そのあと、コードの変更を自動で検査・適用する CI/CD に進みます。

SAME TRACK同じ領域の記事

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