次の方法で共有


Terraform と Azure を使用してコンプライアンス テストを実装する

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

多くの場合、コンプライアンス テストは継続的インテグレーション プロセスの一部であり、ユーザー定義のポリシーに確実に従うために使用されます。 たとえば、Azure リソースの地政学的な名前付け規則を定義できます。 もう 1 つの一般的な例は、定義されたイメージのサブセットから仮想マシンを作成することです。 コンプライアンス テストは、これらのシナリオやその他の多くのシナリオでルールを適用するために使用されます。

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

  • コンプライアンス テストを使用するタイミングを理解する
  • コンプライアンス テストを実行する方法について説明します
  • コンプライアンス テストの例を確認して実行する

1. 環境を構成する

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

2. コンプライアンスのテストとチェックを理解する

コンプライアンス テストは、システムが規定された標準を満たしているかどうかを判断するための非機能テスト手法です。 コンプライアンス テストは、 準拠テストとも呼ばれます。

ほとんどのソフトウェア チームは分析を行って、標準が適切に適用され、実装されていることを確認します。 多くの場合、同時に作業して標準を改善し、品質の向上につながります。

コンプライアンス テストでは、コンプライアンス テストとコンプライアンス チェックという 2 つの重要な概念を考慮する必要があります。

  • コンプライアンス テスト により、各開発ライフサイクル フェーズの出力が合意された要件に準拠することが保証されます。
  • コンプライアンス チェック は、プロジェクトの開始時に開発サイクルに統合する必要があります。 後の段階でコンプライアンス チェックを追加しようとすると、要件自体が適切に文書化されていないとき、ますます困難になります。

コンプライアンス チェックの実行は簡単です。 開発ライフサイクルの各フェーズについて、一連の標準と手順が開発および文書化されています。 各フェーズの出力は、文書化された要件と比較されます。 テストの結果として、事前に定義された標準に準拠していないという点での "ギャップ" が示されます。 コンプライアンス テストは検査プロセスを通じて行われ、レビュー プロセスの結果を文書化する必要があります。

具体的な例を見てみましょう。

一般的な問題は、複数の開発者が互換性のない変更を適用するときに中断する環境です。 たとえば、1 人のユーザーが変更に取り組み、テスト環境での VM の作成などのリソースを適用するとします。 その後、別のユーザーが、その VM の異なるバージョンをプロビジョニングする別のバージョンのコードを適用します。 ここで必要なのは、規定された規則に準拠するための監視です。

この問題に対処する 1 つの方法は、リソースにタグを付けるポリシー ( role タグや creator タグなど) を定義することです。 ポリシーを定義すると、 Terraform コンプライアンス などのツールを使用して、ポリシーが確実に実行されるようになります。

Terraform コンプライアンスは ネガティブテストに重点を置いています。 否定テストは、システムが予期しない入力や望ましくない動作を適切に処理できることを確認するプロセスです。 ファジング はネガティブテストの例です。 ファジーでは、入力を受け取るシステムをテストして、予期しない入力を安全に処理できることを確認します。

幸い、Terraform は、クラウド インフラストラクチャ エンティティを作成、更新、または破棄する API の抽象化レイヤーです。 Terraform では、ローカル構成とリモート API 応答が同期することも保証されます。Terraform は主にクラウド API に対して使用されるため、インフラストラクチャに対してデプロイされたコードが特定のポリシーに従っていることを確認する方法がまだ必要です。 Terraform コンプライアンス (無料でオープンソースのツール) は、Terraform 構成にこの機能を提供します。

VM の例を使用すると、コンプライアンス ポリシーは次のようになります。 "Azure リソースを作成する場合は、タグを含める必要があります"

Terraform コンプライアンス ツールは、例のようなポリシーを作成するテスト フレームワークを提供します。 その後、Terraform 実行プランに対してこれらのポリシーを実行します。

