🙄

新刊「Terraformの教科書」の要点をまとめてみた

2024/05/01に公開

本記事では、2024/3/21に発売された 「Terraformの教科書」 を解説します💡

概要

Terraformの技術書はそこまで多くないので、貴重な1冊です。直近ではオライリーで出版されたくらいなので、現状は本書と双璧といった感じでしょうか。全体的な内容としては、Terraformの仕組みから実際の利用の仕方までが記載されてます。応用的な話はあまりないので、基礎をしっかり固めてくれているというイメージです。仕組みのところはこういう機会でないとなかなか目を向けられないので、とてもありがたいです。もともとはアソシエイト試験を意識して書かれたものらしく、各章の最後には予想問題もあったりしました。

(若干の)注意点

若干の注意点として、クラウドは3大クラウドのAWS、Google Cloud、Azureすべてが意識され網羅的に書かれています。とはいえ、ほとんどのサンプルで3つすべてのコードが用意されてるので、基本は問題ありません。ただし、一部のサンプルコードでは1つのクラウドに限定して書かれてたりするので注意です。(もちろん問題なく他クラウドに読み替えることが可能なレベルです)また、本書は海外の方が著者のため、翻訳がされています。こちらも読む上で問題はありませんが、翻訳が若干怪しいところがあったりしました。

※本書で使われているサンプルコードは以下から取得できます
https://github.com/PacktPublishing/HashiCorp-Infrastructure-Automation-Certification-Guide

要点

要点を書いていきますが、以下のことにご留意ください。

  • Terraform経験者が学びになるような要点を抜き出したため、網羅的には要点を抜き出していません。
  • クラウドで分岐するような情報はAWSの情報をメインとして抜き出しています。

1章 IaCを知る

IaCとは、IaCの長所、Terraform入門、他IaCとの比較、Terraformのアーキテクチャなどが記載されています。実際にコーディングに入る前に必要な予備知識群です。

1.5 他IaCツールとの比較

TerraformとCloudFormation、Azure、GoogleCloudでクロスプラットフォーム、言語、モジュール性、バリデーション、可読性、ワークフロー、エラーメッセージ、ステート管理など多くの観点から比較されている。

1.6 Terraform アーキテクチャ

  • terraform initの動作

    1. 作業ディレクトリにある構成ファイルを読み込んでそのプラグインが必要かを判断
    2. インストールされているプラグインを検索
    3. 必要であれば追加のプラグインをダウンロード、どのプラグインバージョンを使用するか決定
    4. ロックファイルを作成
  • 「-upgrade」 オプションをつけると、新しいプロバイダがあればダウンロードしてくれる。

2章 Terraformのインストール

インストールの方法がかかれています。一般的な内容なので本記事では記載しません。

3章 Terraformをはじめよう

プロバイダ、リソース、変数、出力、データなど少しずつ実際のコーディングに絡んでくる話がでてきます。

3.2 Terraform プロバイダの紹介

プロバイダとは 「特定のクラウドサービスのHTTP APIをすべて読み出すコンポーネント」 であり、terraform initコマンドを実行したときにダウンロードされる実行可能なプラグインのこと。Terraformプロバイダブロックはバージョンを定義し、認証やプロジェクトの詳細などの初期化引数をプロバイダに渡す。Terraformプロバイダは、特定のクラウドサービス、つまりAzureRM、Google Cloud、AWSのHTTP APIをすべて読み出すコンポーネントである。

3.3 Terraformのリソースを理解する

resourceの呼称

resource “タイプ” “ローカル名” {
    XXX = XXX
}

3.4 Terraformの出力を理解する

depends_on:ユーザー側で依存関係を操作できる

3.5 Terraformのデータを理解する

データリソース:Terraform外で作成されたリソースを参照できる

data “タイプ” “ローカル名” {
    XXX = XXX
}

4章 Terraformへのディープダイブ

バックエンド、プロビジョナ、ループ、関数、デバッグなどさらにコーディングに踏み込んだ内容が記載されています。

4.2 バックエンドの紹介

4.2.1 tfstate

  • Terraformは構成ファイルの内容とステートファイルを組み合わせ、ステートファイルの要素の現在の状態を更新してプラン内容を生成する
  • applyフェーズが実行されると、2回目のリフレッシュが行われる
  • 手動リソースのstateへの取り込みはterraform import、逆にstateからのみ削除する場合はterraform state rmを使う。
  • State Refresh(plan/apply)の高速化ではリソースを最新情報を取得しない -target(対象を指定)やrefresh=falseを使うことができる。ただし、リソースの最新情報を取得しないのでTerraform外の変更検知はできなくなる。

※State Refreshの参考記事
https://mizzy.org/blog/2022/03/24/1/

