使用 ARM 範本和 Azure Resource Manager REST API 部署資源

此文章說明如何使用 Azure Resource Manager REST API 與 Azure Resource Manager 範本 (ARM 範本),將您的資源部署至 Azure。

您可以在要求本文中納入範本,也可以連結至檔案。 使用檔案時,該檔案可以是本機檔案,也可以是透過 URI 所取得的外部檔案。 當範本位於儲存體帳戶中時,您可以限制範本的存取權,並在部署期間提供共用存取簽章 (SAS) 權杖。

所需的權限

若要部署 Bicep 檔案或 ARM 範本,您需要對即將進行部署的資源具備寫入存取權,並可存取 Microsoft.Resources/部署資源類型上的所有作業。 例如,若要部署虛擬機器,您需要 Microsoft.Compute/virtualMachines/writeMicrosoft.Resources/deployments/* 權限。 假設狀況作業具有相同的權限需求。

如需角色與權限的清單,請參閱 Azure 內建角色

部署範圍

您可以將部署的目標設為資源群組、Azure 訂用帳戶、管理群組或租用戶。 視部署的範圍而定,您可以使用不同的命令。

  • 若要部署至資源群組,請使用 [部署 - 建立]。 要求會傳送至:

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    
  • 若要部署至訂用帳戶,請使用 [部署 - 在訂用帳戶範圍建立]。 要求會傳送至:

    PUT https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    

    如需訂用帳戶層級部署的詳細資訊,請參閱在訂用帳戶層級建立資源群組和資源

  • 若要部署到管理群組,請使用 [部署 - 在管理群組範圍建立]。 要求會傳送至:

    PUT https://management.azure.com/providers/Microsoft.Management/managementGroups/{groupId}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    

    如需管理群組層級部署的詳細資訊,請參閱在管理群組層級建立資源

  • 若要部署至租用戶,請使用 [部署 - 在租用戶範圍建立或更新]。 要求會傳送至:

    PUT https://management.azure.com/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    

    如需租用戶層級部署的詳細資訊,請參閱在租用戶層級建立資源

本文中的範例會使用資源群組部署。

使用 REST API 部署

  1. 設定一般參數和標頭 (包括驗證權杖)。

  2. 如果您要部署到不存在的資源群組,請先建立資源群組。 提供您的訂用帳戶識別碼、新資源群組的名稱,以及需要解決方案的位置。 如需詳細資訊,請參閱建立資源群組

    PUT https://management.azure.com/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>?api-version=2020-06-01
    

    使用如下的要求本文:

    {
     "location": "West US",
     "tags": {
       "tagname1": "tagvalue1"
     }
    }
    
  3. 在部署範本之前,您可以預覽範本將對您的環境進行的變更。 使用假設狀況作業來驗證範本是否會如預期進行變更。 假設狀況也能驗證範本是否有錯誤。

  4. 若要部署範本,請在要求 URI 中提供您的訂用帳戶識別碼、資源群組的名稱、部署的名稱。

    PUT https://management.azure.com/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>/providers/Microsoft.Resources/deployments/<YourDeploymentName>?api-version=2020-10-01
    

    在要求本文中,提供您的範本和參數檔案的連結。 如需參數檔案的詳細資訊,請參閱建立 Resource Manager 參數檔案

    請注意,mode 會設定為 Incremental。 若要執行完整部署,請將 mode 設定為 Complete。 使用完整模式時請務必謹慎,因為您可能會不小心刪除不在範本中的資源。

    {
     "properties": {
       "templateLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/template.json",
         "contentVersion": "1.0.0.0"
       },
       "parametersLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/parameters.json",
         "contentVersion": "1.0.0.0"
       },
       "mode": "Incremental"
     }
    }
    

    如果您想要記錄回應內容、要求內容或兩者,可在要求中包括 debugSetting

    {
     "properties": {
       "templateLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/template.json",
         "contentVersion": "1.0.0.0"
       },
       "parametersLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/parameters.json",
         "contentVersion": "1.0.0.0"
       },
       "mode": "Incremental",
       "debugSetting": {
         "detailLevel": "requestContent, responseContent"
       }
     }
    }
    

    您可以設定儲存體帳戶以使用共用存取簽章 (SAS) Token。 如需詳細資訊,請參閱使用共用存取簽章委派存取

    如果您需要提供參數機密的值 (例如密碼),請將該值加入金鑰保存庫。 在部署期間擷取金鑰保存庫,如先前範例所示。 如需詳細資訊,請參閱在部署期間使用 Azure Key Vault 以傳遞安全的參數值

  5. 不要連結至含有範本和參數的檔案,而是將它們納入要求本文中。 下列範例顯示內嵌範本和參數的要求本文:

    {
       "properties": {
       "mode": "Incremental",
       "template": {
         "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
         "contentVersion": "1.0.0.0",
         "parameters": {
           "storageAccountType": {
             "type": "string",
             "defaultValue": "Standard_LRS",
             "allowedValues": [
               "Standard_LRS",
               "Standard_GRS",
               "Standard_ZRS",
               "Premium_LRS"
             ],
             "metadata": {
               "description": "Storage Account type"
             }
           },
           "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
               "description": "Location for all resources."
             }
           }
         },
         "variables": {
           "storageAccountName": "[format('{0}standardsa', uniquestring(resourceGroup().id))]"
         },
         "resources": [
           {
             "type": "Microsoft.Storage/storageAccounts",
             "apiVersion": "2022-09-01",
             "name": "[variables('storageAccountName')]",
             "location": "[parameters('location')]",
             "sku": {
               "name": "[parameters('storageAccountType')]"
             },
             "kind": "StorageV2",
             "properties": {}
           }
         ],
         "outputs": {
           "storageAccountName": {
             "type": "string",
             "value": "[variables('storageAccountName')]"
           }
         }
       },
       "parameters": {
         "location": {
           "value": "eastus2"
         }
       }
     }
    }
    
  6. 若要取得範本部署的狀態,請使用 Deployments - Get

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    

使用 ARMClient 進行部署

ARMClient 是一個簡單的命令列工具,可叫用 Azure Resource Manager API。 若要安裝此工具,請參閱 ARMClient (英文)。

列出您的訂用帳戶:

armclient GET /subscriptions?api-version=2021-04-01

若要列出您的資源群組:

armclient GET /subscriptions/<subscription-id>/resourceGroups?api-version=2021-04-01

以您的 Azure 訂用帳戶識別碼取代 <subscription-id>

若要在美國中部區域中建立資源群組:

armclient PUT /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>?api-version=2021-04-01  "{location: 'central us', properties: {}}"

或者,您可以將主體放入名為 CreateRg.json 的 JSON 檔案:

{
  "location": "Central US",
  "properties": { }
}
armclient PUT /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>?api-version=2021-04-01 '@CreateRg.json'

如需詳細資訊,請參閱 ARMClient:適用於 Azure API 的命令列工具 (英文)。

部署名稱

您可以為部署命名,例如 ExampleDeployment

每次執行部署時,資源群組的部署歷程記錄便會新增一筆具有部署名稱的項目。 如果您執行另一個部署並提供相同名稱,則系統會將先前的項目取代為目前的部署。 如果您想在部署歷程記錄中維護唯一的項目,請為每個部署提供唯一的名稱。

若要建立唯一的名稱,您可以指派隨機數字。 或者,加入日期值。

如果您使用相同的部署名稱,同時對同一個資源群組執行部署,則只會完成最後一個部署。 具有相同名稱但尚未完成的任何部署,都會由最後一個部署所取代。 例如,如果您執行名為 newStorage 的部署來部署名為 storage1 的儲存體帳戶,且同時執行另一個名為 newStorage 的部署來部署名為 storage2 的儲存體帳戶,則您只會部署一個儲存體帳戶。 產生的儲存體帳戶名稱為 storage2

但是,如果您執行名為 newStorage 的部署來部署名為 storage1 的儲存體帳戶,並在其完成後立即執行另一個名為 newStorage 的部署來部署名為 storage2 的儲存體帳戶,則您會具有兩個儲存體帳戶。 一個名稱為 storage1,另一個名稱則為 storage2。 但是,您在部署歷程記錄中只會具有一個項目。

若您為每個部署指定唯一的名稱,便可以同時執行這些部署,而不會發生衝突。 如果您執行名為 newStorage1 的部署來部署名為 storage1 的儲存體帳戶,且同時執行另一個名為 newStorage2 的部署來部署名為 storage2 的儲存體帳戶,則您會具有兩個儲存體帳戶,且在部署歷程記錄中會具有兩個項目。

為了避免因同時部署而發生衝突,並確保部署歷程記錄中項目的唯一性,請為每個部署提供唯一的名稱。

下一步