+ 作るログイン
1 / 19
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 18:IaC ― 構成をコードにする

発行
アニメモ公式
版
第2版
改訂
コマ
全19

画面のクリックで作った構成は、同じものをもう1つ作れず、誰がいつ何を変えたかも残りません。構成をコードに書く IaC の考え方(宣言型)、CloudFormation のテンプレート・スタック・変更セット・ドリフト、CDK と Terraform の違いと選び方、スタックの分け方、同じコードで環境を増やす方法を、フォトログを例に説明します。

「本番と同じ環境を、もう1つ作って」

第16章でフォトログの3層構成を組み上げ、第17章で監視も付けました。ここまでの VPC・サブネット・セキュリティグループ・ALB・Auto Scaling・RDS・アラームは、すべてコンソールの画面でクリックして作ってきました。

ある日、こう頼まれたとします。「新しい機能を本番に出す前に試したいので、本番とまったく同じ試験用の環境を作ってほしい」。

図の右は、手順書を見ながら手で作った試験用の環境です。よく見ると、本番と違うところがあります。

違いその結果
EC2 が1台しかない2台のときだけ起きる不具合(セッションの扱いなど、第12章)が試験で見つからない
セキュリティグループ(第8章)の設定が違う試験では通ったのに、本番では通信が通らない。あるいはその逆

これまでの章で作った構成は、クリックの数でいえば数百回になります。1つ押し忘れたり、1つ選び間違えたりしても、その場ではまず気づきません。人の手で同じものを2度作るのは、思っているよりずっと難しいのです。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 1 / 19
  • 「本番と同じ環境を、もう1つ作って」
  • 本番(第16・17章で手で作った)
  • 試験用(手順書を見て作った)
  • サーバー
  • サーバー
  • ネットワーク
  • EC2 1
  • データベース
  • ネットワーク
  • EC2 1
  • ALB
  • サーバー
  • RDS
  • 手で再現
  • データベース
  • ALB
  • RDS
  • EC2 2
  • SG: 443
  • SG: 80
  • クリックは数百回。1つ押し忘れ・1つ選び間違えても、その場では気づかない
  • 台数が違う・扉(SG)の設定が違う ―― 試験で通ったのに本番で壊れる、の原因になる
  • ひらめき
  • 第5〜17章の構成は、画面のクリックで作った。同じものをもう1つ、間違いなく作れるだろうか。

しかも「今どうなっているか」を誰も説明できない

手作業の問題は、「もう1つ作れない」だけではありません。今ある本番が、どういう状態なのかを誰も説明できなくなることです。

図の本番では、セキュリティグループが「全開放」になっています。

問い手作業の世界での答え
誰が変えた?わからない(CloudTrail(第27章)で操作の記録は探せるが、なぜは残らない)
なぜ変えた?わからない。一時的な調査のためだったのかもしれない
元はどうだった?手順書は半年前のもの。その後の変更は書かれていない
戻してよい?何かがそれに頼っているかもしれず、怖くて触れない

手順書は、書いた日から古くなり始めます。結局「画面に今出ている状態だけが正解」になり、その正解の理由は誰も知らない、という状態に陥ります。

この2つの困りごと、再現できないと差分(何がどう違うか)がわからないを解決するのが、この章のテーマ IaC です。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 2 / 19
  • しかも「今どうなっているか」を誰も説明できない
  • 本番(今の状態)
  • 人
  • 「先月、誰かが扉を全開にした」
  • サーバー
  • 誰が・なぜ・いつ? 画面には理由が残らない
  • ネットワーク
  • EC2 1
  • データベース
  • 書類
  • 手順書(半年前)
  • ALB
  • サーバー
  • RDS
  • その後の変更が書かれていない
  • EC2 2
  • SG: 全開放
  • 更新
  • 元に戻したい
  • でも「元」がどれか、どこにも無い
  • ひらめき
  • 誰がいつ何を変えたかが残らない。手順書は書いた日から古くなり、画面の今の状態だけが正解になる。

IaC:構成を「設計図のコード」に書き、AWS に組み立てさせる

IaC(Infrastructure as Code、構成をコードとして扱うこと)は、作りたい構成をファイルに書き、道具に渡して、その通りに作らせるやり方です。

家を建てるときの設計図にたとえるとわかりやすいでしょう。大工さんに口で1つずつ指示する(手作業)のではなく、設計図を渡します。設計図があれば、同じ家を別の土地にもう1軒建てられますし、「窓を1つ増やす」という変更も設計図の差分として残ります。

