テストのベスト プラクティス

このドキュメントでは、Google Cloud 向け Terraform のモジュールと構成をテストするためのガイドラインと推奨事項について説明します。

Terraform のモジュールと構成のテストは、アプリケーション コードのテストとは異なるパターンと規則に従う場合があります。アプリケーション コードのテストでは、主にアプリケーション自体のビジネス ロジックをテストしますが、インフラストラクチャ コードを完全にテストするには、本番環境の障害リスクを最小限に抑えるために、実際のクラウド リソースをデプロイする必要があります。Terraform テストを実行する際には、次の点を考慮してください。

  • Terraform テストを実行すると、実際のインフラストラクチャが作成、変更、破棄されるため、テストに時間と費用がかかる可能性があります。
  • エンドツーエンドのアーキテクチャに純粋な単体テストを行うことはできません。最良の方法は、アーキテクチャをモジュールに分割し、個別にテストすることです。このアプローチの利点は、テスト ランタイムの高速化、各テストのコストの削減、制御できない要因によるテスト失敗の可能性の低減により、反復型開発を迅速に行えることです。
  • 可能であれば、状態の再利用は避けてください。他の構成とデータを共有するような構成でテストしている場合でも、各テストを独立させ、テスト間で状態を再利用しないのが理想的です。

最初は低コストのテスト方法を使用する

Terraform のテストには複数の方法があります。次のような方法があります(費用、実行時間、深さの低い順に示します)。

  • 静的分析: コンパイラ、リンター、ドライランなどのツールを使用して、リソースをデプロイせずに構成の構文と構造をテストします。その場合は、terraform validate を使用します。
  • モジュール統合テスト: モジュールが正常に機能することを確認するために、個々のモジュールを単独でテストします。モジュールの統合テストでは、モジュールをテスト環境にデプロイし、想定されるリソースが作成されたことを確認します。次のように、テストの作成を容易にするテスト フレームワークがいくつかあります。
  • エンドツーエンドのテスト: 統合テストのアプローチを環境全体に拡張することで、複数のモジュールが連携して機能することを確認できます。このアプローチでは、アーキテクチャを構成するすべてのモジュールを新しいテスト環境にデプロイします。テスト環境が本番環境とできるだけ似ているのが理想的です。これはコストがかかりますが、変更が本番環境の中断を引き起こさない最も確実な方法です。

小規模で始める

繰り返し行えるようにテストを構成します。まず小規模なテストを実行してから、より複雑なテストを行う、フェイル ファスト アプローチを使用します。

プロジェクト ID とリソース名をランダム化する

名前の競合を避けるため、グローバルに一意のプロジェクト ID と、各プロジェクト内で重複しないリソース名が構成に含まるようにします。これを行うには、リソースに名前空間を使用します。Terraform には、これを行うためのランダム プロバイダが組み込まれています。

テストに別の環境を使用する

テストでは、多くのリソースが作成され、削除されます。リソースのクリーンアップ中に誤って削除されないように、開発環境または本番環境プロジェクトから環境を隔離します。最善のアプローチは、テストごとに新しいプロジェクトまたはフォルダを作成することです。構成ミスを回避するため、テストの実行ごとに個別のサービス アカウントを作成することをおすすめします。

すべてのリソースをクリーンアップする

インフラストラクチャ コードをテストするということは、実際のリソースをデプロイすることを意味します。課金されないようにするには、クリーンアップ手順の実装を検討してください。

特定の構成で管理されているすべてのリモート オブジェクトを破棄するには、terraform destroy コマンドを使用します。一部のテスト フレームワークには、クリーンアップ手順があらかじめ組み込まれています。たとえば、Terratest を使用している場合は、defer terraform.Destroy(t, terraformOptions) をテストに追加します。Kitchen-Terraform を使用している場合は、terraform kitchen delete WORKSPACE_NAME を使用してワークスペースを削除します。

terraform destroy コマンドを実行した後、追加のクリーンアップ手順を実行して、Terraform が破棄できなかったリソースを削除します。これを行うには、テスト実行に使用したプロジェクトを削除するか、project_cleanup モジュールなどのツールを使用します。

テスト ランタイムを最適化する

テストの実行時間を最適化するには、次の方法を使用します。

  • テストを並行して実行する。一部のテスト フレームワークでは、複数の Terraform テストの同時実行がサポートされています。
    • たとえば、Terratest を使用する場合は、テスト関数定義の後に t.Parallel() を追加します。
  • 段階的にテストする。別個にテストできる複数の独立した構成に分離します。このアプローチにより、テストの実施時にすべての段階を経る必要がなくなり、反復開発サイクルを加速化させることができます。
    • たとえば、Kitchen-Terraform では、テストを別々のスイートに分割します。反復処理では、各スイートが個別に実行されます。
    • 同様に、Terratest を使用して、テストの各ステージを stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION) でラップします。実行するテストを示す環境変数を設定します。例: SKIPSTAGE_NAME="true"
    • ブループリント テスト フレームワークは、段階的な実行をサポートしています。

次のステップ