Partilhar via


Implantar serviços de nuvem (suporte estendido) usando um modelo ARM

Este artigo mostra como usar um modelo do Azure Resource Manager (modelo 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 ARM.

  1. Analise os pré-requisitos de implantação para Serviços de Nuvem (suporte estendido) e crie os recursos necessários.

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

  3. Crie uma nova conta de armazenamento usando o portal do Azure ou o Azure PowerShell. Esta etapa é opcional se você usar uma conta de armazenamento existente.

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

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

    • Você pode anexar certificados à sua implantação para comunicação segura de e para o serviço. Se você usar certificados, as impressões digitais do certificado deverão 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 de Serviços de Nuvem (suporte estendido).
    • O cofre de chaves associado deve ter as permissões relevantes para que os recursos dos Serviços de Nuvem (suporte estendido) possam recuperar certificados do cofre de chaves. Para obter mais informações, consulte Usar certificados com serviços de nuvem (suporte estendido).
    • O cofre de chaves deve ser referenciado na osProfile seção do modelo ARM, conforme mostrado em uma etapa posterior.

Implantar serviços de nuvem (suporte estendido)

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

Nota

Uma maneira mais fácil e rápida de gerar seu modelo ARM e arquivo de parâmetro é usando o portal do Azure. Você pode baixar o modelo 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 de rede virtual no arquivo de configuração (.cscfg). Se você usar uma rede virtual existente, omita esta seção do modelo 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 você criar uma nova rede virtual, adicione as seguintes linhas à dependsOn seção para garantir que a plataforma crie a rede virtual antes de criar a instância de 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 DNS label do endereço IP público. Se você usar um endereço IP estático, deverá fazer referência a ele como um endereço IP reservado no arquivo de configuração (.cscfg). Se você usar um endereço IP existente, ignore esta etapa e adicione as informações de endereço IP diretamente nas definições de configuração do balanceador de carga em seu modelo 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 você criar um novo endereço IP, adicione as seguintes linhas à dependsOn seção 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 Cloud Services (suporte estendido). Adicione referências relevantes dependsOn se estiver implantando 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 sua implantação e associe o endereço IP público ao front-end do balanceador de carga. A plataforma Azure 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 sua referência de cofre de chaves na osProfile seção do modelo 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, faça referência às impressões digitais do certificado no arquivo de configuração (.cscfg). Além disso, defina a política de acesso ao 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 deve estar na mesma região e assinatura que seu recurso de Serviços de Nuvem (suporte estendido) e ter um nome exclusivo. Para obter mais informações, consulte Usar certificados com 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}" 
                } 
              ] 
            } 
          ] 
        } 
    

    Nota

    sourceVaultno modelo ARM é o valor do ID do recurso para o cofre de chaves. Você pode obter essas informações localizando o ID do recurso na seção Propriedades do cofre de chaves.

    • Você pode obter o valor indo certificateUrl para o certificado no cofre de chaves rotulado como Identificador Secreto. 
    • certificateUrl deve assumir a forma de https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Crie um perfil de função. Certifique-se de que o número de funções, o número de instâncias em cada função, os nomes de função e os tamanhos de função sejam os mesmos no arquivo de configuração (.cscfg), no arquivo de definição (.csdef) e na roleProfile seção 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 RDP (Remote Desktop Protocol) e a extensão Azure Diagnostics.

    Nota

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

    Contém um caractere maiúsculo.
    Contém um caractere minúsculo.
    Contém um dígito numérico.
    Contém um caractere especial.
    Não pode conter um caractere 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. 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 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. Implante o modelo e o arquivo de parâmetros (para definir parâmetros no arquivo de modelo) para criar a implantação dos Serviços de Nuvem (suporte estendido). 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"