共用方式為


使用 ARM 範本來部署雲端服務 (延伸支援)

本文說明如何使用 Azure Resource Manager 範本 (ARM 範本) 來建立 Azure 雲端服務 (延伸支援) 部署。

必要條件

使用 ARM 範本建立部署的必要條件是完成下列步驟。

  1. 檢閱雲端服務 (延伸支援) 的部署必要條件,並建立必要資源。

  2. 使用 Azure 入口網站Azure PowerShell 來建立新的資源群組。 如果您使用現有的資源群組,則這是選用步驟。

  3. 使用 Azure 入口網站Azure PowerShell 來建立新的儲存體帳戶。 如果您使用現有的儲存體帳戶,則這是選用步驟。

  4. 使用 Azure 入口網站Azure PowerShell 以將套件 (.cspkg 或 .zip) 檔案和組態 (.cscfg) 檔案上傳至儲存體帳戶。 儲存這兩個檔案的共用存取簽章 (SAS) URI,以在稍後的步驟中新增至 ARM 範本。

  5. (選用) 建立金鑰保存庫,並上傳憑證。

    • 您可以將憑證連結至您的部署,以便與服務進行安全通訊。 如果您使用憑證,則必須在組態 (.cscfg) 檔案中指定憑證指紋,並將其上傳至金鑰保存庫。 您可以使用 Azure 入口網站Azure PowerShell 來建立金鑰保存庫。
    • 相關聯的金鑰保存庫必須位於與雲端服務 (延伸支援) 部署相同的區域和訂用帳戶中。
    • 相關聯金鑰保存庫必須具有相關權限,讓雲端服務 (延伸支援) 資源可以從金鑰保存庫擷取憑證。 如需詳細資訊,請參閱使用憑證搭配雲端服務 (延伸支援)
    • 金鑰保存庫必須在 ARM 範本的 osProfile 區段中參考,如稍後的步驟所示。

部署雲端服務 (延伸支援)

若要使用範本來部署雲端服務 (延伸支援):

注意

