Penyebaran grup sumber daya dengan templat ARM

Saat organisasi Anda matang, Anda dapat menyebarkan templat Azure Resource Manager (templat ARM) untuk membuat sumber daya di tingkat grup manajemen. Misalnya, Anda mungkin perlu menentukan dan menetapkan kebijakan atau kontrol akses berbasis peran Azure (Azure RBAC) untuk grup manajemen. Dengan templat tingkat grup manajemen, Anda dapat menerapkan kebijakan secara deklaratif dan menetapkan peran di tingkat grup manajemen.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari lebih lanjut, lihat penyebaran grup manajemen.

Sumber daya yang didukung

Tidak semua jenis sumber daya dapat disebarkan ke tingkat grup manajemen. Bagian ini mencantumkan jenis sumber daya mana yang didukung.

Untuk Azure Blueprints, gunakan:

Untuk Azure Policy, gunakan:

Untuk kontrol akses, gunakan:

Untuk templat bersarang yang disebarkan ke langganan, langganan, atau grup sumber daya, gunakan:

Untuk mengelola sumber daya Anda, gunakan:

Grup manajemen adalah sumber daya tingkat penyewa. Namun, Anda dapat membuat grup manajemen dalam penyebaran grup manajemen dengan menetapkan lingkup grup manajemen baru ke penyewa. Lihat Grup manajemen.

Skema

Skema yang Anda gunakan untuk penyebaran tingkat langganan berbeda dengan skema untuk penyebaran grup sumber daya.

Untuk templat, gunakan:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  ...
}

Skema untuk file parameter sama untuk semua cakupan penyebaran. Untuk file parameter, gunakan:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  ...
}

Perintah penyebaran

Untuk menyebarkan ke grup manajemen, gunakan perintah penyebaran grup manajemen.

Untuk Azure CLI, gunakan az deployment mg create:

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

Untuk informasi selengkapnya tentang perintah penyebaran dan opsi untuk menyebarkan templat ARM, lihat:

Lokasi dan nama penyebaran

Untuk penyebaran tingkat penyewa, Anda harus menyediakan lokasi untuk penyebaran. Lokasi penyebaran terpisah dari lokasi sumber daya yang Anda sebarkan. Lokasi penyebaran menentukan tempat menyimpan data penyebaran. Penyebaran langganan dan penyewa juga memerlukan lokasi. Untuk penyebaran grup sumber daya, lokasi grup sumber daya digunakan untuk menyimpan data penyebaran.

Anda dapat memberikan nama untuk penyebaran atau menggunakan nama penyebaran default. Nama default adalah nama file templat. Misalnya, menyebarkan templat bernama azuredeploy.json akan membuat nama penyebaran azuredeploy secara default.

Untuk setiap nama penyebaran, lokasi tidak dapat diubah. Anda tidak dapat membuat penyebaran di satu lokasi saat ada penyebaran yang ada dengan nama yang sama di lokasi lain. Misalnya, jika Anda membuat penyebaran penyewa dengan nama deployment1 di centralus, Anda nantinya tidak dapat membuat penyebaran lain dengan nama deployment1 tetapi lokasinya di westus. Jika Anda mendapatkan kode kesalahan InvalidDeploymentLocation, gunakan nama yang berbeda atau lokasi yang sama dengan penyebaran sebelumnya untuk nama tersebut.

Cakupan penyebaran

Saat menyebarkan ke grup manajemen, Anda bisa menggunakan menyebarkan sumber daya untuk:

  • grup manajemen target dari operasi
  • grup manajemen lain dalam penyewa
  • langganan dalam grup manajemen
  • grup sumber daya dalam grup manajemen
  • penyewa untuk grup sumber daya

Sumber daya ekstensi dapat dicakup ke target yang berbeda dari target penyebaran.

Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Bagian ini memperlihatkan cara menentukan cakupan yang berbeda. Anda dapat menggabungkan cakupan yang berbeda ini dalam templat tunggal.

Cakupan ke grup manajemen target

Sumber daya yang ditentukan dalam bagian sumber daya templat diterapkan ke grup manajemen dari perintah penyebaran.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    management-group-resources-default
  ],
  "outputs": {}
}

Cakupan ke grup manajemen lainnya

Untuk menargetkan grup manajemen lain, tambahkan penyebaran bersarang dan tentukan properti scope. Atur properti scope ke nilai dalam format Microsoft.Management/managementGroups/<mg-name>.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string"
    }
  },
  "variables": {
    "mgId": "[format('Microsoft.Management/managementGroups/{0}', parameters('mgName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources-non-default
        }
      }
    }
  ],
  "outputs": {}
}

Cakupan ke langganan

Anda juga dapat menargetkan langganan dalam grup manajemen. Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Untuk menargetkan langganan dalam grup manajemen, tambahkan penyebaran bersarang dan properti subscriptionId.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedSub",
      "location": "westus2",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              subscription-resources
            }
          ]
        }
      }
    }
  ]
}

Cakupan ke grup sumber daya