4.2.3 Terraformバックエンドの種類

.terraformには構成ファイルで定義したプラグイン情報が格納されている

4.3 Terraformプロビジョナを理解する

ローカルまたはリモートソース上で実行したいスクリプトや、操作を実行したいときに本機能を使って実現できる。

4.4 Terraformのループを理解する

使えるループはcount、for_each、forの3つ。

  • count:リソースのループ
  • for_each:リソースとリソース内のインラインブロックに対するループ
  • for:定義されたリストとマップをループする

4.5 Terraformの関数を理解する

  • 関数には以下のカテゴリが存在する

    • 数値
    • 文字列
    • コレクション
    • エンコーディング
    • ファイルシステム
    • 日付と時刻
    • ハッシュと暗号
    • IPネットワーク
    • 型の変換
  • すべての関数は下記から確認できる

https://developer.hashicorp.com/terraform/language/functions

  • テストではTerraformコンソールを使えばよい。コマンド、terraform consoleで起動できる。

4.6 Terraformのデバッグを理解する

  • ログレベルの指定
    TRACE、DEBUG、INFO、WARN、ERRORの各レベルで設定できる。
export TF_LOG=TRACE
  • ログ出力先の指定
export TF_LOG_PATH=./terraform.log

5章 Terraform CLI

その名の通りCLIについて解説されています。CLIの導入から一部コマンドの紹介までありました。基本的なコマンドは別の章で紹介されてるので、この章では応用的なコマンドが紹介されてます。

5.2 Terraform CLIの紹介

  • terraform:コマンド一覧の確認
  • -hオプション:サポートされてるコマンドやサブコマンドの確認
  • terraform -install-autocomplete:Tab補完ができるようになる

5.6 Terraform CLIのコマンドを理解する

  • terraform console:4章でも紹介したがTerraformコンソールを開くことができる。関数のテスト、アウトプットの取得などが可能。
  • terraform fmt:規約に則って構成ファイルの体裁を修正してくれる
  • terraform graph:Terraformの設定や実行プランを視覚的に表現できる。DOT形式で出力できる。依存関係も確認できる。
  • terraform refresh:実態に沿ってstateファイルを更新する
  • terraform show:stateファイルの確認
  • terraform taint:特定のリソースを破棄して再作成する。※先にtaintしてからapplyを流すと再作成される。
  • terraform workspace:workspace使用時に利用
  • terraform force-unlock:stateファイルのロック解除
  • terraform import:既存リソースをTerraformに取り込む

6章 Terraformのワークフロー

ワークフローとは、init、plan、apply、destroyという基本的な一連の流れのことです。terraformを使うにあたってメインの動作になるので、しっかりおさえておきましょう。各コマンドの詳細な動作はもちろん、コマンドでは細かいオプションも網羅的に記載されているので、実用的な章です。

Terraform のライフサイクルを理解する

6.2.1 Terraform init

terraform initを実行する場面

  • 新しいモジュール、プロバイダ、プロビジョナを追加したとき
  • モジュール、プロバイダ、プロビジョナの必要なバージョンを更新したいとき
  • 設定されているバックエンドを変更または移行したいとき

7章 Terraformのモジュール

みんな大好きモジュールの章です。実際の使い方や動作の仕組み、レジストリとの連動方法などが記載されています。また各プロバイドごとの記述も親切に記載されています。

7.2 Terraformモジュールを理解する

子モジュールは 1レベル(階層) までを推奨する

7.2.1 source

  • Terraformレジストリは下記のような構文で参照できる
module "Terraform-consul" {
    source  = "hashicorp/consul/aws"
    version = "0.8.0" 
}
  • GitHub、HTTP URL、S3バケットなど、さまざまなプライベートレジストリから取得できる。

7.6 Terraformモジュールの公開

作成したものは下記にて登録可能
https://registry.terraform.io/

8章 Terraformによるインフラストラクチャの管理

構成ファイルを書くためのベストプクティスが記載されています。例によって各クラウドのベストプラクティスがかかれてたりします。ベストプラクティスなので自分が使ってるクラウドのところは確認しておきましょう。

8.2 Terraformの構成ファイルを理解する

8.2.1 Terraformネイティブの構成構文

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
    # ブロックのボディ
    <IDENTIFIER(識別子)> = <EXPRESSION(表現)> # 引数
}

8.2.2 Terraformのオーバーライドファイル

ファイル名の拡張子の前に 「override」 を付与すると、
実行の最後に読み込まれ、上書き処理する。

8.2.3 JSONの設定構文

コメントアウトは "//" で可能

8.2.5 Terraformの言語スタイル規約

https://developer.hashicorp.com/terraform/language/style

8.4 AWSの構成ファイルを書いてみよう。

