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

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

Подготовка к работе

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

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

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

  4. Передайте пакет (.cspkg) и файлы конфигурации службы (.cscfg) в учетную запись хранения с помощью портала Azure или PowerShell. Получите подписанные URL-адреса обоих файлов, которые вы добавите в шаблон ARM далее в этом руководстве.

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

    • Сертификаты можно присоединять к облачным службам, чтобы обеспечить безопасное взаимодействие со службой. Для использования сертификатов необходимо, чтобы их отпечатки были указаны в CSCFG-файле конфигурации службы и переданы в хранилище ключей. Хранилище ключей можно создать с помощью портала Azure или PowerShell.
    • Связанное с облачной службой хранилище ключей должно находиться в том же регионе и подписке, что и эта служба.
    • Для связанного хранилища ключей необходимо включить разрешения, позволяющие ресурсу Облачных служб (расширенная поддержка) получить сертификаты из хранилища ключей. Дополнительные сведения см. в статье о сертификатах и хранилище ключей.
    • Ссылка на хранилище ключей должна быть указана в разделе OsProfile шаблона ARM, показанного ниже.

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

Примечание

Вы также можете упростить и ускорить процесс создания шаблона ARM и файла параметров, используя портал Azure. Созданный шаблон ARM можно скачать на портале, чтобы создать облачную службу с помощью 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-адрес с внешним интерфейсом подсистемы балансировки нагрузки, созданной платформой. Подсистему балансировки нагрузки платформа создает автоматически.

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

    "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, перейдите в хранилище ключей к сертификату с меткой Secret Identifier (Секретный идентификатор). 
    • certificateUrl имеет формат https://{конечная_точка_хранилища_ключей}/secrets/{имя_секрета}/{ИД_секрета}
  6. Создайте профиль роли. Убедитесь, что количество ролей, имена ролей, число и размеры экземпляров в каждой роли одинаковы в CSCFG-файле конфигурации службы, CSDEF-файле определения службы и в разделе профиля роли в шаблоне ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Необязательно) Создайте профиль расширения, чтобы добавить расширения в облачную службу. В этом примере мы добавляем расширения удаленного рабочего стола и Диагностики Windows Azure.

    Примечание

    Пароль должен составлять от 8 до 123 символов, а также соответствовать как минимум 3 из следующих требований к сложности паролей: 1) наличие прописной буквы; 2) наличие строчной буквы; 3) наличие цифры; 4) наличие специального знака; 5) отсутствие управляющих символов

        "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 CSPKG file to deploy"
          }
        },
        "configurationSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS Uri of the service configuration (.cscfg)"
          }
        },
        "roles": {
          "type": "array",
          "metadata": {
            "description": "Roles created in the cloud service application"
          }
        },
        "wadPublicConfig_WebRole1": {
          "type": "string",
          "metadata": {
             "description": "Public configuration of Windows Azure Diagnostics extension"
          }
        },
        "wadPrivateConfig_WebRole1": {
          "type": "securestring",
          "metadata": {
            "description": "Private configuration of Windows 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"
    

Дальнейшие действия