Condividi tramite


Distribuire Servizi cloud (supporto "Extended") usando un modello di ARM

Questo articolo illustra come usare un modello di Azure Resource Manager (modello di ARM) per creare una distribuzione di Servizi cloud di Azure (supporto "Extended").

Prerequisiti

Completare i passaggi seguenti come prerequisiti per la creazione della distribuzione usando i modelli di ARM.

  1. Esaminare i prerequisiti per la distribuzione di Servizi cloud di Azure (supporto "Extended") e creare le risorse necessarie.

  2. Creare un nuovo gruppo di risorse usando il portale di Azure o Azure PowerShell. Questo passaggio è facoltativo se si usa un gruppo di risorse esistente.

  3. Creare un nuovo account di archiviazione usando il portale di Azure o Azure PowerShell. Questo passaggio è facoltativo se si usa un account di archiviazione esistente.

  4. Caricare il file di pacchetto (.cspkg o.zip) e configurazione del servizio (.cscfg) nell'account di archiviazione usando il portale di Azure o Azure PowerShell. Salvare gli URI della firma di accesso condiviso (SAS) per entrambi i file da aggiungere al modello di ARM in un passaggio successivo.

  5. (Facoltativo) Creare un insieme di credenziali delle chiavi e caricare i certificati.

    • È possibile allegare certificati alla distribuzione per comunicazioni sicure da e verso il servizio. Se si usano certificati, le identificazioni personali del certificato devono essere specificate nel file di configurazione (.cscfg) e caricate in un insieme di credenziali delle chiavi. È possibile creare un insieme di credenziali delle chiavi usando il portale di Azure o Azure PowerShell.
    • L'insieme di credenziali delle chiavi associato deve trovarsi nella stessa area e nella stessa sottoscrizione della distribuzione di Servizi cloud (supporto "Extended").
    • L'insieme di credenziali delle chiavi associato deve disporre delle autorizzazioni pertinenti in modo che le risorse di Servizi cloud (supporto "Extended") possano recuperare i certificati dall'insieme di credenziali delle chiavi. Per altre informazioni, vedere Usare certificati con Servizi cloud (supporto "Extended").
    • È necessario fare riferimento all'insieme di credenziali delle chiavi nella sezione osProfile del modello di ARM, come illustrato in un passaggio successivo.

Distribuire Servizi cloud (supporto "Extended")

Distribuire Servizi cloud (supporto "Extended") con un modello:

Nota

Un modo più semplice e rapido per generare il modello di ARM e il file di parametri è tramite il portale di Azure. È possibile scaricare il modello di ARM generato nel portale per creare i Servizi cloud (supporto "Extended") tramite Azure PowerShell.

  1. Crea una rete virtuale. Il nome della rete virtuale deve corrispondere ai riferimenti alla rete virtuale nel file di configurazione (.cscfg). Se si usa una rete virtuale esistente, omettere questa sezione dal modello di 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 si crea una nuova rete virtuale, aggiungere le righe seguenti alla sezione dependsOn per assicurarsi che la piattaforma crei la rete virtuale prima di creare l'istanza di Servizi cloud (supporto "Extended"):

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Creare un indirizzo IP pubblico e (facoltativamente) impostare la proprietà dell'etichetta DNS dell'indirizzo IP pubblico. Se si usa un indirizzo IP statico, è necessario farvi riferimento come indirizzo IP riservato nel file di configurazione (.cscfg). Se si usa un indirizzo IP esistente, ignorare questo passaggio e aggiungere le informazioni sull'indirizzo IP direttamente nelle impostazioni di configurazione del bilanciamento del carico del modello di 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 si crea un nuovo indirizzo IP, aggiungere le righe seguenti alla sezione dependsOn per assicurarsi che la piattaforma crei l'indirizzo IP prima di creare l'istanza di Servizi cloud (supporto "Extended"):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Creare un oggetto Servizi cloud (supporto "Extended"). Aggiungere riferimenti pertinenti dependsOn se si distribuiscono reti virtuali o indirizzi IP pubblici nel modello.

    {
      "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. Creare un oggetto profilo di rete per la distribuzione e associare l'indirizzo IP pubblico al front-end del servizio di bilanciamento del carico. La piattaforma Azure crea automaticamente un servizio di bilanciamento del carico.

    "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. Aggiungere il riferimento all'insieme di credenziali delle chiavi nella sezione osProfile del modello di Resource Manager. Un insieme di credenziali delle chiavi archivia i certificati associati a Servizi cloud (supporto "Extended"). Aggiungere i certificati all'insieme di credenziali delle chiavi quindi fare riferimento alle identificazioni personali del certificato nel file di configurazione (.cscfg). Specificare inoltre i criteri dell'insieme di credenziali delle chiavi per Macchine virtuali di Azure per la distribuzione nel portale di Azure, in modo che la risorsa Servizi cloud (supporto "Extended") possa recuperare il certificato archiviato come segreti nell'insieme di credenziali delle chiavi. L'insieme di credenziali delle chiavi deve trovarsi nella stessa area e nella stessa sottoscrizione della risorsa di Servizi cloud (supporto "Extended") e avere un nome univoco. Per altre informazioni, vedere Usare certificati con Servizi cloud (supporto "Extended").

    "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

    sourceVaultnel modello di ARM è il valore dell'ID risorsa per l'insieme di credenziali delle chiavi. È possibile ottenere queste informazioni individuando l'ID risorsa nella sezione Proprietà dell'insieme di credenziali delle chiavi.

    • È possibile ottenere il valore per certificateUrl passando al certificato nell'insieme di credenziali delle chiavi con etichetta Identificatore segreto. 
    • certificateUrl deve essere di tipo https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Creare un profilo ruolo. Assicurarsi che il numero di ruoli, il numero di istanze in ogni ruolo, i nomi dei ruoli e le dimensioni dei ruoli siano uguali nel file di configurazione (.cscfg), nel file di definizione (.csdef) e nella sezione roleProfilenel modello di ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Facoltativo) Creare un profilo di estensione per aggiungere estensioni alla distribuzione di Servizi cloud (supporto "Extended"). L'esempio seguente aggiunge l'estensione RDP (Remote Desktop Protocol) e l'estensione Diagnostica di Azure.

    Nota

    La password per RDP deve contenere da 8 a 123 caratteri e deve soddisfare almeno tre dei requisiti di complessità delle password seguenti:

    Contiene un carattere maiuscolo.
    Contiene un carattere minuscolo.
    Contiene una cifra numerica.
    Contiene un carattere speciale.
    Impossibile contenere un carattere di controllo.

        "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. Esaminare il modello 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. Distribuire il modello e il file di parametri (definizione dei parametri nel file modello) per creare la distribuzione di Servizi cloud (supporto "Extended"). È possibile usare questi modelli di esempio.

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