Implementar um Serviço Cloud (suporte alargado) com modelos do ARM

Este tutorial explica como criar uma implementação do Serviço Cloud (suporte alargado) com modelos do ARM.

Antes de começar

  1. Reveja os pré-requisitos de implementação para Serviços Cloud (suporte alargado) e crie os recursos associados.

  2. Crie um novo grupo de recursos com o portal do Azure ou o PowerShell. Este passo é opcional se estiver a utilizar um grupo de recursos existente.

  3. Crie uma nova conta de armazenamento com o portal do Azure ou o PowerShell. Este passo é opcional se estiver a utilizar uma conta de armazenamento existente.

  4. Carregue os ficheiros Package (.cspkg) e Service Configuration (.cscfg) para a conta de armazenamento com o portal do Azure ou o PowerShell. Obtenha os URIs de SAS de ambos os ficheiros a serem adicionados ao modelo do ARM mais adiante neste tutorial.

  5. (Opcional) Crie um cofre de chaves e carregue os certificados.

    • Os certificados podem ser anexados a serviços cloud para permitir uma comunicação segura de e para o serviço. Para utilizar certificados, os thumbprints têm de ser especificados no ficheiro de Configuração do Serviço (.cscfg) e carregados para um cofre de chaves. Um cofre de chaves pode ser criado através do portal do Azure ou do PowerShell.
    • O cofre de chaves associado tem de estar localizado na mesma região e subscrição que o serviço cloud.
    • O cofre de chaves associado para tem de ter as permissões adequadas ativadas para que Serviços Cloud recurso (suporte alargado) possa obter certificados de Key Vault. Para obter mais informações, veja Certificados e Key Vault
    • O cofre de chaves tem de ser referenciado na secção OsProfile do modelo do ARM apresentada nos passos abaixo.

Implementar um Serviço Cloud (suporte alargado)

Nota

Uma forma mais fácil e rápida de gerar o modelo do ARM e o ficheiro de parâmetros é através do portal do Azure. Pode transferir o modelo arm gerado através do portal para criar o seu Serviço Cloud através do PowerShell

  1. Criar rede virtual. O nome da rede virtual tem de corresponder às referências no ficheiro de Configuração do Serviço (.cscfg). Se estiver a utilizar uma rede virtual existente, omita esta secção do modelo do 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" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    Se criar uma nova rede virtual, adicione o seguinte à dependsOn secção para garantir que a plataforma cria a rede virtual antes de criar o serviço cloud.

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Crie um endereço IP público e (opcionalmente) defina a propriedade etiqueta DNS do endereço IP público. Se estiver a utilizar um IP Estático, tem de referenciá-lo como um IP Reservado no ficheiro de Configuração do Serviço (.cscfg). Se estiver a utilizar um endereço IP existente, ignore este passo e adicione as informações do endereço IP diretamente nas definições de configuração do balanceador de carga do modelo do 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" 
          } 
        } 
    ] 
    

    Se criar um novo endereço IP, adicione o seguinte à dependsOn secção para garantir que a plataforma cria o endereço IP antes de criar o serviço cloud.

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Crie um objeto de Serviço Cloud (Suporte Alargado), adicionando referências adequadas dependsOn se estiver a implementar Redes Virtuais ou IP Público no seu modelo.

    {
      "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. Crie um Objeto de Perfil de Rede para o seu Serviço Cloud e associe o endereço IP público ao front-end do balanceador de carga. A plataforma cria automaticamente um balanceador de carga.

    "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. Adicione a referência do cofre de chaves na OsProfile secção do modelo do ARM. Key Vault é utilizado para armazenar certificados associados a Serviços Cloud (suporte alargado). Adicione os certificados ao Key Vault e, em seguida, referencie os thumbprints do certificado no ficheiro de Configuração do Serviço (.cscfg). Também tem de ativar Key Vault "Políticas de acesso" para "Azure Máquinas Virtuais para implementação" (no portal) para que Serviços Cloud recurso (suporte alargado) possa obter o certificado armazenado como segredos do Key Vault. O cofre de chaves tem de estar localizado na mesma região e subscrição que o serviço cloud e ter um nome exclusivo. Para obter mais informações, veja Utilizar certificados com Serviços Cloud (suporte alargado).

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

    Nota

     SourceVault é o ID de Recurso do ARM para o cofre de chaves. Pode encontrar estas informações ao localizar o ID do Recurso na secção de propriedades do cofre de chaves.

    • CertificateUrl pode ser encontrado ao navegar para o certificado no cofre de chaves identificado como Identificador de Segredo. 
    • certificateUrl deve ser do formulário https://{keyvault-endpoin}/secrets/{secretname}/{secret-id}
  6. Criar um Perfil de Função. Certifique-se de que o número de funções, nomes de funções, número de instâncias em cada função e tamanhos é o mesmo na secção Configuração do Serviço (.cscfg), Definição de Serviço (.csdef) e perfil de função no modelo do ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Opcional) Crie um perfil de extensão para adicionar extensões ao seu serviço cloud. Neste exemplo, estamos a adicionar o ambiente de trabalho remoto e a extensão de diagnóstico do Windows Azure.

    Nota

    A palavra-passe do ambiente de trabalho remoto tem de ter entre 8 e 123 carateres e tem de satisfazer pelo menos 3 dos requisitos de complexidade da palavra-passe dos seguintes: 1) Contém um caráter maiúsculo 2) Contém um caráter em minúsculas 3) Contém um dígito numérico 4) Contém um caráter especial 5) Os carateres de controlo não são permitidos

        "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. Reveja o modelo completo.

    {
      "$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. Implemente o modelo e o ficheiro de parâmetros (definindo parâmetros no ficheiro de modelo) para criar a implementação do Serviço Cloud (suporte alargado). Veja estes modelos de exemplo conforme necessário.

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

Passos seguintes