Anda juga dapat menargetkan grup sumber daya dalam penyewa. Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Untuk menargetkan grup sumber daya dalam penyewa, gunakan penyebaran bersarang. Atur properti subscriptionId dan resourceGroup. Jangan atur lokasi untuk penyebaran bersarang karena penyebaran dilakukan di lokasi grup sumber daya.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedRGDeploy",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              resource-group-resources
            }
          ]
        }
      }
    }
  ]
}

Untuk menggunakan penyebaran grup manajemen untuk membuat grup sumber daya dalam langganan dan menggunakan akun penyimpanan ke grup sumber daya tersebut, lihat Menyebarkan ke grup langganan dan sumber daya.

Cakupan ke penyewa

Untuk membuat sumber daya di penyewa, atur scope ke /. Pengguna yang menyebarkan templat harus memiliki akses yang diperlukan untuk disebarkan di penyewa.

Untuk menggunakan penyebaran berlapis, atur scope dan location.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "scope": "/",
      "properties": {
        "mode": "Incremental",
        "template": {
          tenant-resources
        }
      }
    }
  ],
  "outputs": {}
}

Atau, Anda dapat mengatur cakupan ke / untuk beberapa jenis sumber daya, seperti grup manajemen. Membuat grup manajemen baru dijelaskan di bagian berikutnya.

Grup manajemen

Untuk membuat grup manajemen dalam penyebaran grup manajemen, Anda harus mengatur cakupan / untuk grup manajemen.

Contoh berikut membuat grup manajemen baru di grup manajemen root.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('mgName')]",
      "scope": "/",
      "location": "eastus",
      "properties": {}
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Contoh berikutnya membuat grup manajemen baru di grup manajemen yang ditentukan sebagai induk. Perhatikan bahwa ruang lingkup diatur ke /.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    },
    "parentMG": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[parameters('mgName')]",
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "scope": "/",
      "location": "eastus",
      "properties": {
        "details": {
          "parent": {
            "id": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('parentMG'))]"
          }
        }
      }
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Langganan

Untuk menggunakan templat ARM untuk membuat langganan Azure baru di grup manajemen, lihat:

Untuk menyebarkan templat yang memindahkan langganan Azure yang sudah ada ke grup manajemen baru, lihat Memindahkan langganan di templat ARM

Kebijakan Azure

Definisi kebijakan kustom yang disebarkan ke grup manajemen adalah ekstensi dari grup manajemen. Untuk mendapatkan ID definisi kebijakan kustom, gunakan fungsi extensionResourceId(). Definisi kebijakan bawaan adalah sumber daya tingkat penyewa. Untuk mendapatkan ID definisi kebijakan kustom, gunakan fungsi tenantResourceId().

Contoh berikut menunjukkan cara menentukan kebijakan di tingkat grup manajemen, dan menetapkannya.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "targetMG": {
      "type": "string",
      "metadata": {
        "description": "Target Management Group"
      }
    },
    "allowedLocations": {
      "type": "array",
      "defaultValue": [
        "australiaeast",
        "australiasoutheast",
        "australiacentral"
      ],
      "metadata": {
        "description": "An array of the allowed locations, all other locations will be denied by the created policy."
      }
    }
  },
  "variables": {
    "mgScope": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('targetMG'))]",
    "policyDefinition": "LocationRestriction"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "name": "[variables('policyDefinition')]",
      "apiVersion": "2020-09-01",
      "properties": {
        "policyType": "Custom",
        "mode": "All",
        "parameters": {
        },
        "policyRule": {
          "if": {
            "not": {
              "field": "location",
              "in": "[parameters('allowedLocations')]"
            }
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "name": "location-lock",
      "apiVersion": "2020-09-01",
      "dependsOn": [
        "[variables('policyDefinition')]"
      ],
      "properties": {
        "scope": "[variables('mgScope')]",
        "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinition'))]"
      }
    }
  ]
}

Menyebarkan ke langganan dan grup sumber daya

Dari penyebaran tingkat grup manajemen, Anda dapat menargetkan langganan dalam grup manajemen. Contoh berikut membuat grup sumber daya ke dalam langganan dan menyebarkan akun penyimpanan ke grup sumber daya.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "nestedsubId": {
      "type": "string"
    },
    "nestedRG": {
      "type": "string"
    },
    "storageAccountName": {
      "type": "string"
    },
    "nestedLocation": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedSub",
      "location": "[parameters('nestedLocation')]",
      "subscriptionId": "[parameters('nestedSubId')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
          },
          "variables": {
          },
          "resources": [
            {
              "type": "Microsoft.Resources/resourceGroups",
              "apiVersion": "2021-04-01",
              "name": "[parameters('nestedRG')]",
              "location": "[parameters('nestedLocation')]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedRG",
      "subscriptionId": "[parameters('nestedSubId')]",
      "resourceGroup": "[parameters('nestedRG')]",
      "dependsOn": [
        "nestedSub"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2021-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "[parameters('nestedLocation')]",
              "kind": "StorageV2",
              "sku": {
                "name": "Standard_LRS"
              }
            }
          ]
        }
      }
    }
  ]
}

Langkah berikutnya