Развертывание облачных служб (расширенная поддержка) с помощью шаблона ARM

Это важно

По состоянию на 31 марта 2025 г. облачные службы (классические) устарели и будут полностью прекращены 31 марта 2027 г. Узнайте больше об этом отказе и о том, как осуществить миграцию.

В этой статье показано, как использовать шаблон Azure Resource Manager (шаблон ARM) для создания развертывания Azure Cloud Services (расширенная поддержка).

Предварительные условия

Complete the following steps as prerequisites to creating your deployment by using ARM templates.

  1. Просмотрите предварительные требования развертывания для Облачные службы (расширенная поддержка) и создайте необходимые ресурсы.

  2. Создайте новую группу ресурсов с помощью портал Azure или Azure PowerShell. Этот шаг необязателен, если вы используете существующую группу ресурсов.

  3. Создайте новую учетную запись хранения с помощью портал Azure или Azure PowerShell. Этот шаг необязателен, если вы используете существующую учетную запись хранения.

  4. Отправьте файл пакета (CSPKG или .zip) и файл конфигурации (CSCFG) в учетную запись хранения с помощью портал Azure или Azure PowerShell. Сохраните URI с общей подписью доступа (SAS) для обоих файлов, чтобы добавить их в шаблон ARM в одном из следующих шагов.

  5. (Необязательно) Создайте хранилище ключей и передайте в него сертификаты.

    • You can attach certificates to your deployment for secure communication to and from the service. При использовании сертификатов отпечаток сертификата должен быть указан в файле конфигурации (CSCFG) и передаваться в хранилище ключей. Вы можете создать хранилище ключей с помощью портал Azure или Azure PowerShell.
    • The associated key vault must be in the same region and subscription as your Cloud Services (extended support) deployment.
    • Связанное хранилище ключей должно иметь соответствующие разрешения, чтобы ресурсы Облачные службы (расширенная поддержка) могли получать сертификаты из хранилища ключей. Дополнительные сведения см. в статье "Использование сертификатов с Облачные службы (расширенная поддержка)".
    • Хранилище ключей должно упоминаться в разделе osProfile шаблона ARM, как показано на следующем шаге.

Развертывание Облачных служб (расширенная поддержка)

Чтобы развернуть службы облачной платформы (расширенная поддержка) с использованием шаблона:

Примечание.

Проще и быстрее создавать шаблон ARM и файл параметров с помощью портал Azure. Созданный шаблон 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-адрес и (необязательно) задайте свойство метки DNS общедоступного IP-адреса. При использовании статического IP-адреса необходимо ссылаться на него как зарезервированный IP-адрес в файле конфигурации (CSCFG). Если вы используете существующий 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. Создайте объект Облачные службы (расширенная поддержка). Добавьте соответствующие dependsOn ссылки при развертывании виртуальных сетей или общедоступных IP-адресов в шаблоне.

    {
      "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. Добавьте ссылку на хранилище ключей в osProfile разделе шаблона ARM. Хранилище ключей хранит сертификаты, связанные с облачными службами (расширенная поддержка). Добавьте сертификаты в хранилище ключей, затем укажите отпечатки сертификатов в файле конфигурации (.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}" 
                } 
              ] 
            } 
          ] 
        } 
    

    Примечание.

    sourceVaultв ARM-шаблоне является значением идентификатора ресурса для вашего хранилища ключей. Эти сведения можно получить, найдя идентификатор ресурса в разделе "Свойства " хранилища ключей.

    • Вы можете получить значение, certificateUrl перейдя к сертификату в хранилище ключей с меткой "Секретный идентификатор". 
    • certificateUrl должен иметь форму https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Создайте профиль роли. Убедитесь, что количество ролей, количество экземпляров в каждой роли, имена ролей и размеры ролей совпадают в файле конфигурации (CSCFG), файле определения (CSDEF) и roleProfile разделе в шаблоне ARM.

    "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 символов и должен соответствовать по крайней мере трем из следующих требований к сложности паролей:

    Содержит прописную букву.
    Contains a lowercase character.
    Содержит числовую цифру.
    Содержит специальный символ.
    Нельзя содержать управляющий символ.

        "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"