手作業(クリック)IaC(コード)
もう1つ作る数百回のクリックをやり直す同じファイルをもう一度渡す
何が違うか画面を見比べるしかないファイルの差分で一目でわかる
誰が・いつ・なぜ残らないGit(ファイルの変更履歴を残す道具)に残る。変更の理由もコメントで書ける
変更の確認変えたら即、本番に反映変更を他の人に見てもらって(レビュー)から当てられる
消す1つずつ探して消すまとめて消せる

図では、左の設計図(コード)を道具に渡すと、右に AWS 上の構成ができあがっています。

IaC の最大の価値は「速く作れる」ことよりも、構成が「読めるもの」「比べられるもの」「戻せるもの」になることです。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 3 / 19
  • IaC:構成を「設計図のコード」に書き、AWS に組み立てさせる
  • # photolog.yaml(設計図)
  • AWS 上の構成
  • VPC: 10.0.0.0/16
  • サーバー
  • ALB: HTTPS で受ける
  • EC2 1
  • EC2: 2台
  • データベース
  • RDS: Multi-AZ
  • 作って
  • ネットワーク
  • ALB
  • サーバー
  • RDS
  • SG: 443 だけ開ける
  • EC2 2
  • SG: 443
  • コードはファイルなので、Git(変更の履歴を残す道具)で管理できる。誰が・いつ・何を・なぜ変えたかが残る
  • 同じファイルを渡せば、何度でも、何か所にでも、同じ構成ができる
  • ひらめき
  • Infrastructure as Code。あるべき構成をファイルに書き、道具に渡すと、その通りに作ってくれる。

「手順」ではなく「あるべき姿」を書く(宣言型)

IaC のコードには、多くの場合「こうなっていてほしい」というあるべき姿を書きます。これを宣言型と呼びます。

図の順番で、道具が何をするかを見てみます。

番号中身
1コードに「EC2:2台」と書いてある(あるべき姿)
2今の AWS には EC2 が1台だけある(実際の姿)
3道具が2つを比べ、差(1台足りない)を見つけて埋める

結果として、道具は「1台だけ足す」を行います。既にある1台には触りません。もし今3台あれば、1台を消します。差を埋める手順は、道具が考えてくれるのです。

これに対して、「EC2 を1台作る」「もう1台作る」と手順を並べるやり方(手順型)では、2回実行すると台数が増えてしまいます。宣言型なら、何回実行しても結果は「2台」のままです。このように何度実行しても同じ結果になる性質は、自動化にとってとても大事です(次の第19章で、コードを自動で何度も当てるようになります)。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 4 / 19
  • 「手順」ではなく「あるべき姿」を書く(宣言型)
  • 書いたもの(あるべき姿)
  • EC2:2台
  • 比べる
  • 設定
  • IaC の道具
  • OK
  • 1台だけ足す
  • 差を見つけて埋める
  • 既にある1台は触らない
  • 今の AWS(実際の姿)
  • EC2:1台
  • 手順型(「1台作る」を並べる)だと、2回実行すると台数が増える。
  • 宣言型は何回実行しても2台のまま
  • ひらめき
  • 「EC2 を2台」と書けば、今1台なら1台足し、3台なら1台消す。差を埋める手順は道具が考える。

CloudFormation:テンプレートから「スタック」を作る

AWS 純正の IaC の道具が AWS CloudFormation(クラウドフォーメーション)です。

用語意味
テンプレート作りたい部品を書いたファイル。YAML か JSON で書く
スタックテンプレートから作られた部品のまとまり。1つの単位として作り・変え・消す
リソーステンプレートの中の1つ1つの部品(EC2・SG・RDS など)

図の左は、フォトログのセキュリティグループを書いたテンプレートの一部です。

行意味
Resources:ここから部品を並べる
WebSG:この部品の、テンプレートの中での名前
Type: AWS::EC2::SecurityGroup部品の種類(EC2 のセキュリティグループ)
Properties:部品の設定。ここでは 443 番(HTTPS)を開ける
!Ref AlbSG別の部品(ALB のセキュリティグループ)を指す。「ALB の SG からだけ許す」(第8章)

YAML(ヤムル)は、字下げ(行頭の空白)で入れ子を表す設定ファイルの書き方です。字下げがずれると意味が変わるので、注意して書きます。

テンプレートを CloudFormation に渡すと、中の部品がすべて作られ、「photolog-app」という名前のスタックになります。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 5 / 19
  • CloudFormation:テンプレートから「スタック」を作る
  • Resources:
  • スタック photolog-app
  • WebSG:
  • Type: AWS::EC2::SecurityGroup
  • サーバー
  • Properties:
  • EC2 1
  • SecurityGroupIngress:
  • ネットワーク
  • データベース
  • - IpProtocol: tcp
  • FromPort: 443
  • ALB
  • サーバー
  • RDS
  • ToPort: 443
  • EC2 2
  • SourceSecurityGroupId: !Ref AlbSG
  • SG: 443
  • Type=部品の種類 Properties=設定 !Ref=他の部品を指す
  • ひらめき
  • AWS 純正の IaC。YAML で書いたテンプレートから、部品のまとまり(スタック)を作る。

