クイック スタート:REST API を使用して準拠していないリソースを特定するためのポリシー割り当てを作成する

Azure のコンプライアンスを理解する第一歩は、リソースの状態を特定することです。 このクイックスタートでは、REST API を使って、準拠していないリソースを特定するためのポリシーの割り当てを作成します。 ポリシーはリソース グループに割り当てられ、マネージド ディスクを使用しない仮想マシンは監査されます。 ポリシーの割り当てを作成後、準拠していない仮想マシンを特定します。

このガイドでは、REST API を使用してポリシー割り当てを作成し、Azure 環境内の準拠していないリソースを特定します。 この記事の例では、PowerShell と Azure CLI az rest コマンドを使用します。 Git Bash などの Bash シェルから az rest コマンドを実行することもできます。

前提条件

  • Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • 最新バージョンの PowerShell または Git Bash などの Bash シェル。
  • Azure CLI の最新バージョン。
  • Visual Studio Code
  • マネージド ディスクを使用しない仮想マシンが少なくとも 1 つ存在するリソース グループ。

REST API 構文の確認

REST API コマンドを実行するには、REST API URI と要求本文の 2 つの要素があります。 詳細については、「ポリシーの割り当て - 作成」を参照してください。

次の例は、ポリシー定義を作成するための REST API URI 構文を示しています。

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/policyAssignments/{policyAssignmentName}?api-version=2023-04-01
  • scope: スコープによって、ポリシーの割り当てを適用するリソースまたはリソース グループが決まります。 スコープには、管理グループから個々のリソースまで指定できます。 {scope} は、次のパターンのうちのいずれかに置き換えます:
    • 管理グループ: /providers/Microsoft.Management/managementGroups/{managementGroup}
    • サブスクリプション: /subscriptions/{subscriptionId}
    • リソース グループ: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • リソース: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]{resourceType}/{resourceName}
  • policyAssignmentName: 割り当てのポリシーの割り当て名を作成します。 名前は、ポリシーの割り当ての policyAssignmentId プロパティに含まれます。

次の例は、要求本文ファイルを作成する JSON です。

{
  "properties": {
    "displayName": "",
    "description": "",
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/11111111-1111-1111-1111-111111111111",
    "nonComplianceMessages": [
      {
        "message": ""
      }
    ]
  }
}
  • displayName: ポリシーの割り当て用の表示名です。
  • description: ポリシーの割り当てに関するコンテキストの追加に使用できます。
  • policyDefinitionId: 割り当てを作成するポリシー定義の ID です。
  • nonComplianceMessages: リソースが非準拠として評価されたときに使用するメッセージを設定します。 詳細については、割り当てのコンプライアンス違反メッセージに関するセクションを参照してください。

Azure に接続する

Visual Studio Code ターミナル セッションから Azure に接続します。 複数のサブスクリプションがある場合は、コマンドを実行してコンテキストをサブスクリプションに設定します。 <subscriptionID> は、Azure サブスクリプション ID に置き換えてください。

az login

# Run these commands if you have multiple subscriptions
az account list --output table
az account set --subscription <subscriptionID>

これらの例では Azure CLI az rest コマンドを使用しているので、PowerShell を使っていたとしても az login を使用します。

ポリシー割り当てを作成する

この例では、ポリシーの割り当てを作成し、マネージド ディスクを使用しない監査 VM 定義を割り当てます。

割り当てを作成するには、要求本文が必要です。 次の JSON を request-body.json という名前のファイルに保存します。

{
  "properties": {
    "displayName": "Audit VM managed disks",
    "description": "Policy assignment to resource group scope created with REST API",
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
    "nonComplianceMessages": [
      {
        "message": "Virtual machines should use managed disks"
      }
    ]
  }
}

既存のリソース グループ スコープでポリシーの割り当てを作成するには、要求本文のファイルで次の REST API URI を使用します。 {subscriptionId}{resourceGroupName} を独自の値に置き換えます。 このコマンドにより、シェルに JSON 出力が表示されます。

az rest --method put --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01 --body `@request-body.json

PowerShell では、ファイル名を指定するために at sign (@) をエスケープするのにバッククォート (`) が必要です。 Git Bash のような Bash シェルでは、バッククォートを省略します。

詳細については、「ポリシーの割り当て - 作成」を参照してください。

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

新しいポリシーの割り当ての準拠状態がアクティブになり、ポリシーの状態に関する結果を提供するまで、数分かかります。 REST API を使用して、このポリシーの割り当ての準拠していないリソースを表示し、出力は JSON に含まれます。

準拠していないリソースを特定するには、次のコマンドを実行します。 {subscriptionId}{resourceGroupName} をポリシーの割り当てを作成したときに使用した値に置き換えます。

az rest --method post --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01 --uri-parameters `$filter="complianceState eq 'NonCompliant' and PolicyAssignmentName eq 'audit-vm-managed-disks'"

filter は、ポリシーの割り当てで作成した audit-vm-managed-disks という名前のポリシー定義に準拠していないと評価されたリソースに対してクエリを実行します。 ここでも、バッククォートがフィルター内のドル記号 ($) をエスケープするために使用されていることに注意してください。 Bash クライアントの場合、円記号 (\) は一般的なエスケープ文字です。

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

{
  "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
  "@odata.count": 1,
  "@odata.nextLink": null,
  "value": [
    {
      "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "@odata.id": null,
      "complianceReasonCode": "",
      "complianceState": "NonCompliant",
      "effectiveParameters": "",
      "isCompliant": false,
      "managementGroupIds": "",
      "policyAssignmentId": "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks",
      "policyAssignmentName": "audit-vm-managed-disks",
      "policyAssignmentOwner": "tbd",
      "policyAssignmentParameters": "",
      "policyAssignmentScope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}",
      "policyAssignmentVersion": "",
      "policyDefinitionAction": "audit",
      "policyDefinitionCategory": "tbd",
      "policyDefinitionGroupNames": [
        ""
      ],
      "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "policyDefinitionName": "06a78e20-9358-41c9-923c-fb736d382a4d",
      "policyDefinitionReferenceId": "",
      "policyDefinitionVersion": "1.0.0",
      "policySetDefinitionCategory": "",
      "policySetDefinitionId": "",
      "policySetDefinitionName": "",
      "policySetDefinitionOwner": "",
      "policySetDefinitionParameters": "",
      "policySetDefinitionVersion": "",
      "resourceGroup": "{resourceGroupName}",
      "resourceId": "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmName}>",
      "resourceLocation": "westus3",
      "resourceTags": "tbd",
      "resourceType": "Microsoft.Compute/virtualMachines",
      "subscriptionId": "{subscriptionId}",
      "timestamp": "2024-03-26T02:19:28.3720191Z"
    }
  ]
}

詳細については、「ポリシーの状態 - リソース グループのクエリ結果の一覧表示」を参照してください。

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

ポリシーの割り当てを削除するには、次のコマンドを使用します。 {subscriptionId}{resourceGroupName} をポリシーの割り当てを作成したときに使用した値に置き換えます。 このコマンドにより、シェルに JSON 出力が表示されます。

az rest --method delete --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01

次のコマンドを使用して、ポリシーの割り当てが削除されたことを確認できます。 シェルにメッセージが表示されます。

az rest --method get --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01
The policy assignment 'audit-vm-managed-disks' is not found.

詳細については、「ポリシーの割り当て - 削除」と「ポリシーの割り当て - 取得」を参照してください。

次のステップ

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

リソースのコンプライアンスを検証するポリシーの割り当て方法について詳しく学習するには、チュートリアルに進んでください。