Terraform コンプライアンスを使用すると、BDD または 動作駆動型開発の原則を適用できます。 BDD は、すべての利害関係者が連携してシステムの実行内容を定義するコラボレーション プロセスです。 これらの利害関係者には、一般に、開発者、テスト担当者、および既得権を持つすべてのユーザー、または開発中のシステムの影響を受けるユーザーが含まれます。 BDD の目標は、システムの動作に関する共通の理解を表す具体的な例を構築するようチームに奨励することです。

3. コンプライアンス テストの例を調べる

この記事では、テスト環境用の VM を作成するコンプライアンス テストの例について説明しました。 このセクションでは、その例を BDD 機能とシナリオに変換する方法について説明します。 ルールは、BDDをサポートするツールであるCucumberを使用して最初に表現されます。

when creating Azure resources, every new resource should have a tag

前の規則は次のように変換されます。

If the resource supports tags
Then it must contain a tag
And its value must not be null

その後、Terraform HCL コードは、次のように規則に従います。

resource "random_uuid" "uuid" {}

resource "azurerm_resource_group" "rg" {
  name     = "rg-hello-tf-${random_uuid.uuid.result}"
  location = var.location

  tags = {
    environment = "dev"
    application = "Azure Compliance"
  } 
}

最初のポリシーは、 次のように BDD 機能シナリオ として記述できます。

Feature: Test tagging compliance  # /target/src/features/tagging.feature
    Scenario: Ensure all resources have tags
        If the resource supports tags
        Then it must contain a tag
        And its value must not be null

次のコードは、特定のタグのテストを示しています。

Scenario Outline: Ensure that specific tags are defined
    If the resource supports tags
    Then it must contain a tag <tags>
    And its value must match the "<value>" regex

    Examples:
      | tags        | value              |
      | Creator     | .+                 |
      | Application | .+                 |
      | Role        | .+                 |
      | Environment | ^(prod\|uat\|dev)$ |

4. コンプライアンス テストの例を実行する

このセクションでは、例をダウンロードしてテストします。

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

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

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

    terraform validate
    

    重要なポイント:

    • Terraform 構成が有効であることを示すメッセージが表示されます。
  4. 実行計画を作成するために terraform plan を実行してください。

    terraform plan -out main.tfplan
    
  5. terraform show を実行して、コンプライアンス ステップの実行プランを JSON に変換します。

    terraform show -json main.tfplan > main.tfplan.json
    
  6. docker pull を実行して、terraform-compliance イメージをダウンロードします。

    docker pull eerkunt/terraform-compliance
    
  7. Docker 実行を実行して、Docker コンテナーでテストを実行します。

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    重要なポイント:

    • タグの存在を必要とする最初のルールは成功しますが、 Role タグと Creator タグが見つからないという点で 2 つ目のルールが失敗するため、テストは失敗します。

    失敗したテストの例

  8. 次のように main.tf を変更してエラーを修正します ( RoleCreator タグが追加されます)。

      tags = {
        Environment = "dev"
        Application = "Azure Compliance"
        Creator     = "Azure Compliance"
        Role        = "Azure Compliance"
      } 
    
    

    重要なポイント:

    • これで、構成はポリシーに準拠しています。

5. 結果を確認する

  1. terraform validateをもう一度実行して構文を確認します。

    terraform validate
    
  2. terraform planをもう一度実行して、新しい実行プランを作成します。

    terraform plan -out main.tfplan
    
  3. terraform show を実行して、コンプライアンス ステップの実行プランを JSON に変換します。

    terraform show -json main.tfplan > main.tfplan.json
    
  4. Docker の実行をもう一度実行して、構成をテストします。 完全な仕様が実装されている場合、テストは成功します。

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    成功したテストの例

  5. terraform applyを実行して、実行プランを適用します。

    terraform apply main.tfplan -target=random_uuid.uuid
    

    重要なポイント:

    • リソース グループは、 rg-hello-tf-<random_number>というパターンに従って名前で作成されます。

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

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

次のステップ