スタック:まとめて作り、まとめて消す

スタックという単位があることで、手作業では大変だったことが楽になります。

1. 順番を道具が決める。 部品には作る順番があります。VPC が無いとサブネットは作れず、SG が無いと EC2 に付けられません。CloudFormation は、テンプレートの中の参照(!Ref など)から依存関係を読み取り、正しい順番で作ります。依存していないものは同時に作ります。図の番号札が、その順番です。

2. 失敗したら元に戻す。 10個の部品のうち7個目で失敗したら、どうなるでしょう。手作業なら「作りかけの6個」が残ります。CloudFormation は既定で、作りかけを消して実行前の状態に戻します。これをロールバックと呼びます。変更の途中で失敗したときも、変更前の状態に戻します。

3. まとめて消せる。 スタックを消すと、中の部品が作ったときと逆の順番でまとめて消えます。練習で作った環境の片付けが、1回の操作で済みます。

手作業スタック
順番を人が覚えておく道具が参照から決める
途中で失敗すると作りかけが残る自動で元に戻す
消し忘れが出るまとめて消える
  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 6 / 19
  • スタック:まとめて作り、まとめて消す
  • ネットワーク
  • VPC・サブネット
  • 盾
  • SG
  • ネットワーク
  • ALB
  • サーバー
  • EC2
  • 作る順番は、部品どうしの「参照」から道具が決める(VPC が無いと SG は作れない)
  • NG
  • 途中で失敗したら
  • バツ
  • スタックを消すと
  • 作りかけを消して、元の状態に戻す
  • 中の部品がまとめて消える(逆の順番で)
  • ひらめき
  • 順番は道具が決め、途中で失敗したら元に戻す(ロールバック)。消すときもまとめて消せる。

変える前に、何が起きるかを確かめる(変更セット)

テンプレートを直して、既にあるスタックに当てるとき、いきなり当ててはいけません。先に 変更セット(Change Set)を作ります。変更セットは、「このテンプレートを当てると、何を足し、何を変え、何を消すか」の一覧です。確かめてから実行します。

図の変更セットを読んでみます。

表示意味危なさ
Add新しく作る低い
Modify(置き換えなし)今ある部品の設定を変える中くらい
Modify(置き換え: True)今ある部品を消して、新しく作り直す高い
Remove消す高い

いちばん気をつけたいのが「置き換え」です。部品の設定の中には、後から変えられず、変えると作り直しになるものがあります。RDS で置き換えが起きると、新しい空の DB が作られ、古い DB はデータごと消えます。

こうした事故を防ぐために、CloudFormation には次の備えがあります。

備え効果
変更セット当てる前に「置き換え」を見つけられる
削除ポリシー(DeletionPolicy)スタックから外れても、部品を残す(Retain)・スナップショットを取ってから消す(Snapshot)
更新時の置き換えポリシー置き換えのときに、古い部品を残す
削除保護(スタック・RDS それぞれ)うっかり消す操作を拒否する
  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 7 / 19
  • 変える前に、何が起きるかを確かめる(変更セット)
  • 変更セット:photolog-app
  • Add WebServer3 AWS::EC2::Instance
  • 注意
  • Modify WebSG (置き換えなし)
  • Modify Database 置き換え: True
  • RDS の「置き換え」
  • 新しい DB が作られ、古い DB は消える。データごと。
  • Add
  • 新しく作る
  • DB の名前など、変えると作り直しになる設定がある。
  • Modify
  • 設定を変える
  • 当てる前に変更セットで必ず確かめる。
  • 消えてはいけない部品には「削除ポリシー」で
  • 置き換え
  • 消して作り直す
  • 残す(Retain)・スナップショットを取る(Snapshot)を付ける
  • Remove
  • 消す
  • ひらめき
  • 変更セットは「このコードを当てると、何を足し・変え・消すか」の一覧。特に「置き換え」を見逃さない。

コードと実物がずれる:ドリフト

IaC を始めても、誰かが画面から直接部品を変えてしまうことがあります。すると、コード(あるべき姿)と実物がずれます。このずれをドリフト(漂流)と呼びます。

図では、コードには「443 だけ開ける」と書いてあるのに、実物の SG は誰かが画面で「全開放」に変えています。

