クイックスタート: ARM テンプレートを使用して、準拠していないリソースを特定するためのポリシー割り当てを作成する
このクイックスタートでは、Azure Resource Manager テンプレート (ARM テンプレート) を使用して、リソースと Azure ポリシーのコンプライアンスを検証するポリシー割り当てを作成します。 ポリシーはリソース グループに割り当てられ、マネージド ディスクを使用しない仮想マシンは監査されます。 ポリシーの割り当てを作成後、準拠していない仮想マシンを特定します。
Azure Resource Manager テンプレートは JavaScript Object Notation (JSON) ファイルであり、プロジェクトのインフラストラクチャと構成が定義されています。 このテンプレートでは、宣言型の構文が使用されています。 デプロイしようとしているものを、デプロイを作成する一連のプログラミング コマンドを記述しなくても記述できます。
環境が前提条件を満たしていて、ARM テンプレートの使用に慣れている場合は、 [Azure へのデプロイ] ボタンを選択します。 テンプレートが Azure portal で開きます。
組み込みのポリシーまたはイニシアティブの定義を割り当てる場合、バージョンの参照は省略できます。 組み込み定義のポリシー割り当ては既定で最新バージョンになり、特に指定がない限り、マイナー バージョンの変更が自動的に継承されます。
前提条件
- Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Azure PowerShell または Azure CLI。
- Visual Studio Code と Azure Resource Manager (ARM) ツール。
Microsoft.PolicyInsights
が Azure サブスクリプションに登録されている必要があります。 リソース プロバイダーを登録するには、リソース プロバイダーを登録するためのアクセス許可が必要です。 このアクセス許可は、共同作成者ロールと所有者ロールに含まれます。- マネージド ディスクを使用しない仮想マシンが少なくとも 1 つ存在するリソース グループ。
テンプレートを確認する
ARM テンプレートでリソース グループ スコープのポリシー割り当てを作成し、組み込みのポリシー定義である [マネージド ディスクを使用していない VM の監査] を割り当てます。
次の ARM テンプレートを policy-assignment.json として作成します。
- Visual Studio Code を開き、[ファイル]>[新しいテキスト ファイル] の順に選択します。
- ARM テンプレートをコピーして Visual Studio Code に貼り付けます。
- [ファイル]>[保存] を選択し、ファイル名 policy-assignment.json を使用します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"policyAssignmentName": {
"type": "string",
"defaultValue": "audit-vm-managed-disks",
"metadata": {
"description": "Policy assignment name used in assignment's resource ID"
}
},
"policyDefinitionID": {
"type": "string",
"defaultValue": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
"metadata": {
"description": "Policy definition ID"
}
},
"policyDisplayName": {
"type": "string",
"defaultValue": "Audit VM managed disks",
"metadata": {
"description": "Display name for Azure portal"
}
}
},
"resources": [
{
"type": "Microsoft.Authorization/policyAssignments",
"apiVersion": "2023-04-01",
"name": "[parameters('policyAssignmentName')]",
"properties": {
"policyDefinitionId": "[parameters('policyDefinitionID')]",
"description": "Policy assignment to resource group scope created with ARM template",
"displayName": "[parameters('policyDisplayName')]",
"nonComplianceMessages": [
{
"message": "Virtual machines should use managed disks"
}
]
}
}
],
"outputs": {
"assignmentId": {
"type": "string",
"value": "[resourceId('Microsoft.Authorization/policyAssignments', parameters('policyAssignmentName'))]"
}
}
}
ARM テンプレートで定義されているリソースの種類は Microsoft.Authorization/policyAssignments です。
テンプレートでは、次の 3 つのパラメーターを使用してポリシー割り当てをデプロイします:
policyAssignmentName
は audit-vm-managed-disks という名前ポリシー割り当てを作成します。policyDefinitionID
は、組み込みのポリシー定義の ID を使用します。 参考までに、ID を取得するコマンドは、テンプレートをデプロイするためのセクションにあります。policyDisplayName
は、Azure portal に表示される表示名を作成します。
ARM テンプレート ファイルの詳細については、以下を参照してください:
- その他の ARM テンプレートサンプルを見つけるには、「コード サンプルの参照」に移動します。
- デプロイ用のテンプレート リファレンスの詳細については、Azure テンプレート リファレンスのページを参照してください。
- ARM テンプレートを開発する方法については、「ARM テンプレートのドキュメント」参照してください。
- サブスクリプション レベルのデプロイについては、「ARM テンプレートを使用したサブスクリプションのデプロイ」を参照してください。
ARM テンプレートをデプロイする
Azure PowerShell または Azure CLI を使用して ARM テンプレートをデプロイできます。
Visual Studio Code ターミナル セッションから Azure に接続します。 複数のサブスクリプションがある場合は、コマンドを実行してコンテキストをサブスクリプションに設定します。 <subscriptionID>
は、Azure サブスクリプション ID に置き換えてください。
Connect-AzAccount
# Run these commands if you have multiple subscriptions
Get-AzSubScription
Set-AzContext -Subscription <subscriptionID>
Microsoft.PolicyInsights
が登録されていることを確認できます。 そうでない場合は、コマンドを実行してリソース プロバイダーを登録できます。
Get-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights' |
Select-Object -Property ResourceTypes, RegistrationState
Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
詳しくは、Get-AzResourceProvider と Register-AzResourceProvider をご覧ください。.
次のコマンドは、policyDefinitionID
パラメーターの値を表示します:
(Get-AzPolicyDefinition |
Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }).ResourceId
次のコマンドでポリシー定義をリソース グループにデプロイします。 <resourceGroupName>
は実際のリソース グループ名に置き換えます。
$rg = Get-AzResourceGroup -Name '<resourceGroupName>'
$deployparms = @{
Name = 'PolicyDeployment'
ResourceGroupName = $rg.ResourceGroupName
TemplateFile = 'policy-assignment.json'
}
New-AzResourceGroupDeployment @deployparms
$rg
変数には、リソース グループのプロパティが格納されます。 $deployparms
変数はスプラッティングを使用してパラメータ値を作成し、読みやすさを改善します。 New-AzResourceGroupDeployment
コマンドは $deployparms
変数で定義されるパラメータ値を使用します。
Name
は、リソース グループのデプロイの出力と Azure に表示されるデプロイ名です。ResourceGroupName
で$rg.ResourceGroupName
プロパティを使用して、ポリシーが割り当てられているリソース グループの名前を取得します。TemplateFile
は、ローカル コンピューター上の ARM テンプレートの名前と場所を指定します。
次のコマンドを使用して、ポリシー割り当てのデプロイを確認できます。
このコマンドで $rg.ResourceId
プロパティを使用して、リソース グループの ID を取得します。
Get-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Name : audit-vm-managed-disks
ResourceId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
ResourceName : audit-vm-managed-disks
ResourceGroupName : {resourceGroupName}
ResourceType : Microsoft.Authorization/policyAssignments
SubscriptionId : {subscriptionId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
Properties : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyAssignmentProperties
詳細については、「Get-AzPolicyAssignment」を参照してください。
準拠していないリソースを特定する
ポリシーの割り当てがデプロイされると、リソース グループにデプロイされた仮想マシンがマネージド ディスク ポリシーに準拠しているかどうかが監査されます。
新しいポリシーの割り当ての準拠状態がアクティブになり、ポリシーの状態に関する結果を提供するまで、数分かかります。
$complianceparms = @{
ResourceGroupName = $rg.ResourceGroupName
PolicyAssignmentName = 'audit-vm-managed-disks'
Filter = 'IsCompliant eq false'
}
Get-AzPolicyState @complianceparms
$complianceparms
変数では、Get-AzPolicyState
コマンドで使用するパラメーター値を作成します。
ResourceGroupName
は$rg.ResourceGroupName
プロパティからリソース グループ名を取得します。PolicyAssignmentName
は、ポリシーの割り当ての作成時に使用される名前を指定します。Filter
は式を使用して、ポリシーの割り当てに準拠していないリソースを見つけます。
次のような結果が返され、ComplianceState
が NonCompliant
を示しています。
Timestamp : 2/26/2024 19:02:56
ResourceId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks
PolicyDefinitionId : /providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d
IsCompliant : False
SubscriptionId : {subscriptionId}
ResourceType : Microsoft.Compute/virtualMachines
ResourceLocation : {location}
ResourceGroup : {resourceGroupName}
ResourceTags : tbd
PolicyAssignmentName : audit-vm-managed-disks
PolicyAssignmentOwner : tbd
PolicyAssignmentScope : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}
PolicyDefinitionName : 06a78e20-9358-41c9-923c-fb736d382a4d
PolicyDefinitionAction : audit
PolicyDefinitionCategory : tbd
ManagementGroupIds : {managementGroupId}
ComplianceState : NonCompliant
AdditionalProperties : {[complianceReasonCode, ]}
詳細については、「Get-AzPolicyState」を参照してください。
リソースをクリーンアップする
Remove-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Azure PowerShell セッションからサインアウトするには:
Disconnect-AzAccount
次のステップ
このクイックスタートでは、ポリシー定義を割り当てて、Azure 環境内で準拠していないリソースを特定しました。
リソースのコンプライアンスを検証するポリシーの割り当て方法について詳しく学習するには、チュートリアルに進んでください。