次の方法で共有


Terraform プロジェクトでのエンドツーエンドの Terratest テストの実装

Terraformはクラウドインフラストラクチャの定義、プレビュー、そしてデプロイメントを可能にします。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 あなたの設定ファイルを作成した後、実行計画を作成します。これにより、インフラストラクチャの変更をデプロイする前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。

エンドツーエンド (E2E) テストは、プログラムを本番環境にデプロイする前にプログラムの動作を検証するために使用されます。 シナリオの例としては、2 つの仮想マシンを仮想ネットワークにデプロイする Terraform モジュールがあります。 2 台のマシンが互いに ping を実行しないようにすることができます。 この例では、デプロイ前に目的の結果を確認するテストを定義できます。

E2E テストは通常、3 段階のプロセスです。

  1. 構成はテスト環境に適用されます。
  2. コードを実行して結果を確認します。
  3. テスト環境が再初期化されるか、停止されます (仮想マシンの割り当て解除など)。

この記事では、次の方法について説明します。

  • Terratest を使用したエンドツーエンド テストの基本を理解する
  • Golangを使用してエンドツーエンドのテストを作成する方法を学ぶ
  • Azure DevOps を使用して、コードがリポジトリにコミットされたときにエンド ツー エンド テストを自動的にトリガーする方法について説明します

1. 環境を構成する

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。

2. エンドツーエンドのテストを理解する

エンドツーエンドのテストでは、システムが全体として機能することを検証します。 このタイプのテストは、特定のモジュールのテストとは対照的です。 Terraformプロジェクトの場合、エンドツーエンドのテストにより、デプロイされた内容を検証できます。 この種類のテストは、デプロイ前のシナリオをテストする他の多くの種類とは異なります。 エンドツーエンドのテストは、複数のモジュールを含み、複数のリソースに作用する複雑なシステムをテストするために重要です。 このようなシナリオでは、エンドツーエンドのテストが、さまざまなモジュールが正しく相互作用しているかどうかを判断する唯一の方法です。

この記事では、 Terratest を使用してエンドツーエンドのテストを実装する方法に焦点を当てます。 Terratest は、次のタスクを実行するために必要なすべてのプラミングを提供します。

  • Terraform 構成をデプロイする
  • Go 言語を使用してテストを記述し、デプロイされた内容を検証できます
  • テストをステージに編成する
  • デプロイされたインフラストラクチャを破棄する

3. テスト例を理解する

この記事では、 Azure/terraform サンプル リポジトリで入手できるサンプルを使用します。

このサンプルでは、2 つの Linux 仮想マシンを同じ仮想ネットワークにデプロイする Terraform 構成を定義します。 1 つの VM ( vm-linux-1 という名前) にはパブリック IP アドレスがあります。 SSH 接続を許可するために、ポート 22 のみが開かれます。 2 番目の VM ( vm-linux-2 ) には、パブリック IP アドレスが定義されていません。

このテストでは、次のシナリオが検証されます。

  • インフラストラクチャが正しくデプロイされている
  • ポート 22 を使用して、SSH セッションを開くことができます。 vm-linux-1
  • vm-linux-1 の SSH セッションを使用すると、ping を実行できますvm-linux-2

サンプルのエンドツーエンドテストシナリオ

サンプルをダウンロードした場合、このシナリオの Terraform 構成は src/main.tf ファイルにあります。 main.tf ファイルには、前の図で示した Azure インフラストラクチャをデプロイするために必要なすべてのものが含まれています。

仮想マシンの作成方法に慣れていない場合は、「 Terraform を使用して Azure でインフラストラクチャを持つ Linux VM を作成する」を参照してください。

注意事項

この記事で紹介するサンプル シナリオは、説明のみを目的としています。 私たちは、エンドツーエンドのテストのステップに集中するために、意図的に物事をシンプルにしています。 パブリック IP アドレス経由で SSH ポートを公開する運用仮想マシンを用意することはお勧めしません。

4. テスト例を調べる

エンドツーエンドのテストはGo言語で記述され、Terratestフレームワークを使用します。 サンプルをダウンロードした場合、テストは src/test/end2end_test.go ファイルで定義されます。

次のソースコードは、Terratestを使用したGolangテストの標準構造を示しています。

package test

import (
    "testing"

    "github.com/gruntwork-io/terratest/modules/terraform"
    test_structure "github.com/gruntwork-io/terratest/modules/test-structure"
)

func TestEndToEndDeploymentScenario(t *testing.T) {
    t.Parallel()

    fixtureFolder := "../"

    // Use Terratest to deploy the infrastructure
    test_structure.RunTestStage(t, "setup", func() {
        terraformOptions := &terraform.Options{
            // Indicate the directory that contains the Terraform configuration to deploy
            TerraformDir: fixtureFolder,
        }

        // Save options for later test stages
        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)

        // Triggers the terraform init and terraform apply command
        terraform.InitAndApply(t, terraformOptions)
    })

    test_structure.RunTestStage(t, "validate", func() {
        // run validation checks here
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
		    publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
    })

    // When the test is completed, teardown the infrastructure by calling terraform destroy
    test_structure.RunTestStage(t, "teardown", func() {
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
        terraform.Destroy(t, terraformOptions)
    })
}

前のコード スニペットからわかるように、テストは 3 つのステージで構成されます。

  • setup: Terraform を実行して構成をデプロイします
  • validate': 検証チェックとアサーションを行います
  • teardown: テストの実行後にインフラストラクチャをクリーンアップします

次の一覧は、Terratest フレームワークによって提供される主要な機能の一部を示しています。

  • テラフォーム。InitAndApply: Go コードからの terraform initterraform apply の実行を有効にします
  • テラフォーム。出力: デプロイ出力変数の値を取得します。
  • テラフォーム。破棄: Go コードから terraform destroy コマンドを実行します。
  • test_structure。LoadTerraformOptions: Terraform オプション (構成や変数など) を状態から読み込みます
  • test_structure。SaveTerraformOptions: Terraform オプション (構成や変数など) を状態に保存します

5. テスト例を実行する

次の手順では、サンプルの構成とデプロイに対してテストを実行します。

  1. bash/ターミナルウィンドウを開きます。

  2. Azure アカウントにログインします。

  3. このサンプル テストを実行するには、ホーム ディレクトリに SSH 秘密鍵と公開鍵のペアの名前 id_rsaid_rsa.pub が必要です。 <your_user_name> をホーム ディレクトリの名前に置き換えます。

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. サンプル ディレクトリ内で、src/test ディレクトリに移動します。

  5. テストを実行します。

    go test -v ./ -timeout 10m
    

6. 結果を確認する

go testを正常に実行すると、次の出力のような結果が表示されます。

--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok      test    391.052s

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用する際の一般的な問題をトラブルシュートする

次のステップ