👾

詳解 Terraform を読んでみた

2024/06/18に公開

はじめに

ここ最近ずっと Terraform を書いているけれど雰囲気で書いている感が否めないのでちゃんと Terraform が使えるようになるために 詳解 Terraform を読んでみました。
とりあえず毎朝の読書で少しずつ読んでいきました。

https://www.oreilly.co.jp/books/9784814400522/

1章は前に読んだので2章からコツコツ読書していきます。

目次

  • 1章 なぜTerraformを使うのか
    • 1.1 DevOpsとは何か
    • 1.2 Infrastructure as Codeとは何か
    • 1.3 Infrastructure as Codeの利点とは
    • 1.4 Terraformはどう動くのか
    • 1.5 Terraformと他のIaCツールとはどう違うのか
    • 1.6 まとめ
  • 2章 Terraformをはじめよう
    • 2.1 AWSアカウントのセットアップ
    • 2.2 Terraformのインストール
    • 2.3 サーバ1台のデプロイ
    • 2.4 Webサーバ 1台のデプロイ
    • 2.5 設定変更可能なWebサーバのデプロイ
    • 2.6 Webサーバのクラスタのデプロイ
    • 2.7 ロードバランサのデプロイ
    • 2.8 後片付け
    • 2.9 まとめ
  • 3章 Terraformステートを管理する
    • 3.1 Terraformステートとは
    • 3.2 ステートファイルの共有ストレージ
    • 3.3 Terraformバックエンドの制限
    • 3.4 ステートファイルの分離
    • 3.5 terraform_remote_stateデータソース
    • 3.6 まとめ
  • 4章 モジュールで再利用可能なインフラを作る
    • 4.1 モジュールの基本
    • 4.2 モジュールの入力
    • 4.3 モジュールのローカルな値
    • 4.4 モジュールの出力
    • 4.5 モジュールの注意点
    • 4.6 モジュールのバージョン管理
    • 4.7 まとめ
  • 5章 Terraformを使うためのヒントとコツ:ループ、条件分岐、デプロイ、その他つまずきポイント
    • 5.1 ループ
    • 5.2 条件分岐
    • 5.3 ゼロダウンタイムデプロイ
    • 5.4 Terraformのつまずきポイント
    • 5.5 まとめ
  • 6章 シークレットを管理する
    • 6.1 シークレット管理の基本
    • 6.2 シークレット管理ツール
    • 6.3 シークレット管理ツールとTerraform
    • 6.4 まとめ
  • 7章 複数のプロバイダを使う
    • 7.1 1つのプロバイダを使う
    • 7.2 同じプロバイダのコピーを複数使う
    • 7.3 異なる複数のプロバイダを使う
    • 7.4 まとめ
  • 8章 本番レベルのTerraformコード
    • 8.1 本番レベルのインフラを構築するのに時間がかかる理由
    • 8.2 本番レベルのインフラのチェックリスト
    • 8.3 本番レベルのインフラモジュール
    • 8.4 まとめ
  • 9章 Terraformのコードをテストする
    • 9.1 手動テスト
    • 9.2 自動テスト
    • 9.3 まとめ
  • 10章 チームでTerraformを使う
    • 10.1 チームでInfrastructure as Codeを採用する
    • 10.2 アプリケーションコードのデプロイワークフロー
    • 10.3 インフラコードのデプロイワークフロー
    • 10.4 すべてを組み合わせよう
    • 10.5 まとめ

各章で気になったことまとめ

1 章

DevOps, IaC, Terraform の紹介といった内容でした。

2 章

Terraofrm のはじめ方が丁寧に書かれています。
基本的な使い方が解説されているので多分見返します。

  • サンプルコードの紹介

  • 暗黙的依存 (implicit dependency) が以下のコマンドでわかる

    $ terraform graph
    
  • データソース

    • Terraform の各プロバイダはさまざまなデータソースを提供していて、現在オンユーザの情報などを参照できる。
    • ここは iam ポリシーの定義とかに使っていたのでちょっと認識が違っていた

