【読書メモ】【8章】詳解 Terraform 第3版 ―Infrastructure as Codeを実現する

技術書

 

↓の本の「8章 本番レベルのTerraformコード」のメモを残します。


 

前章のメモ

 

本番レベルのインフラ構築に時間がかかる理由

 

  1. DevOpsが発展途上な分野だから
  2. あるタスクに取り組む前にやるべきタスクがあるから
  3. そもそも構築するのに必要なタスクが多い

 

本番レベルのインフラのチェックリスト

 

本番レベルのインフラを構築するために考慮することはたくさんある。

  1. ソフトウェアのインストール
  2. ソフトウェアの設定
  3. インフラリソースのプロビジョニング
  4. アプリケーションのデプロイ
  5. 高可用性
  6. スケーラビリティ
  7. パフォーマンス
  8. ネットワーク
  9. セキュリティ
  10. メトリクス
  11. ログ
  12. データのバックアップ
  13. コスト最適化
  14. ドキュメント作成
  15. インフラコードの自動テスト

 

本番レベルのインフラモジュール

 

先ほどのタスクを実装する、再利用可能なモジュールのベストプラクティスを見ていく

 

小さなモジュール

 

JavaやPythonで関数をコーディングするときと同じく、Terraformのモジュールも小さくて独立しているのが理想です

 

コード量の多い、大きなモジュールだと

  1. デプロイに時間がかかる
  2. セキュアでない
  3. 影響範囲が大きく、リスクが大きい
  4. コードを理解しにくい
  5. レビューしにくい
  6. テストしにくい

デメリットしかないので、やめましょう!

 

組み合わせ可能なモジュール

 

小さく独立したモジュールを組み合わせるために何が必要でしょうか?

 

答えは、モジュールの入力変数と出力変数です。

これによりそれぞれのモジュールで作成したリソースを連携させます。

できる限り環境変数は使わず、入力/出力変数を使うようにしましょう
作成するリソースの一貫性を保ちやすくなります

 

テスト可能なモジュール

 

テストするため、モジュールをデプロイできるサンプルコードを作ってみるのがいい。

  1. 手動テストによって、モジュールが正しく動作しているか常に確認できる
  2. 自動テストを作成する下地になる
  3. モジュールの使い方を他の人が理解しやすい

 

サンプルコード ⇒ モジュール の順にコーディングしていくテスト駆動開発という手法もある。

先に入力/出力変数を決めておくことでUXが直感的になりやすい

 

バリデーション

 

入力変数にバリデーションを設定できる。

validationブロック条件とエラーメッセージを定義。

条件式では、ブロックがある入力変数のみ参照可能。

 

事前条件、事後条件

 

validationよりも動的なチェックを行えるpreconditionとpostconditionブロックがある。

precondition:リソースのデプロイ前にチェック ⇒ エラーなら作成されない

postcondition:リソースのデプロイ後にチェック ⇒ エラーでも作成はされる(ロールバックなし)

 

validationブロックと同じく条件とエラーメッセージを定義するが、
lifecycleブロック内にprecondition/postconditionブロックを書く。

precondition/postconditionは他のリソースやデータも参照可能。
ただ、自身を参照する場合にはself.<ATTRIBUTE>を使う。

 

validation, precondition, postcondition の使い分け

 

  1. validation
    • 変数に入ってくる値のチェック。
    • 直接、変数に定義するため条件を把握しやすい。
  2. precondition
    • 満たされるべき前提のチェック。
    • リソースやデータソースのチェック。
    • validationブロックでは難しい変数のチェック。
  3. postcondition
    • デプロイ後の振る舞いの約束事のチェック。
  4. 高度なチェックは自動テストツールで実装

 

バージョン管理されたモジュール

 

モジュールを使う上で考慮すべきバージョンは↓の3点。

  1. Terraformのバージョン
    • terraformブロックのrequired_versionパラメータで指定可能
    • tfenv × .terraform-versionファイル も便利
  2. プロバイダのバージョン
    • required_providersブロックのversionパラメータで指定可能
    • terraform init 時に作成される .terraform.lock.hcl ファイルでも管理している
  3. モジュールのバージョン
    • Gitの場合はタグをつけ、使用する際にはタグまで指定する。
    • 自作のモジュールはTerraformレジストリに登録するのもあり。
      • 登録するにはいくつかルールがある

 

本番レベルでは、勝手にバージョンが上がってしまわないよう
メジャーだけでなく、マイナー、パッチバージョンも指定しましょう

 

Terraformモジュールの先へ

 

Terraformと他のツール(Bashスクリプト、Docker、Packerなど)を連携させるには

  1. プロビジョナ
    • デフォルトではリソースの作成時のみに実行
  2. null_resource × プロビジョナ
    • リソースとしては何も作成しない
    • triggersの値が変化すると再作成され、プロビジョナも再実行される
  3. 外部データソース
    • Bashスクリプトなど、何かを実行した結果を使いたい場合に適する

 

次章のメモ

 


コメント

タイトルとURLをコピーしました