使用 Azure 入口網站是產生 ARM 範本和參數檔案的更簡單且更快速的方法。 您可以在入口網站下載產生的 ARM 範本,以透過 Azure PowerShell 來建立雲端服務 (延伸支援)。

  1. 建立虛擬網路。 虛擬網路的名稱必須符合組態 (.cscfg) 檔案中的虛擬網路參考。 如果您使用現有的虛擬網路,則請省略 ARM 範本中的此區段。

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/virtualNetworks", 
          "name": "[parameters('vnetName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "addressSpace": { 
              "addressPrefixes": [ 
                "10.0.0.0/16" 
              ] 
            }, 
            "subnets": [ 
              { 
                "name": "WebTier", 
                "properties": { 
                  "addressPrefix": "10.0.0.0/24" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    如果您建立新的虛擬網路,請將下列幾行新增至 dependsOn 區段,以確保平台會在建立雲端服務 (延伸支援) 執行個體之前建立虛擬網路:

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. 建立公用 IP 位址 (選擇性),並設定公用 IP 位址的 DNS 標籤屬性。 如果您使用靜態 IP 位址,則必須在組態 (.cscfg) 檔案中將其參考為保留 IP 位址。 如果您使用現有的 IP 位址,則請略過此步驟,並將 IP 位址資訊直接新增至 ARM 範本的負載平衡器組態設定。

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/publicIPAddresses", 
          "name": "[parameters('publicIPName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "publicIPAllocationMethod": "Dynamic", 
            "idleTimeoutInMinutes": 10, 
            "publicIPAddressVersion": "IPv4", 
            "dnsSettings": { 
              "domainNameLabel": "[variables('dnsName')]" 
            } 
          }, 
          "sku": { 
            "name": "Basic" 
          } 
        } 
    ] 
    

    如果您建立新的 IP 位址,請將下列幾行新增至 dependsOn 區段,以確保平台會在建立雲端服務 (延伸支援) 執行個體之前建立 IP 位址:

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. 建立雲端服務 (延伸支援) 物件。 如果您部署範本中的虛擬網路或公用 IP 位址,請新增相關的 dependsOn 參考。

    {
      "apiVersion": "2021-03-01",
      "type": "Microsoft.Compute/cloudServices",
      "name": "[variables('cloudServiceName')]",
      "location": "[parameters('location')]",
      "tags": {
        "DeploymentLabel": "[parameters('deploymentLabel')]",
        "DeployFromVisualStudio": "true"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
        "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
      ],
      "properties": {
        "packageUrl": "[parameters('packageSasUri')]",
        "configurationUrl": "[parameters('configurationSasUri')]",
        "upgradeMode": "[parameters('upgradeMode')]"
      }
    }
    
  4. 為您的部署建立網路設定檔物件,並將公用 IP 位址與負載平衡器前端產生關聯。 Azure 平台會自動建立負載平衡器。

    "networkProfile": { 
        "loadBalancerConfigurations": [ 
          { 
            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]", 
            "name": "[variables('lbName')]", 
            "properties": { 
              "frontendIPConfigurations": [ 
                { 
                  "name": "[variables('lbFEName')]", 
                  "properties": { 
                    "publicIPAddress": { 
                      "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
                    } 
                  } 
                } 
              ] 
            } 
          } 
        ] 
      } 
    
  5. 在 ARM 範本的 osProfile 區段中,新增金鑰保存庫參考。 金鑰保存庫會儲存與雲端服務 (延伸支援) 相關聯的憑證。 將憑證新增至金鑰保存庫,然後參考組態 (.cscfg) 檔案中的憑證指紋。 同時在 Azure 入口網站中為用於部署的 Azure 虛擬機器設定金鑰保存庫存取原則,讓雲端服務 (延伸支援) 資源可以擷取在金鑰保存庫中儲存為祕密的憑證。 金鑰保存庫必須位於與雲端服務 (延伸支援) 資源相同的區域和訂用帳戶,而且具有唯一名稱。 如需詳細資訊,請參閱使用憑證搭配雲端服務 (延伸支援)

    "osProfile": { 
          "secrets": [ 
            { 
              "sourceVault": { 
                "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}" 
              }, 
              "vaultCertificates": [ 
                { 
                  "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}" 
                } 
              ] 
            } 
          ] 
        } 
    

    注意

     ARM 範本中的 sourceVault 是您金鑰保存庫的資源識別碼值。 您可以在金鑰保存庫的 [屬性] 區段中尋找 [資源識別碼] 來取得此資訊。

    • 若要取得 certificateUrl 的值,請移至金鑰保存庫中標示為 [祕密識別碼] 的憑證。 
    • certificateUrl 的格式應為 https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}
  6. 建立角色設定檔。 請確定角色數目、每個角色中的執行個體數目、角色名稱以及角色大小,在 ARM 範本的組態 (.cscfg) 檔案、定義 (.csdef) 檔案與 roleProfile 區段上都相同。

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (選擇性) 建立延伸模組設定檔,以將延伸模組新增至雲端服務 (延伸支援) 部署。 下列範例會新增遠端桌面通訊協定 (RDP) 延伸模組和 Azure 診斷延伸模組。

    注意

    RDP 的密碼必須介於 8 到 123 個字元之間,且必須滿足以下至少「三個」密碼複雜度需求:

    包含大寫字元。
    包含小寫字元。
    包含數字。
    包含特殊字元。
    不能包含控制字元。

        "extensionProfile": {
          "extensions": [
            {
              "name": "RDPExtension",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Windows.Azure.Extensions",
                "type": "RDP",
                "typeHandlerVersion": "1.2.1",
                "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
              }
            },
            {
              "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Azure.Diagnostics",
                "type": "PaaSDiagnostics",
                "typeHandlerVersion": "1.5",
                "settings": "[parameters('wadPublicConfig_WebRole1')]",
                "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                "rolesAppliedTo": [
                  "WebRole1"
                ]
              }
            }
          ]
        }
    
  8. 檢閱完整範本:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "cloudServiceName": {
          "type": "string",
          "metadata": {
            "description": "Name of the cloud service"
          }
        },
        "location": {
          "type": "string",
          "metadata": {
            "description": "Location of the cloud service"
          }
        },
        "deploymentLabel": {
          "type": "string",
          "metadata": {
            "description": "Label of the deployment"
          }
        },
        "packageSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS URI of the package (.cspkg) file to deploy"
          }
        },
        "configurationSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS URI of the configuration (.cscfg) file"
          }
        },
        "roles": {
          "type": "array",
          "metadata": {
            "description": "Roles created in the cloud service application"
          }
        },
        "wadPublicConfig_WebRole1": {
          "type": "string",
          "metadata": {
             "description": "Public configuration of the Azure Diagnostics extension"
          }
        },
        "wadPrivateConfig_WebRole1": {
          "type": "securestring",
          "metadata": {
            "description": "Private configuration of the Azure Diagnostics extension"
          }
        },
        "vnetName": {
          "type": "string",
          "defaultValue": "[concat(parameters('cloudServiceName'), 'VNet')]",
          "metadata": {
            "description": "Name of virtual network"
          }
        },
        "publicIPName": {
          "type": "string",
          "defaultValue": "contosocsIP",
          "metadata": {
            "description": "Name of public IP address"
          }
        },
        "upgradeMode": {
          "type": "string",
          "defaultValue": "Auto",
          "metadata": {
            "UpgradeMode": "UpgradeMode of the CloudService"
          }
        }
      },
      "variables": {
        "cloudServiceName": "[parameters('cloudServiceName')]",
        "subscriptionID": "[subscription().subscriptionId]",
        "dnsName": "[variables('cloudServiceName')]",
        "lbName": "[concat(variables('cloudServiceName'), 'LB')]",
        "lbFEName": "[concat(variables('cloudServiceName'), 'LBFE')]",
        "resourcePrefix": "[concat('/subscriptions/', variables('subscriptionID'), '/resourceGroups/', resourceGroup().name, '/providers/')]"
      },
      "resources": [
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/virtualNetworks",
          "name": "[parameters('vnetName')]",
          "location": "[parameters('location')]",
          "properties": {
            "addressSpace": {
              "addressPrefixes": [
                "10.0.0.0/16"
              ]
            },
            "subnets": [
              {
                "name": "WebTier",
                "properties": {
                  "addressPrefix": "10.0.0.0/24"
                }
              }
            ]
          }
        },
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/publicIPAddresses",
          "name": "[parameters('publicIPName')]",
          "location": "[parameters('location')]",
          "properties": {
            "publicIPAllocationMethod": "Dynamic",
            "idleTimeoutInMinutes": 10,
            "publicIPAddressVersion": "IPv4",
            "dnsSettings": {
              "domainNameLabel": "[variables('dnsName')]"
            }
          },
          "sku": {
            "name": "Basic"
          }
        },
        {
          "apiVersion": "2021-03-01",
          "type": "Microsoft.Compute/cloudServices",
          "name": "[variables('cloudServiceName')]",
          "location": "[parameters('location')]",
          "tags": {
            "DeploymentLabel": "[parameters('deploymentLabel')]",
            "DeployFromVisualStudio": "true"
          },
          "dependsOn": [
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
          ],
          "properties": {
            "packageUrl": "[parameters('packageSasUri')]",
            "configurationUrl": "[parameters('configurationSasUri')]",
            "upgradeMode": "[parameters('upgradeMode')]",
            "roleProfile": {
              "roles": [
                {
                  "name": "WebRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                },
                {
                  "name": "WorkerRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                }
              ]
            },
            "networkProfile": {
              "loadBalancerConfigurations": [
                {
                  "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]",
                  "name": "[variables('lbName')]",
                  "properties": {
                    "frontendIPConfigurations": [
                      {
                        "name": "[variables('lbFEName')]",
                        "properties": {
                          "publicIPAddress": {
                            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
                          }
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "osProfile": {
              "secrets": [
                {
                  "sourceVault": {
                    "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}"
                  },
                  "vaultCertificates": [
                    {
                      "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}"
                    }
                  ]
                }
              ]
            },
            "extensionProfile": {
              "extensions": [
                {
                  "name": "RDPExtension",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Windows.Azure.Extensions",
                    "type": "RDP",
                    "typeHandlerVersion": "1.2.1",
                    "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                    "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
                  }
                },
                {
                  "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Azure.Diagnostics",
                    "type": "PaaSDiagnostics",
                    "typeHandlerVersion": "1.5",
                    "settings": "[parameters('wadPublicConfig_WebRole1')]",
                    "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                    "rolesAppliedTo": [
                      "WebRole1"
                  ]
                }
              }
            ]
          }
        }
       }
      ]
    }
    
  9. 若要建立雲端服務 (延伸支援) 部署,請部署範本和參數檔案 (以在範本檔案中定義參數)。 您可以使用這些範例範本

    New-AzResourceGroupDeployment -ResourceGroupName "ContosOrg" -TemplateFile "file path to your template file" -TemplateParameterFile "file path to your parameter file"