3 章

普段 HCP Terraform を使っているのであまりステートの保存について意識していませんでしたが、
この章を読んで S3 と DynamoDB を使ったリモートバックエンドの構成を知れました。

またワークスペースによる分離も知りませんでした。ただ間違いを引き起こしやすいようなのでファイルレイアウトによる分離を意識しようと思いました。

それ以外に terraform_remote_state データソースも便利だなと思いました。

4 章

モジュールの作り方が書かれています。
モジュールのバージョン管理のところで、モジュールのコードを別々の Git リポジトリに入れ、source パラメータをそのリポジトリの URL に設定するやり方がわかりました。
普段1つのリポジトリでインフラを管理していたので新しい発見でした。

5 章

この章ではコツや、つまずきポイントが書かれていました。
普段ループ、条件分岐などあまり意識して書いていなかったので countfor_each、 forif についてしっかり理解できました。

その他、 Terraform のつまずきポイントとして以下の4つが書かれていました。

  • count と for_each の制限事項
  • ゼロダウンタイムデプロイの制限事項
  • 有効なプランも失敗することがある
  • リファクタリングは難しい

6 章

シークレットの管理方法が書かれています。
シークレット管理ツールの比較もあり知らないツールもいくつかありました。
やってはいけないことが書いてあるのでちゃんと理解する必要があります。
現在 GitHub Actions で OIDC を使っているのですが、その説明もありました。
Terraform はステートファイルやプランファイルにプレーンテキストでシークレットを保存するのでこれらのファイルの取り扱いが非常に重要だということがわかりました。

7 章

複数のプロバイダを扱う章です。
私のチームでも複数の AWS リージョンを使っているので参考になりました。
複数の AWS リージョンにデプロイしたい時は複数の provider ブロックを使い、それぞれを別々の region と alias パラメータで設定するとよいそうです。

8 章

本番レベルの Terraform コードを作る章です。
本番レベルのインフラチェックリストが掲載されているのですがかなり網羅されていると思いました。

以下の5つの内容が書かれていました。

  • 小さなモジュール
  • 組み合わせ可能なモジュール
  • テスト可能なモジュール
  • バージョン管理されたモジュール
  • Terraform モジュールの先へ

特に example フォルダを作成してモジュールに対してサンプルコードを書くやり方が参考になりました。

9 章

Terraform のコードをテストする章です。
そもそも Terraform のコード自体をテストする発想がなかったので目から鱗でした。
Go を使ったテストの例があったので試してみたいと思います。

10 章

チームで Terraform を使う章です。
学ぶ時間をチームに与えるのはとても重要だと思いました。
これは現在実際にスキルギャップを埋めるために実施しています。
それと テストのないインフラコードは壊れている という一文もあり耳が痛いです・・・。
そのほかにもチームで利用する場合の注意点などが沢山かかれているので大変参考になります。

最後に

詳解 Terraform を読んでみて今まで Terraform の一部の機能だけを使っていたんだなと改めて感じました。またフォルダの構成やモジュール分割の方法など今後業務に活かせる知識も得られました。
なかなかボリュームのある本なので1回精読しただけでは理解しきれていないと思うので、手元に置いて開発時に辞書のように利用していきたいと思います。

読書ログ

毎朝ちょっとずつ読んで 17日かけて読み終わりました。

範囲 日付
p37 - p43 5/23
p43 - p62 5/24
p62 - p78 5/25
p79 - p93 5/27
p93 - p137 5/28
p139 - p154 5/29
p154 - p189 5/30
p191 - p220 5/31
p221 - p237 6/1
p238 - p275 6/2
p277 - p316 6/3
p317 - p377 6/4
風邪ひいた
p379 - p420 6/8 読了!
レスキューナウテックブログ

Discussion