CloudFormation にはドリフト検出の機能があり、スタックの部品がテンプレートとどう違っているかを一覧にできます。見つけたら、次のどれかで片付けます。

対処どんなときに
コードに戻す画面での変更が間違い・一時的なもの。もう一度デプロイ(コードを当てること)して上書きする
コードに取り込む画面での変更が正しい。コードのほうを直し、差分としてレビューに残す

そして根本の対策は、チームの決まりです。「本番は画面で変えない。変えるときはコードを直して当てる」。IaC は、この決まりが守られてはじめて効果を出します。緊急で画面から変えた場合も、後で必ずコードに反映します。

なお、ドリフト検出はすべての設定を見るわけではなく、テンプレートに書いた項目が中心です。細かい対応範囲は公式ドキュメントで確認してください。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 8 / 19
  • コードと実物がずれる:ドリフト
  • WebSG:
  • 実物(誰かが画面で変えた)
  • 開けるポート: 443
  • サーバー
  • コード(あるべき姿)
  • ネットワーク
  • EC2 1
  • データベース
  • ずれを検出
  • コードに戻す
  • もう一度デプロイして上書き
  • ALB
  • サーバー
  • RDS
  • コードに取り込む
  • 変更が正しいなら、コードを直す
  • EC2 2
  • SG: 全開放
  • 決まりにする
  • 本番は画面で変えない
  • ひらめき
  • 画面で直接変えると、コードと実物がずれる(ドリフト)。ずれは検出して一覧にできる。

CDK:ふだんのプログラミング言語で書く

CloudFormation のテンプレートは、部品が増えると何千行にもなります。VPC 1つでも、サブネット・ルートテーブル・インターネットゲートウェイ・NAT(第5〜7章)を全部書くと、かなりの量です。

そこで AWS CDK(Cloud Development Kit)の出番です。CDK では、TypeScript・Python・Java・C#・Go などのプログラミング言語で構成を書きます。

図の流れのとおり、CDK は自分で部品を作るわけではありません。

段階コマンド何が起きるか
書く―TypeScript などで構成を書く
変換するcdk synthCloudFormation のテンプレートを生成する
差分を見るcdk diff今のスタックとの差分を表示する
当てるcdk deployテンプレートを CloudFormation に渡し、スタックを作る・変える

つまり、中身は CloudFormation です。スタック・ロールバック・変更セット・ドリフト検出は、そのまま使えます。

CDK のよさは、よい既定値の入った部品(コンストラクト)が用意されていることです。「2つの AZ にまたがる VPC」と1行書けば、パブリックとプライベートのサブネット、ルートテーブル、ゲートウェイまで、第5〜7章で学んだ形に沿って作ってくれます。

初めて CDK を使うアカウントとリージョンでは、cdk bootstrap という準備が1回だけ要ります。CDK が使う S3 バケットや IAM ロールが入ったスタック(CDKToolkit)が作られます。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 9 / 19
  • CDK:ふだんのプログラミング言語で書く
  • コード
  • 書類
  • 荷物
  • CDK のコード
  • synth
  • テンプレート
  • deploy
  • スタック
  • TypeScript・Python など
  • CloudFormation の YAML
  • CloudFormation が作る
  • 短く書ける
  • VPC を1行で。サブネット・ルート・NAT はよい既定値で自動
  • ふだんの道具が使える
  • if・繰り返し・関数・入力補完・テスト
  • 中身は CloudFormation
  • スタック・変更セット・ドリフトはそのまま使える
  • ひらめき
  • CDK は TypeScript や Python で書いたコードを、CloudFormation のテンプレートに変換してから作る。

CDK で書くフォトログ(抜粋)

図は、フォトログの構成を CDK(TypeScript)で書いた例の抜粋です(起動テンプレートの細かい設定など、一部を省いています)。

行作られるもの章
new ec2.Vpc(…, { maxAzs: 2 })2つの AZ にまたがる VPC、パブリック/プライベートのサブネット、ルート、ゲートウェイ第5〜7章
new rds.DatabaseInstance(…)PostgreSQL の RDS。multiAz: true で待機系付き第13章
removalPolicy: RemovalPolicy.SNAPSHOTスタックから外れたら、スナップショットを取ってから消すこの章
new autoscaling.AutoScalingGroup(…)最小2台・最大6台の Auto Scaling グループ第12章
new elbv2.ApplicationLoadBalancer(…)インターネットに面した ALB第11章
addListener('Https', …)443 番で受け、証明書(第14章)を付け、EC2 へ送る第11・14章
db.connections.allowDefaultPortFrom(asg)EC2 の SG から RDS の SG への接続を許すルール第8章

