Compartilhar via


Implantar os Serviços de Nuvem (suporte estendido) usando um modelo do ARM

Este artigo mostra como usar umModelo do Azure Resource Manager (modelo do ARM) para criar uma implantação dos Serviços de Nuvem do Azure (suporte estendido).

Pré-requisitos

Conclua as etapas a seguir como pré-requisitos para criar sua implantação usando modelos do ARM.

  1. Examine os pré-requisitos de implantação dos Serviços de Nuvem (suporte estendido) e crie os recursos associados.

  2. Crie um grupo de recursos usando o portal do Azure ou o Azure PowerShell. Essa etapa é opcional se você estiver usando um grupo de recursos existente.

  3. Crie uma conta de armazenamento usando o portal do Azure ou o Azure PowerShell. Essa etapa é opcional se você já tiver uma conta de armazenamento.

  4. Carregue o arquivo do pacote (.cspkg ou .zip) e o arquivo de configuração (.cscfg) na conta de armazenamento usando o portal do Azure ou Azure PowerShell. Salve os URIs da assinatura de acesso compartilhado (SAS) de ambos os arquivos, pois você precisará deles para adicionar ao modelo do ARM em uma etapa posterior.

  5. (Opcional) Criar um cofre de chaves e carregar um certificado.

    • Você pode anexar certificados à sua implantação para garantir uma comunicação segura com o serviço. Se você usar certificados, as impressões digitais do certificado devem ser especificadas no arquivo de configuração (.cscfg) e carregadas em um cofre de chaves. Você pode criar um cofre de chaves usando o portal do Azure ou o Azure PowerShell.
    • O cofre de chaves associado deve estar na mesma região e assinatura que sua implantação dos Serviços de Nuvem (suporte estendido).
    • O cofre de chaves associado deve ter as permissões necessárias para que os recursos dos Serviços de Nuvem (suporte estendido) possam acessar os certificados no cofre de chaves. Para obter mais informações, confira Usar certificados com os Serviços de Nuvem (suporte estendido).
    • O cofre de chaves deve ser referenciado na seção do osProfile modelo do ARM, conforme será mostrado em uma etapa posterior.

Implantar Serviços de Nuvem (suporte estendido)

Implantar Serviços de Nuvem (suporte estendido) usando um modelo:

Observação

Uma maneira mais fácil e rápida de gerar seu modelo do ARM e arquivo de parâmetros é através do portal do Azure. Você pode baixar o modelo do ARM gerado no portal para criar seus Serviços de Nuvem (suporte estendido) por meio do Azure PowerShell.

  1. Crie uma rede virtual. O nome da rede virtual deve corresponder às referências da rede virtual no arquivo de configuração (.cscfg). Se estiver usando uma rede virtual existente, omita esta seçã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 for criar uma nova rede virtual, adicione as seguintes linhas à seção dependsOn para garantir que a plataforma crie a rede virtual antes de criar a instância dos Serviços de Nuvem (suporte estendido):

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Crie um endereço IP público e (opcionalmente) defina a propriedade rótulo DNS do endereço IP público. Se você usar um endereço IP estático, deverá referenciá-lo como um endereço IP reservado no arquivo de configuração (.cscfg). Se você optar usar um endereço IP existente, ignore esta etapa e adicione as informações de endereço IP diretamente aos parâmetros de configuração do balanceador de carga no 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 for criar um novo endereço IP, adicione as seguintes linhas à seção dependsOn para garantir que a plataforma crie o endereço IP antes de criar a instância dos Serviços de Nuvem (suporte estendido):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Crie um objeto dos Serviços de Nuvem (suporte estendido). Adicione referências dependsOn necessárias caso você implante redes virtuais ou endereços IP públicos em 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 a sua implantação e associe o endereço IP público ao front-end do balanceador de carga. A plataforma Azure se encarrega de criar 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 seçãoosProfile do modelo do ARM. Um cofre de chaves armazena certificados associados aos Serviços de Nuvem (suporte estendido). Adicione os certificados ao cofre de chaves e, em seguida, referencie as impressões digitais do certificado no arquivo de configuração (.cscfg). Além disso, defina a política de acesso do cofre de chaves para Máquinas Virtuais do Azure para implantação no portal do Azure para que o recurso serviços de nuvem (suporte estendido) possa recuperar os certificados armazenados como segredos no cofre de chaves. O cofre de chaves precisa estar na mesma região e assinatura que o recurso dos Serviços de Nuvem (suporte estendido) e ter um nome exclusivo. Para obter mais informações, confira Usar certificados com os Serviços de Nuvem (suporte estendido).

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

    Observação

     No modelo ARM, sourceVault representa o valor da ID do recurso do seu cofre de chaves. Você pode encontrar essa informação ao localizar a ID do Recurso na seção Propriedades do seu cofre de chaves.

    • Você pode obter o valor de certificateUrl acessando o certificado no cofre de chaves que está rotulado como Identificador do Segredo. 
    • certificateUrl deve seguir o formato de https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Crie um perfil de função. Garanta que o número de funções, o número de instâncias em cada função, os nomes das funções e os tamanhos das funções sejam consistentes entre o arquivo de configuração (.cscfg), o arquivo de definição (.csdef) e a seção roleProfile no modelo 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 à sua implantação de Serviços de Nuvem (suporte estendido). O exemplo a seguir adiciona a extensão do protocolo RDP e a extensão de Diagnósticos do Azure.

    Observação

    A senha para o RDP deve ter entre 8 e 123 caracteres e deve atender a pelo menos três dos seguintes requisitos de complexidade de senha:

    Conter um caractere maiúsculo.
    Conter um caractere minúsculo.
    Conter um dígito numérico.
    Contém um caractere especial.
    Não pode conter caracteres de controle.

        "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. Revise 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 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. Para criar a implantação dos Serviços de Nuvem (suporte estendido), implante o modelo e o arquivo de parâmetros (para definir parâmetros no arquivo do modelo). Você pode usar esses modelos de exemplo.

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