Terraformはクラウドインフラストラクチャの定義、プレビュー、そしてデプロイメントを可能にします。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 あなたの設定ファイルを作成した後、実行計画を作成します。これにより、インフラストラクチャの変更をデプロイする前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
エンドツーエンド (E2E) テストは、プログラムを本番環境にデプロイする前にプログラムの動作を検証するために使用されます。 シナリオの例としては、2 つの仮想マシンを仮想ネットワークにデプロイする Terraform モジュールがあります。 2 台のマシンが互いに ping を実行しないようにすることができます。 この例では、デプロイ前に目的の結果を確認するテストを定義できます。
E2E テストは通常、3 段階のプロセスです。
- 構成はテスト環境に適用されます。
- コードを実行して結果を確認します。
- テスト環境が再初期化されるか、停止されます (仮想マシンの割り当て解除など)。
この記事では、次の方法について説明します。
- Terratest を使用したエンドツーエンド テストの基本を理解する
- Golangを使用してエンドツーエンドのテストを作成する方法を学ぶ
- Azure DevOps を使用して、コードがリポジトリにコミットされたときにエンド ツー エンド テストを自動的にトリガーする方法について説明します
1. 環境を構成する
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。
- Bash を使用して Azure Cloud Shell で Terraform を構成する
- PowerShell を使用して Azure Cloud Shell で Terraform を構成する
- Bash を使用して Windows で Terraform を構成する
- PowerShell を使用して Windows で Terraform を構成する
- Bash を使用して Azure Cloud Shell で Terraform を構成する
Go プログラミング言語: Go をインストールします。
サンプルコードとリソース: DownGitツールを使用して、GitHubから エンドツーエンドのテストプロジェクト をダウンロードし、サンプルコードを含む新しいディレクトリに解凍します。 このディレクトリは、 サンプル ディレクトリと呼ばれます。
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 init
とterraform apply
の実行を有効にします - テラフォーム。出力: デプロイ出力変数の値を取得します。
-
テラフォーム。破棄: Go コードから
terraform destroy
コマンドを実行します。 - test_structure。LoadTerraformOptions: Terraform オプション (構成や変数など) を状態から読み込みます
- test_structure。SaveTerraformOptions: Terraform オプション (構成や変数など) を状態に保存します
5. テスト例を実行する
次の手順では、サンプルの構成とデプロイに対してテストを実行します。
bash/ターミナルウィンドウを開きます。
Azure アカウントにログインします。
このサンプル テストを実行するには、ホーム ディレクトリに SSH 秘密鍵と公開鍵のペアの名前
id_rsa
とid_rsa.pub
が必要です。<your_user_name>
をホーム ディレクトリの名前に置き換えます。export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
サンプル ディレクトリ内で、
src/test
ディレクトリに移動します。テストを実行します。
go test -v ./ -timeout 10m
6. 結果を確認する
go test
を正常に実行すると、次の出力のような結果が表示されます。
--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok test 391.052s
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する際の一般的な問題をトラブルシュートする