最後の1行に注目してください。「どの SG の、どのポートを、どこから許すか」を、CDK が部品どうしの関係から作ってくれます。手で書くと間違えやすいところです。

手で数百回クリックしていた構成が、このくらいの量のコードになります。そしてこのコードは、Git で履歴を残し、他の人にレビューしてもらえます。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 10 / 19
  • CDK で書くフォトログ(抜粋)
  • const vpc = new ec2.Vpc(this, 'Vpc', { maxAzs: 2 }); // 2つの AZ にサブネットを自動で
  • const db = new rds.DatabaseInstance(this, 'Db', {
  • engine: rds.DatabaseInstanceEngine.postgres({ version: rds.PostgresEngineVersion.VER_17 }),
  • vpc, multiAz: true, removalPolicy: RemovalPolicy.SNAPSHOT, // 消すときはスナップショットを残す
  • });
  • const asg = new autoscaling.AutoScalingGroup(this, 'Web', { vpc, minCapacity: 2, maxCapacity: 6, … });
  • const alb = new elbv2.ApplicationLoadBalancer(this, 'Alb', { vpc, internetFacing: true });
  • alb.addListener('Https', { port: 443, certificates: [cert] }).addTargets('Web', { port: 80, targets: [asg] });
  • db.connections.allowDefaultPortFrom(asg); // SG から SG を許す(第8章)
  • 最後の1行で「EC2 の SG から RDS の SG への接続を許す」ルールが自動で作られる
  • ひらめき
  • 数十行で VPC・ALB・Auto Scaling・RDS が書ける。細かい設定は既定値が埋め、変えたい所だけ書く。

Terraform:AWS 以外もまとめて書ける

AWS 純正ではない IaC の道具として、広く使われているのが Terraform(テラフォーム、HashiCorp 社)です。HCL という、設定を書くための専用の言語で書きます。

図の左は、EC2 を2台作る Terraform のコードです。count = 2 が「2台」を表します。

Terraform の使い方は、図の番号の2段階です。

番号コマンド何が起きるか
1terraform planコードと今の状態を比べ、何を足し・変え・消すかを表示する(変更セットにあたる)
2terraform apply表示した差分を当てる

CloudFormation との大きな違いは、状態(state)を自分で持つことです。

CloudFormation・CDKTerraform
「何を作ったか」の記録AWS の中(スタック)にある状態ファイル(state)に書かれる
記録の置き場所気にしなくてよい自分で決める。チームなら S3 に置くのが定番
2人が同時に当てるCloudFormation が順番を守るロックで防ぐ(S3 のロックファイルを使う設定がある)

state には、部品の設定がそのまま書かれ、DB のパスワードなどの秘密が入ることもあります。Git に入れず、暗号化した S3 バケットに置き、読める人を絞ります。

Terraform は、AWS だけでなく、他のクラウドや DNS・監視などの外部サービスも、同じ書き方でまとめて扱えるのが強みです。なお、Terraform から分かれたオープンソースの OpenTofu という道具もあり、ほぼ同じ書き方で使えます。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 11 / 19
  • Terraform:AWS 以外もまとめて書ける
  • resource "aws_instance" "web" {
  • terraform plan
  • count = 2
  • 検索
  • チェック
  • terraform apply
  • 差分を見る
  • 差分を当てる
  • ami = var.ami_id
  • instance_type = "t4g.small"
  • }
  • データベース
  • 状態ファイル(state)
  • 「作ったもの」の記録。S3 に置き、同時実行はロックで防ぐ
  • AWS・他のクラウド・DNS・監視サービスなども
  • 同じ書き方で扱える
  • state には秘密が入ることもある。Git に入れず、暗号化した S3 に置く
  • ひらめき
  • HCL で書き、plan で差分を見て apply で当てる。作ったものの記録(state)を自分で持つ。

3つの違いと、選び方

ここまでの3つを並べます。

CloudFormationCDKTerraform
書く言語YAML・JSONTypeScript・Python などHCL
扱える対象AWSAWSAWS+他のクラウド・SaaS
状態の記録AWS が持つAWS が持つ(中身は CloudFormation)state を自分で置く
差分を見る変更セットcdk diffterraform plan
向いている短くて単純な構成AWS 中心で、書く量を減らしたい複数のサービスをまとめて管理したい

どれを選んでも、宣言型で書き、差分を見てから当て、Git で履歴を残すという考え方は同じです。1つを身につければ、他の道具も読めるようになります。

選ぶときの問いは、次の3つです。

