次の方法で共有


Azure で Terraform プロジェクトの統合テストを実装する

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

統合テストでは、新しく導入されたコード変更によって既存のコードが破損しないことを検証します。 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 を構成する
  • 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 ファイルを含むディレクトリ内のコマンド ラインから実行されます。 このコマンドの主な目的は、構文の検証です。

  1. サンプル ディレクトリ内で、src ディレクトリに移動します。

  2. terraform init 実行して作業ディレクトリを初期化します。

    terraform init
    
  3. 構成ファイルの構文を検証するには、terraform validate を実行します。

    terraform validate
    

    のポイント:

    • Terraform 構成が有効であることを示すメッセージが表示されます。
  4. main.tf ファイルを編集します。

  5. 5 行目に、構文を無効にする入力ミスを挿入します。 たとえば、var.locationvar.loaction に置き換えます

  6. ファイルを保存します。

  7. 検証をもう一度実行します。

    terraform validate
    

    のポイント:

    • エラーのコード行とエラーの説明を示すエラー メッセージが表示されます。

ご覧のように、Terraform は構成コードの構文で問題を検出しました。 この問題により、構成がデプロイされなくなります。

バージョン管理システムにプッシュする前に、常に Terraform ファイルに対して terraform validate を実行することをお勧めします。 また、このレベルの検証は、継続的インテグレーション パイプラインの一部である必要があります。 この記事の後半では、を自動的に検証するように Azure パイプライン 構成する方法について説明します。

3. Terraform の構成を検証する

前のセクションでは、Terraform 構成を検証する方法について説明しました。 そのレベルのテストは構文に固有でした。 このテストでは、Azure に既にデプロイされているものは考慮されていませんでした。

Terraform は、宣言型言語、最終的な結果として必要なものを宣言することを意味します。 たとえば、リソース グループに 10 個の仮想マシンがあるとします。 次に、3 つの仮想マシンを定義する Terraform ファイルを作成します。 このプランを適用しても、合計カウントは 13 に増加しません。 代わりに、Terraform は仮想マシンのうち 7 つを削除して、3 つで終わるようにします。 terraform plan を実行すると、実行プランを適用した場合の潜在的な結果を確認して、驚きを避けることができます。

Terraform 実行プランを生成するには、terraform plan を実行します。 このコマンドは、ターゲットの Azure サブスクリプションに接続して、構成のどの部分が既にデプロイされているかを確認します。 Terraform は、Terraform ファイルに記載されている要件を満たすために必要な変更を決定します。 この段階では、Terraform は何もデプロイしていません。 プランを適用するとどうなるかを示しています。

この記事と共にフォローしていて、前のセクションの手順を完了している場合は、terraform plan コマンドを実行します。

terraform plan

terraform planを実行すると、Terraform は実行プランを適用した場合の潜在的な結果を表示します。 出力は、追加、変更、破棄される Azure リソースを示します。

既定では、Terraform は Terraform ファイルと同じローカル ディレクトリに状態を格納します。 このパターンは、シングル ユーザー シナリオで適切に機能します。 ただし、複数のユーザーが同じ Azure リソースで作業すると、ローカル状態ファイルが同期から外れる可能性があります。この問題を解決するために、Terraform では、リモート データ ストア (Azure Storage など) への状態ファイルの書き込みがサポートされています。 このシナリオでは、ローカル コンピューターで terraform plan を実行し、リモート コンピューターをターゲットにすることが問題になる可能性があります。 その結果、継続的インテグレーション パイプラインの一部として、この検証手順を 自動化することが理にかなっている可能性があります。

4. 静的コード分析を実行する

静的コード分析は、Terraform 構成コードで直接、実行せずに実行できます。 この分析は、セキュリティの問題やコンプライアンスの不整合などの問題を検出するのに役立ちます。

次のツールは、Terraform ファイルの静的分析を提供します。

静的分析は、多くの場合、継続的インテグレーション パイプラインの一部として実行されます。 これらのテストでは、実行プランまたはデプロイを作成する必要はありません。 その結果、他のテストよりも高速に実行され、通常は継続的インテグレーション プロセスで最初に実行されます。

5. Azure Pipeline を使用して統合テストを自動化する

継続的インテグレーションでは、変更が導入されたときにシステム全体をテストする必要があります。 このセクションでは、継続的インテグレーションを実装するために使用される Azure Pipeline 構成について説明します。

  1. 任意のエディターを使用して、GitHubの Terraform サンプル プロジェクトのローカル クローンを参照します。

  2. samples/integration-testing/src/azure-pipeline.yaml ファイルを開きます。

  3. ステップ セクションまで下にスクロールすると、さまざまなインストールおよび検証ルーチンの実行に使用される標準的な一連の手順が表示されます。

  4. 行を確認してください: 手順 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 ファイルで定義されます。
  5. "手順 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 ファイルで定義されます。
  6. この行を確認してください: 「手順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 ファイルで定義されます。
  7. 、「手順 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)
    
  8. 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 にパイプラインをインポートする

  1. Azure DevOps プロジェクトを開き、Azure Pipelines セクションに移動します。

  2. [パイプラインを作成] ボタンを選択します。

  3. コードはどこにありますか のオプションで、GitHub (YAML)を選択します。

    コードはどこにありますか?

  4. この時点で、組織にアクセスするために Azure DevOps の承認が必要になる場合があります。 このトピックの詳細については、「GitHub リポジトリのビルド 」を参照してください。

  5. リポジトリの一覧で、GitHub 組織で作成したリポジトリのフォークを選択します。

  6. パイプライン の構成手順で、既存の YAML パイプラインから開始することを選択します。

    既存の YAML パイプラインをで使用する

  7. [既存の YAML パイプライン の選択] ページが表示されたら、ブランチ master を指定し、YAML パイプラインへのパスを入力します:samples/integration-testing/src/azure-pipeline.yaml

    既存の YAML パイプライン を選択する

  8. 続行 を選択して、GitHub から Azure YAML パイプラインを読み込みます。

  9. [パイプラインの YAML の確認] ページが表示されたら、[ の実行] を選択して、パイプラインを初めて作成して手動でトリガーします。

    Azure Pipeline を実行する

結果を確認する

Azure DevOps UI からパイプラインを手動で実行できます。 ただし、この記事のポイントは、自動化された継続的インテグレーションを示す点です。 フォークされたリポジトリの samples/integration-testing/src フォルダーに変更をコミットして、プロセスをテストします。 この変更により、コードをプッシュするブランチで新しいパイプラインが自動的にトリガーされます。

GitHub から実行されている パイプライン

その手順が完了したら、Azure DevOps の詳細にアクセスして、すべてが正常に実行されたことを確認します。

Azure DevOps Green Pipeline

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

Azure で Terraform を使用するときの一般的な問題のトラブルシューティング

次の手順

Azure での Terraform の使用の詳細