次の方法で共有


クイック スタート: Terraform を使用して非準拠リソースを識別するポリシー割り当てを作成する

Azure のコンプライアンスを理解する第一歩は、リソースの状態を特定することです。 このクイック スタートでは、マネージド ディスクを使用していない仮想マシンを識別するためのポリシー割り当てを作成するプロセスについて説明します。

組み込みのポリシーまたはイニシアティブ定義を割り当てる場合、バージョンの参照は省略可能です。 組み込み定義のポリシー割り当ては既定で最新バージョンになり、特に指定がない限り、マイナー バージョンの変更が自動的に継承されます。

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

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

  • 現在の Azure クライアント構成を取得します。
  • 生成されたランダムな名前を持つ Azure リソース グループを作成します。
  • サブスクリプション ポリシーの割り当てを作成して、マネージド ディスクを使用していない仮想マシンを識別する

前提条件

Terraform コードを実装する

この記事のサンプル コードは、Azure Terraform GitHub リポジトリにあります。 Terraform の現在および以前のバージョンからのテスト結果を含むログ ファイルを表示できます。 Terraform を使用して Azure リソースを管理する方法を示す 記事とサンプル コード

  1. サンプル Terraform コードをテストして実行するディレクトリを作成し、それを現在のディレクトリにします。

  2. providers.tf という名前のファイルを作成し、次のコードを挿入します。

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. main.tf という名前のファイルを作成し、次のコードを挿入します。

    # Create a random pet name to ensure unique resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group
    resource "azurerm_resource_group" "example" {
      ___location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Get the current subscription
    data "azurerm_subscription" "current" {}
    
    # Create a subscription policy assignment
    resource "azurerm_subscription_policy_assignment" "auditvms" {
      name                 = "audit-vm-manageddisks"
      subscription_id      = coalesce(var.scope, "/subscriptions/${data.azurerm_subscription.current.subscription_id}")
      policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d"
      description          = "Shows all virtual machines not using managed disks"
      display_name         = "Audit VMs without managed disks assignment"
    }
    
  4. variables.tf という名前のファイルを作成し、次のコードを挿入します。

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "scope" {
      type        = string
      default     = ""
      description = "Scope of the policy assignment."
    }
    
  5. outputs.tf という名前のファイルを作成し、次のコードを挿入します。

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "assignment_id" {
      value = azurerm_subscription_policy_assignment.auditvms.id
    }
    
    output "subscription_id" {
      value = data.azurerm_subscription.current.subscription_id
    }
    

スコープを指定する

スコープによって、ポリシー割り当てを強制するリソースまたはリソースのグループが決まります。 スコープには、管理グループから個々のリソースまで指定できます。 次のいずれかのスコープを使用するには、scope ファイル内のvariables.tf変数を更新します。 scope変数の値を空白のままにすると、"サブスクリプション" スコープが使用されます。

  • サブスクリプション: /subscriptions/<subscription_id>
  • リソース グループ: /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>
  • リソース: /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/<resource_provider_namespace>/[{parentResourcePath}/]

Terraform を初期化する

重要

4.x azurerm プロバイダーを使用している場合は、Terraform コマンドを実行する前に、Azure に対して認証する Azure サブスクリプション ID を明示的に指定 する必要があります。

azure サブスクリプション ID を providers ブロックに入れずに指定する 1 つの方法は、 ARM_SUBSCRIPTION_IDという名前の環境変数にサブスクリプション ID を指定することです。

詳細については、 Azure プロバイダーのリファレンス ドキュメントを参照してください

terraform init 実行して、Terraform デプロイを初期化します。 このコマンドを実行すると、Azure リソースの管理に必要な Azure プロバイダーがダウンロードされます。

terraform init -upgrade

のポイント:

  • -upgrade パラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。

Terraform 実行プランを作成する

terraform plan を実行して、実行プランを作成します。

terraform plan -out main.tfplan

のポイント:

  • terraform plan コマンドは実行プランを作成しますが、実行しません。 代わりに、構成ファイルで指定された構成を作成するために必要なアクションが決まります。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが期待と一致するかどうかを確認できます。
  • 省略可能な -out パラメーターを使用すると、プランの出力ファイルを指定できます。 -out パラメーターを使用すると、確認したプランが適用される内容であることが保証されます。

Terraform 実行プランを適用する

terraform apply を実行して、クラウド インフラストラクチャに実行プランを適用します。

terraform apply main.tfplan

のポイント:

  • terraform apply コマンドの例では、以前に terraform plan -out main.tfplanを実行していることを前提としています。
  • -out パラメーターに別のファイル名を指定した場合は、terraform applyの呼び出しで同じファイル名を使用します。
  • -out パラメーターを使用しなかった場合は、パラメーターを指定せずに terraform apply を呼び出します。

結果を確認する

  1. _assignment\_id_ によって返される terraform apply を取得します。

  2. 次のコマンドを実行して、新しいポリシー割り当ての下で準拠していないリソースを表示します。

    armclient post "/subscriptions/<subscription_id>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>
    
  3. 結果は、Azure portal ビューの [非準拠リソース ] に表示される結果と同等です。

リソースをクリーンアップする

Terraform を使用して作成されたリソースが不要になったら、次の手順を実行します。

  1. terraform plan を実行して、destroy フラグを指定します。

    terraform plan -destroy -out main.destroy.tfplan
    

    のポイント:

    • terraform plan コマンドは実行プランを作成しますが、実行しません。 代わりに、構成ファイルで指定された構成を作成するために必要なアクションが決まります。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが期待と一致するかどうかを確認できます。
    • 省略可能な -out パラメーターを使用すると、プランの出力ファイルを指定できます。 -out パラメーターを使用すると、確認したプランが適用される内容であることが保証されます。
  2. terraform apply を実行して、実行プランを適用します。

    terraform apply main.destroy.tfplan
    

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

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

次のステップ