詳解 Terraform 第3版完走メモ

## 対象書籍
https://www.oreilly.co.jp/books/9784814400522/

※初版第1刷は結構誤植があるらしく正誤表が出ていることに注意

## サンプルコード
https://github.com/brikis98/terraform-up-and-running-code

## ↑を参考にしながら、本記載の一部のコードを写経して動かしてみたリポジトリ
https://github.com/nshun583/terraform

https://github.com/nshun583/terraform-modules

## 読む前の(筆者の)知識的バックグラウンド
* なし
    * Terraform/Docker/Kubernetesのどれも名前は聞いたことがあったが実業務ではこれまで使ったことがなかった、レベル
    * Terraform(正確にはTerraform Cloud)導入プロジェクトに(プロジェクト管理寄りとはいえ)アサインされることになったので何も語れないとまずいと思い、まずは手始めにこの本からスタート

## 目次章別メモ
* 1章 なぜTerraformを使うのか
    * DevOpsにはじまってIaCとは？の説明
    * Terraform以外の他ツールの簡易説明もあり
* 2章 Terraformをはじめよう
    * Terraformのインストール
    * デプロイ先となるAWSアカウントの整備
    * 最小Webサービス構成リソースのデプロイまで
* 3章 Terraformステートを管理する
    * ステートファイルの考え方
    * ステートファイルをS3に保存
    * Workspaceの考え方
* 4章 モジュールで再利用可能なインフラを作る
    * モジュール構成をうまく利用してTerraformコードの結合度を下げる方法
    * いわばTerraform特化版「リーダブルコード」とでも言える章
* 5章 Terraformを使うためのヒントとコツ：ループ、条件分岐、デプロイ、その他つまずきポイント
    * 宣言型言語ならではの制約を解消するための構文機能の活用法
* 6章 シークレットを管理する
    * シークレットをプレーンテキストで保存しない
    * **シークレットをプレーンテキストで保存しない** (P.192)
    * 正直この章は「取ってつけた感」があって本の全体構成としては多少脇道気味な印象
* 7章 複数のプロバイダを使う
    * AWSリージョンの使い分け
    * AWSアカウントの使い分け
    * AWSプロバイダ以外のプロバイダの利用(Docker・Kubernetes)
    * Docker・Kubernetes共に「短期集中コース」が設けられているものの、この章だけかなり内容が濃いというか行間説明が飛ばされ気味なので、以下のどれかが必要そうな雰囲気
        * じっくり読む
        * ある程度理解を諦めることが必要そう
        * Docker・Kubernetesについてそれぞれの本家Tutorialで理解補填する
* 8章 本番レベルのTerraformコード
    * Terraformによるインフラ構成管理を実際に本番環境に対して適用するための課題とそのための解決策
    * 重要なメッセージとしては
        * インフラ構成にはそれなりの期間が必要
        * モジュールを分けてTerraformコード間の相互依存性を減らし部品毎に再利用性を高める
            * マイクロサービスに近い発想(という理解)
        * validation/precondition/postconditionの仕組みを使って細かい挙動を制御
        * tfenvやTerragruntなどのツールを使ってTerraformそのもののバージョンを制御
        * プロビジョナを使ってTerraformだけでは実現できないことを実現
    * この章もかなり内容が重めだった印象
* 9章 Terraformのコードをテストする
    * 一言で言うと以下(画像は https://findy-code.io/engineer-lab/t-wada から)
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129395/40923542-1795-bba7-d282-4cbb59ff2c0e.png)
    * Terratestというライブラリを使ってGO言語でテストを書く方法
    * ただしこの本が刊行された時点ではまだTerraform 1.7はリリースされていなかった模様
        * https://github.com/hashicorp/terraform/blob/v1.7/CHANGELOG.md#170-january-17-2024
        * > `terraform test`: Providers, modules, resources, and data sources can now be mocked during executions of `terraform test`. The following new blocks have been introduced within `.tftest.hcl` files:
* 10章 チームでTerraformを使う
    * ある意味この本において最も重要な章
        * Terraform導入に関して上司(チーム)を説得する方法
        * PullRequest承認やCI/CDなども絡めたリリースフローにTerraformを統合する方法
    * Terraform を一度使い始めたら **Terraformの管理外で絶対に変更を加えない** (P.397)

## この本には書いてなかったこと

* 1章の内容以上の他IaCツールとの比較(Terraform本なので当たり前)
* 6章のメインメッセージ **シークレットをプレーンテキストで保存しない** を実際に実践していくためのプラクティス的な話
    * Terraformと同じHashicorp社の製品であるVaultについても軽くしか触れられていない
    * おそらくこのトピックだけで別の本が書けるレベル？(推測)
* Docker・Kubernetesの詳しい説明
    * これもこの本で説明するにはスペースが足りないであろう話
* Terraform(インストール版) VS Terraform Cloudの技術選定についての議論

## ↑を受けてのFurther Reading(候補&予定)

* Terraform関連

https://developer.hashicorp.com/terraform/tutorials

* Vault関連

https://developer.hashicorp.com/vault/tutorials

https://www.amazon.co.jp/Best-Kept-Secrets-HashiCorp-Vault-ebook/dp/B0C44SD7HL

https://www.amazon.co.jp/Running-HashiCorp-Vault-Production-McTeer/dp/B08LNQML27

https://techbookfest.org/product/h2LzeQsbafQtZ74bhGqvNZ

* Docker関連

https://www.docker.com/ja-jp/101-tutorial/

* Kubernetes関連

https://kubernetes.io/ja/docs/tutorials/