Azure で Terraform プロジェクトの統合テストを実装する
Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、デプロイが可能になります。 Terraform を使用して、HCL 構文
統合テストでは、新しく導入されたコード変更によって既存のコードが破損しないことを検証します。 DevOps では、継続的インテグレーション (CI) とは、コード ベースが変更されるたびにシステム全体を構築するプロセスを指します。たとえば、PR を Git リポジトリにマージする必要があるユーザーなどです。 統合テストの一般的な例を次に示します。
- 静的コード解析ツールの一例として、lintやフォーマットがあります。
- 構成ファイルの構文を確認するには、terraform validate を実行してください。
- terraform plan を実行して、構成が期待どおりに動作することを確認します。
この記事では、次の方法について説明します。
- Terraform プロジェクトの統合テストの基本について説明します。
- Azure DevOps を使用して継続的インテグレーション パイプラインを構成します。
- Terraform コードで静的コード分析を実行します。
terraform validate
を実行して、ローカル コンピューター上の Terraform 構成ファイルを検証します。terraform plan
を実行して、リモート サービスの観点から Terraform 構成ファイルを検証します。- Azure Pipeline を使用して継続的インテグレーションを自動化します。
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 を構成する
Azure DevOps の組織とプロジェクト : まだお持ちでない場合は、Azure DevOps 組織を作成してください。 Terraform Build & Release Tasks 拡張機能: Azure DevOps 組織に Terraform ビルド/リリース タスクをインストールします。
Azure サブスクリプションへのアクセス権を Azure DevOps に付与する:
terraform-basic-testing-azure-connection
という名前の Azure サービス接続 を作成して、Azure Pipelines が Azure サブスクリプションに接続できるようにしますコードとリソースの例:統合テスト プロジェクトのを GitHub からダウンロードします。 サンプルをダウンロードするディレクトリは、サンプル ディレクトリと呼ばれます。
2. ローカルの Terraform 構成を検証する
terraform validate コマンドは、Terraform ファイルを含むディレクトリ内のコマンド ラインから実行されます。 このコマンドの主な目的は、構文の検証です。
サンプル ディレクトリ内で、
src
ディレクトリに移動します。terraform init
実行して作業ディレクトリを初期化します。 terraform init
構成ファイルの構文を検証するには、terraform validate を実行します。
terraform validate
のポイント:
- Terraform 構成が有効であることを示すメッセージが表示されます。
main.tf
ファイルを編集します。5 行目に、構文を無効にする入力ミスを挿入します。 たとえば、
var.location
をvar.loaction
に置き換えますファイルを保存します。
検証をもう一度実行します。
terraform validate
のポイント:
- エラーのコード行とエラーの説明を示すエラー メッセージが表示されます。
ご覧のように、Terraform は構成コードの構文で問題を検出しました。 この問題により、構成がデプロイされなくなります。
バージョン管理システムにプッシュする前に、常に Terraform ファイルに対して terraform validate
を実行することをお勧めします。 また、このレベルの検証は、継続的インテグレーション パイプラインの一部である必要があります。 この記事の後半では、を自動的に検証するように Azure パイプライン
3. Terraform の構成を検証する
前のセクションでは、Terraform 構成を検証する方法について説明しました。 そのレベルのテストは構文に固有でした。 このテストでは、Azure に既にデプロイされているものは考慮されていませんでした。
Terraform は、宣言型言語、最終的な結果として必要なものを宣言することを意味します。 たとえば、リソース グループに 10 個の仮想マシンがあるとします。 次に、3 つの仮想マシンを定義する Terraform ファイルを作成します。 このプランを適用しても、合計カウントは 13 に増加しません。 代わりに、Terraform は仮想マシンのうち 7 つを削除して、3 つで終わるようにします。 terraform plan
を実行すると、実行プランを適用した場合の潜在的な結果を確認して、驚きを避けることができます。
Terraform 実行プランを生成するには、terraform plan
この記事と共にフォローしていて、前のセクションの手順を完了している場合は、terraform plan
コマンドを実行します。
terraform plan
terraform plan
を実行すると、Terraform は実行プランを適用した場合の潜在的な結果を表示します。 出力は、追加、変更、破棄される Azure リソースを示します。
既定では、Terraform は Terraform ファイルと同じローカル ディレクトリに状態を格納します。 このパターンは、シングル ユーザー シナリオで適切に機能します。 ただし、複数のユーザーが同じ Azure リソースで作業すると、ローカル状態ファイルが同期から外れる可能性があります。この問題を解決するために、Terraform では、リモート データ ストア (Azure Storage など) への状態ファイルの書き込みがサポートされています。 このシナリオでは、ローカル コンピューターで terraform plan
を実行し、リモート コンピューターをターゲットにすることが問題になる可能性があります。 その結果、継続的インテグレーション パイプラインの一部として、この検証手順を
4. 静的コード分析を実行する
静的コード分析は、Terraform 構成コードで直接、実行せずに実行できます。 この分析は、セキュリティの問題やコンプライアンスの不整合などの問題を検出するのに役立ちます。
次のツールは、Terraform ファイルの静的分析を提供します。
静的分析は、多くの場合、継続的インテグレーション パイプラインの一部として実行されます。 これらのテストでは、実行プランまたはデプロイを作成する必要はありません。 その結果、他のテストよりも高速に実行され、通常は継続的インテグレーション プロセスで最初に実行されます。
5. Azure Pipeline を使用して統合テストを自動化する
継続的インテグレーションでは、変更が導入されたときにシステム全体をテストする必要があります。 このセクションでは、継続的インテグレーションを実装するために使用される Azure Pipeline 構成について説明します。
任意のエディターを使用して、GitHubの
Terraform サンプル プロジェクトのローカル クローンを参照します。 samples/integration-testing/src/azure-pipeline.yaml
ファイルを開きます。ステップ セクションまで下にスクロールすると、さまざまなインストールおよび検証ルーチンの実行に使用される標準的な一連の手順が表示されます。
行を確認してください: 手順 1: Checkov 静的コード分析 を実行。 この手順では、前に説明した
Checkov
プロジェクトは、サンプルの Terraform 構成で静的コード分析を実行します。- bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory) displayName: Checkov Static Code Analysis
のポイント:
- このスクリプトは、Docker コンテナー内にマウントされた Terraform ワークスペースで Checkov を実行します。 Microsoft が管理するエージェントは Docker が有効になっています。 Docker コンテナー内でツールを実行する方が簡単で、Azure Pipeline エージェントに Checkov をインストールする必要がなくなります。
$(terraformWorkingDirectory)
変数は、azure-pipeline.yaml
ファイルで定義されます。
"手順 2: Azure Pipelines エージェントに Terraform をインストールする行を確認します。" 前にインストールした Terraform Build & Release Task 拡張機能 には、Azure Pipeline を実行しているエージェントに Terraform をインストールするコマンドがあります。 このタスクは、この手順で実行されています。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: $(terraformVersion)
のポイント:
- インストールする Terraform のバージョンは、
terraformVersion
という名前の Azure Pipeline 変数を使用して指定され、azure-pipeline.yaml
ファイルで定義されます。
- インストールする Terraform のバージョンは、
「この行を確認してください: 「手順3: Terraform init を実行してワークスペースを初期化する。」」 Terraform がエージェントにインストールされたので、Terraform ディレクトリを初期化できます。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform init' inputs: command: init workingDirectory: $(terraformWorkingDirectory)
のポイント:
command
入力では、実行する Terraform コマンドを指定します。workingDirectory
入力は、Terraform ディレクトリのパスを示します。$(terraformWorkingDirectory)
変数は、azure-pipeline.yaml
ファイルで定義されます。
行 、「手順 4: Terraform validate を実行して HCL 構文を検証する」を確認してください。 プロジェクト ディレクトリが初期化されると、
terraform validate
が実行され、サーバー上の構成が検証されます。- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform validate' inputs: command: validate workingDirectory: $(terraformWorkingDirectory)
Step 5: run Terraform plan to validate HCL syntax という行を確認します。 前に説明したように、実行プランの生成は、デプロイ前に Terraform 構成が有効かどうかを確認するために行われます。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform plan' inputs: command: plan workingDirectory: $(terraformWorkingDirectory) environmentServiceName: $(serviceConnection) commandOptions: -var location=$(azureLocation)
のポイント:
environmentServiceName
の入力は、「環境を構成する」で作成された Azure サービスの接続の名前を示します。 この接続により、Terraform は Azure サブスクリプションにアクセスできます。commandOptions
入力は、Terraform コマンドに引数を渡すために使用されます。 この場合、場所が指定されています。$(azureLocation)
変数は、YAML ファイルの前の方で定義されています。
Azure DevOps にパイプラインをインポートする
Azure DevOps プロジェクトを開き、Azure Pipelines セクションに移動します。
[パイプラインを作成] ボタンを選択します。
コードはどこにありますか のオプションで、GitHub (YAML)を選択します。
この時点で、組織にアクセスするために Azure DevOps の承認が必要になる場合があります。 このトピックの詳細については、「GitHub リポジトリのビルド 」を参照してください。
リポジトリの一覧で、GitHub 組織で作成したリポジトリのフォークを選択します。
パイプライン の構成手順で、既存の YAML パイプラインから開始することを選択します。
で使用する
[既存の YAML パイプライン の選択] ページが表示されたら、ブランチ
master
を指定し、YAML パイプラインへのパスを入力します:samples/integration-testing/src/azure-pipeline.yaml
。を選択する
続行 を選択して、GitHub から Azure YAML パイプラインを読み込みます。
[パイプラインの YAML の確認] ページが表示されたら、[ の実行] を選択して、パイプラインを初めて作成して手動でトリガーします。
を実行する
結果を確認する
Azure DevOps UI からパイプラインを手動で実行できます。 ただし、この記事のポイントは、自動化された継続的インテグレーションを示す点です。 フォークされたリポジトリの samples/integration-testing/src
フォルダーに変更をコミットして、プロセスをテストします。 この変更により、コードをプッシュするブランチで新しいパイプラインが自動的にトリガーされます。
GitHub から実行されている
その手順が完了したら、Azure DevOps の詳細にアクセスして、すべてが正常に実行されたことを確認します。
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用するときの一般的な問題のトラブルシューティング
次の手順
Azure での Terraform の使用の詳細