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

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

このプロセスを終了すると、サブスクリプション全体でマネージド ディスクを使用していない仮想マシンを適切に特定できるようになります。 これらはポリシーの割り当てに "準拠していません"。

前提条件

  • Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • 環境で Terraform バージョン 0.12.0 以上が構成されていること。 手順については、「Azure Cloud Shell を使用して Terraform を構成する」を参照してください。
  • このクイックスタートでは、Azure CLI バージョン 2.13.0 以降を実行する必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

Terraform の構成、変数、および出力ファイルを作成する

このクイックスタートでは、ポリシー割り当てを作成し、マネージド ディスクを使用しない監査 VM (06a78e20-9358-41c9-923c-fb736d382a4d) 定義を割り当てます。 このポリシー定義では、ポリシー定義で設定されている条件に準拠していないリソースが識別されます。

まず、Terraform の構成、変数、および出力ファイルを作成します。 Azure Policy 用の Terraform リソースでは、Azure プロバイダーを使用します。

  1. policy-assignment という名前の新しいフォルダーを作成し、ここにディレクトリを変更します。

  2. 次のコードを使用して main.tf を作成します。

    注意

    管理グループでポリシー割り当てを作成するには、azurerm_management_group_policy_assignment リソースを使用し、リソース グループには azurerm_resource_group_policy_assignment を使用し、サブスクリプションには azurerm_subscription_policy_assignment リソースを使用します。

      provider "azurerm" {
        features {}
      }
    
      terraform {
      required_providers {
          azurerm = {
              source = "hashicorp/azurerm"
              version = ">= 2.96.0"
          }
      }
      }
    
      resource "azurerm_subscription_policy_assignment" "auditvms" {
      name = "audit-vm-manageddisks"
      subscription_id = var.cust_scope
      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"
      }
    
  3. 次のコードを使用して variables.tf を作成します。

    variable "cust_scope" {
        default = "{scope}"
    }
    

    スコープによって、ポリシー割り当てを強制するリソースまたはリソースのグループが決まります。 スコープには、管理グループから個々のリソースまで指定できます。 宣言されたリソースに基づいて、{scope} を次のいずれかのパターンに置き換えてください。

    • サブスクリプション: /subscriptions/{subscriptionId}
    • リソース グループ: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • リソース: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]
  4. 次のコードを使用して output.tf を作成します。

    output "assignment_id" {
        value = azurerm_subscription_policy_assignment.auditvms.id
    }
    

Terraform を初期化してプランを作成する

次に、Terraform を初期化して、必要なプロバイダーをダウンロードしてから、プランを作成します。

  1. terraform init コマンドを実行します。 このコマンドによって、Terraform 構成で Azure リソースを作成するために必要な Azure モジュールがダウンロードされます。

    terraform init
    

    terraform init コマンドの実行を示すスクリーンショット。azurerm モジュールのダウンロードと成功メッセージが表示されています。

  2. Azure CLI で Terraform に対して認証します。 詳細については、「Azure プロバイダー: Azure CLI を使用した認証」を参照してください。

    az login
    
  3. terraform plan コマンドと out パラメーターを使用して実行プランを作成します。

    terraform plan -out assignment.tfplan
    

    terraform plan コマンドと out パラメーターの実行を示すスクリーンショット。作成される Azure リソースが表示されています。

    注意

    実行プランの永続化とセキュリティの詳細については、「Terraform Plan: セキュリティ警告」を参照してください。

Terraform 実行プランを適用する

最後に、実行プランを適用します。

terraform apply コマンドを実行し、作成済みの assignment.tfplan を指定します。

terraform apply assignment.tfplan

terraform apply コマンドの実行を示すスクリーンショット。結果として作成されるリソースが表示されています。

"Apply complete! (適用が完了しました。) Resources: 1 added, 0 changed, 0 destroyed. (リソース: 1 つ追加され、0 が変更され、0 が破棄されました。)" というメッセージが表示され、ポリシーの割り当てが作成されます。 outputs.tf ファイルを定義したため、assignment_id も返されます。

準拠していないリソースを特定する

この新しい割り当てに準拠していないリソースを表示するには、terraform apply によって返される assignment_id を使用します。 これを指定して次のコマンドを実行し、非準拠リソースのリソース ID を取得します。ID は JSON ファイルに出力されます。

armclient post "/subscriptions/<subscriptionID>/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>

次のような結果が返されます。

{
    "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
    "@odata.count": 3,
    "value": [{
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachineId>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine2Id>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionName>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine3ID>"
        }

    ]
}

この結果は、普段 Azure Portal ビューの [準拠していないリソース] に一覧表示される内容に相当します。

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

作成された割り当てを削除するには、Azure CLI を使用するか、terraform destroy を使用して Terraform 実行プランを元に戻します。

  • Azure CLI

    az policy assignment delete --name 'audit-vm-manageddisks' --scope '/subscriptions/<subscriptionID>/<resourceGroupName>'
    
  • Terraform

    terraform destroy
    

次のステップ

このクイックスタートでは、ポリシー定義を割り当てて、Azure 環境内で準拠していないリソースを特定しました。

新しいリソースが準拠していることを検証するためのポリシーの割り当てについて詳しく学習するには、次のチュートリアルに進んでください。