問い答えの例
AWS 以外のものも同じ道具で管理したいかしたい → Terraform
チームがふだん書いている言語は何かTypeScript・Python → CDK。コードを書かない運用チーム → CloudFormation や Terraform
会社で既に使っているものはあるかあれば、それに合わせるのがいちばん

フォトログは AWS だけで作っていて、アプリも TypeScript で書いているので、CDK を選ぶことにします。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 12 / 19
  • 3つの違いと、選び方
  • CloudFormation
  • CDK
  • Terraform
  • 書く言語
  • YAML・JSON
  • TypeScript・Python など
  • HCL
  • 対象
  • AWS
  • AWS
  • AWS+他のクラウド・SaaS
  • 状態の記録
  • AWS が持つ
  • AWS が持つ(CFn)
  • state を自分で置く
  • 差分を見る
  • 変更セット
  • cdk diff
  • terraform plan
  • 向いている
  • 短い・単純
  • AWS 中心で、書く量を減らしたい
  • 複数のサービスをまとめたい
  • フォトログは AWS だけで作り、アプリも TypeScript なので CDK を選ぶ
  • ひらめき
  • AWS だけなら CDK か CloudFormation、他もまとめるなら Terraform。読める言語で選ぶ。

スタックの分け方:変わる速さと寿命で分ける

フォトログの全部を1つのスタックに入れることもできます。でも、それはおすすめしません。アプリの小さな変更を当てるたびに、VPC や DB まで変更の対象になるからです。

スタックは、変わる速さと寿命で分けます。図の番号の3つに分けると、次のようになります。

番号スタック中身変える頻度消すことは
1ネットワークVPC・サブネット・NAT年に数回ほぼない
2データRDS・S3月に数回絶対に避ける(削除保護・Retain)
3アプリALB・Auto Scaling・起動テンプレート週に何度も作り直してもよい

分けたスタックの間では、値を受け渡します。たとえば①が作った VPC の ID を、②と③が使います。CloudFormation では出力(Outputs)と、他のスタックからの参照でつなぎます。CDK では、スタック間でオブジェクトを渡すだけで、この受け渡しを作ってくれます。

こうしておけば、アプリの変更(③)で DB(②)が置き換えられる、という最悪の事故が起こりにくくなります。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 13 / 19
  • スタックの分け方:変わる速さと寿命で分ける
  • ネットワーク
  • データベース
  • サーバー
  • ネットワーク
  • データ
  • アプリ
  • VPC・サブネット・NAT
  • RDS・S3(消えては困る)
  • ALB・Auto Scaling
  • 変える頻度
  • ① 年に数回 ② 月に数回 ③ 週に何度も
  • 消すことは
  • ① ほぼない ② 絶対に避ける(削除保護) ③ 作り直してもよい
  • 受け渡し
  • ① の VPC の ID を ②③ が参照する(出力と参照)
  • ひらめき
  • 一度作ったらめったに変えない土台と、毎週変わるアプリを分ける。消しても困らない単位にする。

同じコードで、環境をいくつでも作る

IaC の大きなごほうびが、同じコードから、いくつでも環境を作れることです。

図の左のように、コードは1つで、環境ごとに違うのは値だけにします。

環境用途値の例
dev(開発)開発者が自由に試すEC2 1台、小さいインスタンス、Multi-AZ なし
stg(試験・ステージング)本番に出す前の最終確認本番と同じ台数・大きさ
prod(本番)利用者が使うEC2 2〜6台、Multi-AZ あり

冒頭の「本番と同じ試験環境を作って」は、stg の値で同じコードを当てるだけになりました。しかも、本番との違いは値の表として見えるので、「試験で通ったのに本番で壊れる」の原因を減らせます。

さらに、環境ごとに AWS アカウントを分けるのがおすすめです。開発者が dev で何を壊しても、本番のアカウントには届きません。複数のアカウントをまとめて管理する方法は、第27章(Organizations)で扱います。

試験環境は、使わない夜や週末に消しておき、朝に同じコードで作り直す、という使い方もできます。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 14 / 19
  • 同じコードで、環境をいくつでも作る
  • # 同じコード+環境ごとの値
  • 試験用(stg)
  • dev: EC2 1台 小さめ
  • サーバー
  • stg: EC2 2台 本番と同じ
  • prod: EC2 2〜6台
  • ネットワーク
  • EC2 1
  • データベース
  • ALB
  • サーバー
  • RDS
  • 環境ごとに AWS アカウントを分けると、
  • EC2 2
  • 試験の事故が本番に届かない(第27章)
  • SG: 443
  • 「試験で通ったのに本番で壊れる」の多くは、環境の作りが違うせい。同じコードから作れば、違いは値だけになる
  • ひらめき
  • 違いは「台数」「大きさ」「名前」などの値だけにする。コードは1つ、値の組だけを環境ごとに持つ。