AWS用のTerraformを書く際に従う学べき重要なプラクティス

  • ステートファイルはS3に配置する
  • 構成ファイルはリソースコードブロックよりもモジュールを使う(コードを短くできる)
  • 認証情報はシステム環境情報を使うかCICDパイプライン内、SecretManagerなどを利用する。
  • 組み込み関数をできるだけ使う
  • 変数を何度も使用する場合はローカル変数を利用する
  • validateとfmtは常に実行する

9章 Terraformスタックを理解する

スタックとはTerraformの構成を各プロバイダのリソースとして登録したものです。Terraformだとあまり聞かないかもしれませんが、CloudFormationだとよく使われる単語ですね。この章ではスタックを同構成していくかというのが考えられています。ほぼ同義と捉えてよさそうなディレクトリ構成と考えるとわかりやすいかと思います。スタックも日本の記事ではなかなか見ないタイプだったので少しおもしろいです。

9.4 AWS用スタックの書き方

.
├── aws
│   ├── modules
│   │   ├── s3
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   └── vpc-subnet
│   │       ├── main.tf
│   │       ├── outputs.tf
│   │       └── variables.tf
│   ├── stacks
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── stacks_of_stacks
│       ├── main.tf
│       ├── providers.tf
│       ├── terraform.tfvars
│       └── variables.tf

上記の構成ではstackに各moduleを記述しているが、
コードの長さを短くするためと、複数環境へのデプロイを考慮して
stacks_of_stacksというディレクトリが作られている。

10章 Terraform CloudとTerraform Enterprise

Terraform Cloudの使い方やEnterpriseの内容が記載されています。Terraform Cloudは一般的に使われていますが、Enterpriseの方はあまり知識がなかったのでピックアップしておきました。

※TerraformCloudの使い方はこちら
https://qiita.com/hiyanger/items/e60ed7600d0cda120482

10.3 Terraform Enterpriseについて理解する

主なメリット

  • 業務効率化
  • リスク低減
  • コラボレーション機能
  • クラウドコストの管理
  • ガバナンスとポリシー機能

10.4 Terraform Sentinelの概要

  • Terraform Sentinelはインフラストラクチャが実施にデプロイされる前に、
    その動作を抑制したり制御したりできる。
  • Sentinelポリシーはplanとapplyフェーズの間で強制され、
    許可されたユーザーか、ポリシー定義をすべてパスするまでapplyできない。

ハイライト

要点と記述が重複しますが、個人的な刺さりポイントをまとめておきます。

  • 1.5 他IaCツールとの比較:多くの観点から比較されている
  • 4.3 Terraformプロビジョナを理解する:ローカルまたはリモートソース上で実行したいスクリプトや、操作を実行したいときに本機能を使って実現できる。
  • 5.2 Terraform CLIの紹介:terraform -install-autocomplete:Tab補完ができるようになる
  • 6章 Terraformのワークフロー:init、plan、apply、destroyの各種オプション
  • 7.2.1 source: GitHub、HTTP URL、S3バケットなど、さまざまなプライベートレジストリから取得できる。
  • 8.2.2 Terraformのオーバーライドファイル:ファイル名の拡張子の前に 「override」 を付与すると、実行の最後に読み込まれ、上書き処理する。
  • 8.2.3 JSONの設定構文:コメントアウトは "//" で可能
  • 8.4 AWSの構成ファイルを書いてみよう:AWS用のTerraformを書く際に従う学べき重要なプラクティス
  • 10.4 Terraform Sentinelの概要:
    • Terraform Sentinelはインフラストラクチャが実施にデプロイされる前に、その動作を抑制したり制御したりできる。
    • Sentinelポリシーはplanとapplyフェーズの間で強制され、許可されたユーザーか、ポリシー定義をすべてパスするまでapplyできない。

さいごに

以上です。内容はいかがでしたでしょうか。刺さるポイントはありましたでしょうか。3大クラウド全部使うよって人は、間違いなく買いの1冊だと思います。Terraformは人によって使い方がけっこう違ったりするので、もっともっとTerraformが広まって、いろんなTerraform本が出てほしいなと思いました。

もっというとtfstateやディレクトリ構成のところを深掘りしまくってくれてて、より実用的な本があったらいいな...オライリーはまだ読んでないので、期待して読んでみます🤤

※本書のご購入はこちら
https://www.amazon.co.jp/Terraformの教科書-Compass-Booksシリーズ-Ravi-Mishra/dp/4839982899?&linkCode=sl1&tag=hiyanger0d-22&linkId=b5b1ec1e5fd462945e7c4210e101fb02&language=ja_JP&ref_=as_li_ss_tl

アイレット株式会社

Discussion