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

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

Необходимые компоненты

Выполните следующие действия в качестве необходимых компонентов для создания развертывания с помощью шаблонов ARM.

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

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

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

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

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

    • Сертификаты можно подключить к развертыванию для безопасного взаимодействия с службой и из нее. При использовании сертификатов отпечаток сертификата должен быть указан в файле конфигурации (CSCFG) и передаваться в хранилище ключей. Вы можете создать хранилище ключей с помощью портал Azure или Azure PowerShell.
    • Связанное хранилище ключей должно находиться в том же регионе и подписке, что и развертывание Облачные службы (расширенная поддержка).
    • Связанное хранилище ключей должно иметь соответствующие разрешения, чтобы ресурсы Облачные службы (расширенная поддержка) могли получать сертификаты из хранилища ключей. Дополнительные сведения см. в статье "Использование сертификатов с Облачные службы (расширенная поддержка)".
    • Хранилище ключей должно ссылаться в 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 символов и должен соответствовать по крайней мере трем из следующих требований к сложности паролей:

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

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