手で作ったものを、コードに取り込む

「IaC がよいのはわかった。でも、フォトログの本番はもう手で作ってしまった」。そういうときの道具もあります。

道具何をするか
IaC ジェネレーター(CloudFormation)アカウントにある部品を読み取り、テンプレートを作ってくれる
リソースのインポート(CloudFormation)既にある部品を、作り直さずにスタックの管理下に入れる
cdk migrate / terraform import など各道具にも、既にある部品を取り込む仕組みがある

進め方の例です。まず、IaC ジェネレーターで今の本番からテンプレートを起こし、中身を読んで理解します。次に、そのテンプレートでスタックを作り、部品を取り込みます。ここからは、そのスタックのコードが正解になります。

最初から全部を一度に移す必要はありません。変更の多いアプリの部分から少しずつ取り込むのが安全です。

取り込んだ後に守ることは1つです。「本番は画面で変えない。変えるときは、コードを直す → 変更セットで確かめる → デプロイする」。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 15 / 19
  • 手で作ったものを、コードに取り込む
  • 手で作った本番
  • サーバー
  • 検索
  • IaC ジェネレーター
  • 今ある部品からテンプレートを作る
  • ネットワーク
  • EC2 1
  • データベース
  • ALB
  • サーバー
  • RDS
  • 読み取る
  • EC2 2
  • ダウンロード
  • リソースの取り込み
  • 作り直さずに、スタックの管理下に入れる
  • SG: 443
  • 取り込んだ後は「本番は画面で変えない」。変えるときはコード → 変更セット → デプロイ
  • ひらめき
  • 今ある構成からテンプレートを起こし、部品を作り直さずにスタックへ取り込める。

お金:道具そのものより、作った部品に払う

IaC の道具にかかるお金は、思ったより小さいものです。

道具何に課金されるか
CloudFormationAWS の部品(AWS:: で始まる種類)を扱う分には追加料金なし。他社の部品などの拡張を使うと、操作ごとに課金
CDKオープンソースで無料。bootstrap で作る S3 バケットなどに、ごく少しの保存料
Terraformコマンドは無料で使える。チームで state や実行を管理する有料サービスもある
作られた部品EC2・RDS・NAT ゲートウェイなど。これは手で作っても同じだけかかる

つまり、IaC にしたからといって、AWS の請求が大きく増えることはありません。

むしろ IaC はお金を守る道具です。

使い方効果
試験環境を夜や週末に消し、使うときに作り直す使っていない時間の料金がかからない
コードに無い部品を探す消し忘れや、誰かが勝手に作った部品が見つかる
タグ(第4章)をコードで全部品に付けるCost Explorer で環境ごと・スタックごとの費用が見える
  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 16 / 19
  • お金:道具そのものより、作った部品に払う
  • CloudFormation
  • AWS の部品を扱う分には追加料金なし。拡張(他社の部品)は操作ごとに課金
  • CDK
  • 無料のオープンソース。準備(bootstrap)で作る S3 などに少し
  • Terraform
  • コマンドは無料で使える。チーム向けの有料サービスもある
  • 作られた部品
  • EC2・RDS・NAT など。これは手で作っても同じ
  • お金
  • IaC はむしろお金を守る
  • 試験環境を夜に消して朝に作り直せる。消し忘れの部品も、コードに無ければすぐわかる
  • ひらめき
  • CloudFormation と CDK に追加料金はない(AWS の部品の場合)。払うのは作られた EC2 や RDS の料金。

よくある落とし穴

IaC で起きやすい事故を並べます。

落とし穴何が起きるか対策
本番を画面で直すコードとずれ(ドリフト)、次のデプロイで元に戻される画面で変えない。緊急時は後でコードに反映
差分を見ずに当てるRDS の置き換えでデータが消える変更セット・cdk diff・terraform plan を必ず読む
パスワードをコードに書くGit の履歴に永久に残る。消しても過去の版から読める秘密は専用の置き場へ(第20章)
state を Git に入れる/ロックしない秘密が漏れる。2人が同時に当てて state が壊れる暗号化した S3 に置き、ロックを有効にする
何でも1つのスタックに入れる小さな変更で全部が危険にさらされる変わる速さと寿命で分ける

図のいちばん下の、緑の印の項目が基本の守りです。DB のように消えてはいけない部品には、削除保護と削除ポリシーを付け、差分を見てから当てる。

もう1つの落とし穴は、「コードの書き方」より「当て方」です。開発者が自分のパソコンから cdk deploy を実行していると、その人のパソコンにあるまだレビューされていないコードが本番に当たるかもしれません。これは次の第19章の話題です。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 17 / 19
  • よくある落とし穴
  • NG
  • 本番を画面で直す → コードとずれ、次のデプロイで元に戻される
  • NG
  • 変更セット・plan を見ずに当てる → RDS が作り直されてデータが消える
  • NG
  • パスワードをコードに書いて Git に入れる → 履歴に永久に残る(第20章)
  • NG
  • Terraform の state を Git に入れる/ロックせずに2人で当てる
  • NG
  • 何でも1つのスタックに入れる → 小さな変更でも全部が危険になる
  • OK
  • DB には削除保護と削除ポリシー。差分を見てから当てる
  • ひらめき
  • いちばん多い事故は「置き換えでデータが消える」と「秘密をコードに書く」。当てる前に差分を見る。

片付け:スタックを消せば、まとめて消える

IaC で作った練習環境は、片付けも簡単です。

道具消し方
CDKcdk destroy --all(アプリの中のスタックを全部消す)
CloudFormationaws cloudformation delete-stack --stack-name photolog-app、またはコンソールでスタックを削除
Terraformterraform destroy

ただし、次のものは残るので、確かめて必要なら手で消します。

残るもの理由
Retain にした DB・S3 バケット「残す」と書いたから。練習なら手で消す
取ったスナップショットSnapshot ポリシーで作られたもの。保存料がかかる
CDK の準備のスタック(CDKToolkit)CDK をもう使わないなら、このスタックと中のバケットも消す
手で作った部品スタックの外なので消えない

データの入った S3 バケットは、中身が空でないと消せないことがあります。最後に Cost Explorer(第4章)で、料金が止まったことを確かめます。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 18 / 19
  • 片付け:スタックを消せば、まとめて消える
  • # CDK
  • 残るもの
  • Retain にした DB・S3
  • cdk destroy --all
  • # CloudFormation
  • 残るもの
  • 取ったスナップショット
  • aws cloudformation delete-stack --stack-name photolog-app
  • # Terraform
  • 残るもの
  • CDK の準備(CDKToolkit)
  • terraform destroy
  • 確かめる
  • Cost Explorer(第4章)
  • 手で作った部品は消えない。練習では全部をスタックの中で作ると片付けが楽
  • ひらめき
  • cdk destroy か delete-stack で、作った部品を逆順にまとめて消す。残す設定の部品は手で消す。

まとめ:構成は「書いて・差分を見て・当てる」もの

この章では、手で作ってきた構成をコードにしました。

項目内容
手作業の問題再現できない・差分がわからない・誰がなぜ変えたか残らない
IaCあるべき姿をコードに書く(宣言型)。Git で履歴が残り、レビューできる
CloudFormationテンプレート → スタック。順番は自動、失敗したらロールバック、まとめて消せる
変更セット・plan当てる前の差分。「置き換え」でデータが消えないか確かめる
ドリフト画面での変更によるずれ。本番は画面で変えない
CDKふだんの言語で書き、CloudFormation に変換して当てる
TerraformHCL で書き、AWS 以外もまとめて扱う。state を自分で安全に置く
分け方・環境変わる速さと寿命でスタックを分け、値だけ変えて dev・stg・prod を作る

構成はコードになり、Git に履歴が残るようになりました。

でも、まだ手作業が残っています。コードを当てる cdk deploy を実行しているのは、誰かのパソコンです。そして、フォトログのアプリそのものの新しい版を EC2 に届ける作業も、まだ人の手で行っています。手元のパソコンから本番へ、レビューもテストもされていないものが届いてしまう怖さ。次の第19章では、これを CI/CD で自動にします。

  • AWS でサービスを作る 18 ― IaC:構成をコードにする
  • 19 / 19
  • まとめ:構成は「書いて・差分を見て・当てる」もの
  • 手作業の問題
  • 再現できない・差分がわからない・誰が変えたか残らない
  • IaC
  • あるべき姿をコードに書く(宣言型)。Git で履歴が残る
  • スタック
  • まとめて作り・まとめて消す。失敗したらロールバック
  • 変更セット・plan
  • 当てる前の差分。「置き換え」を見逃さない
  • ドリフト
  • 画面での変更によるずれ。本番は画面で変えない
  • 選び方
  • AWS だけなら CDK/CFn、他もまとめるなら Terraform
  • 分け方
  • 変わる速さと寿命で。値だけ変えて環境を増やす
  • ひらめき
  • 次の第19章:構成はコードになった。でもアプリの新しい版は、まだ手で届けている。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]