Bereitstellen von Cloud Services (erweiterter Support) mithilfe einer ARM-Vorlage

In diesem Artikel wird beschrieben, wie Sie mithilfe einer Azure Resource Manager-Vorlage (ARM-Vorlage) eine Bereitstellung für Azure Cloud Services (erweiterter Support) erstellen.

Voraussetzungen

Führen Sie die folgenden Schritte als Voraussetzung für die Erstellung Ihrer Bereitstellung mithilfe von ARM-Vorlagen aus.

  1. Informieren Sie sich über die Bereitstellungsvoraussetzungen für Cloud Services (erweiterter Support), und erstellen Sie die erforderlichen Ressourcen.

  2. Erstellen Sie über das Azure-Portal oder mithilfe von Azure PowerShell eine neue Ressourcengruppe. Bei Verwendung einer vorhandenen Ressourcengruppe ist dieser Schritt optional.

  3. Erstellen Sie über das Azure-Portal oder mithilfe von Azure PowerShell ein neues Speicherkonto. Bei Verwendung eines vorhandenen Speicherkontos ist dieser Schritt optional.

  4. Laden Sie die Paketdatei (CSPKG- oder ZIP-Datei) und die Konfigurationsdatei (CSCFG-Datei) über das Azure-Portal oder Azure PowerShell in das Speicherkonto hoch. Speichern Sie die SAS-URIs (Shared Access Signature) für beide Dateien, um sie der ARM-Vorlage in einem späteren Schritt hinzuzufügen.

  5. (Optional): Erstellen Sie einen Schlüsseltresor, und laden Sie die Zertifikate hoch.

    • Sie können Zertifikate an Ihre Bereitstellung anfügen, um eine sichere Kommunikation mit dem Dienst zu gewährleisten. Wenn Sie Zertifikate verwenden, müssen die Zertifikatfingerabdrücke in Ihrer Dienstkonfigurationsdatei (CSCFG-Datei) angegeben und in einen Schlüsseltresor hochgeladen werden. Sie können einen Schlüsseltresor erstellen, indem Sie das Azure-Portal oder Azure PowerShell verwenden.
    • Der zugeordnete Schlüsseltresor muss in der gleichen Region und im gleichen Abonnement erstellt werden wie die Bereitstellung für Cloud Services (erweiterter Support).
    • Der zugeordnete Schlüsseltresor muss über die entsprechenden Berechtigungen verfügen, damit Ressourcen vom Typ „Cloud Services (erweiterter Support)“ Zertifikate aus dem Schlüsseltresor abrufen können. Weitere Informationen finden Sie unter Verwenden von Zertifikaten mit Azure Cloud Services (erweiterter Support).
    • Auf den Schlüsseltresor muss im Abschnitt osProfile der ARM-Vorlage verwiesen werden, wie in einem späteren Schritt gezeigt.

Bereitstellen von Cloud Services (erweiterter Support)

So stellen Sie Cloud Services (erweiterter Support) mithilfe einer Vorlage bereit

Hinweis

Die Erstellung der ARM-Vorlage und Parameterdatei über das Azure-Portal ist einfacher und schneller. Sie können die generierte ARM-Vorlage im Portal herunterladen, um Ihre Instanz von Cloud Services (erweiterter Support) über Azure PowerShell zu erstellen.

  1. Erstellen Sie ein virtuelles Netzwerk. Der Name des virtuellen Netzwerks muss den VNet-Verweisen in der Konfigurationsdatei (CSCFG-Datei) entsprechen. Sollten Sie ein vorhandenes virtuelles Netzwerk verwenden, überspringen Sie diesen Abschnitt in der ARM-Vorlage.

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

    Wenn Sie ein neues virtuelles Netzwerk erstellen, fügen Sie dem Abschnitt dependsOn die folgenden Zeilen hinzu, um sicherzustellen, dass die Plattform das virtuelle Netzwerk erstellt, bevor sie die Instanz für Cloud Services (erweiterter Support) erstellt:

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Erstellen Sie eine öffentliche IP-Adresse, und legen Sie (optional) die DNS-Bezeichnungseigenschaft der öffentlichen IP-Adresse fest. Wenn Sie eine statische IP-Adresse verwenden, müssen Sie in der Konfigurationsdatei (CSCFG) auf sie als reservierte IP-Adresse verweisen. Wenn Sie eine vorhandene IP-Adresse verwenden, überspringen Sie diesen Schritt, und fügen Sie die IP-Adressinformationen in Ihrer ARM-Vorlage direkt den Konfigurationseinstellungen für den Lastenausgleich hinzu.

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

    Wenn Sie eine neue IP-Adresse erstellen, fügen Sie dem Abschnitt dependsOn die folgenden Zeilen hinzu, um sicherzustellen, dass die Plattform die IP-Adresse erstellt, bevor sie die Instanz für Cloud Services (erweiterter Support) erstellt:

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Erstellen Sie ein Objekt für Cloud Services (erweiterter Support). Fügen Sie in Ihrer Vorlage entsprechende dependsOn-Verweise hinzu, wenn Sie virtuelle Netzwerke oder öffentliche IP-Adressen bereitstellen.

    {
      "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. Erstellen Sie ein Netzwerkprofilobjekt für Ihre Bereitstellung, und ordnen Sie die öffentliche IP-Adresse dem Front-End des Lastenausgleichs zu. Die Plattform erstellt automatisch einen Lastenausgleich.

    "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. Fügen Sie im Abschnitt osProfile der ARM-Vorlage Ihren Schlüsseltresorverweis hinzu. Ein Schlüsseltresor speichert Zertifikate, die Cloud Services (erweiterter Support) zugeordnet sind. Fügen Sie dem Schlüsseltresor die Zertifikate hinzu, und verweisen Sie dann in der Konfigurationsdatei (.cscfg) auf die Zertifikatfingerabdrücke. Außerdem müssen Sie die Schlüsseltresor-Zugriffsrichtlinien für Azure Virtual Machines für Bereitstellung im Azure-Portal aktivieren, damit die Ressource vom Typ „Cloud Services (erweiterter Support)“ die als Geheimnisse im Schlüsseltresor gespeicherten Zertifikate abrufen kann. Der Schlüsseltresor muss sich in der gleichen Region und im gleichen Abonnement befinden wie die Ressource für Cloud Services (erweiterter Support) und einen eindeutigen Namen besitzen. Weitere Informationen finden Sie unter Verwenden von Zertifikaten mit Azure Cloud Services (erweiterter Support).

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

    Hinweis

    sourceVault in der ARM-Vorlage ist der Wert der Ressourcen-ID für Ihren Schlüsseltresor. Sie rufen diese Informationen ab, indem Sie im Abschnitt Eigenschaften Ihres Schlüsseltresors nach der Ressourcen-ID suchen.

    • Sie können den Wert für certificateUrl abrufen, indem Sie zum Zertifikat im Schlüsseltresor wechseln, der als Geheimnisbezeichner bezeichnet wird. 
    • certificateUrl muss das Format https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id} aufweisen.
  6. Erstellen Sie ein Rollenprofil. Stellen Sie sicher, dass die Anzahl von Rollen, die Anzahl von Instanzen in den einzelnen Rollen, die Rollennamen sowie die Rollengrößen in der Konfigurationsdatei (.cscfg), in der Definitionsdatei (.csdef) und im Abschnitt roleProfile der ARM-Vorlage jeweils identisch sind.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Optional) Erstellen Sie ein Erweiterungsprofil, um Ihrer Bereitstellung für Cloud Services (erweiterter Support) Erweiterungen hinzuzufügen. Im folgenden Beispiel werden die Erweiterungen für das Remotedesktopprotokoll (RDP) und die Azure-Diagnose hinzugefügt.

    Hinweis

    Das Kennwort für RDP muss aus 8 bis 123 Zeichen bestehen und mindestens drei der folgenden Anforderungen an die Kennwortkomplexität erfüllen:

    Enthält einen Großbuchstaben.
    Enthält einen Kleinbuchstaben.
    Enthält eine Ziffer.
    Enthält ein Sonderzeichen
    Darf kein Steuerzeichen enthalten.

        "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. Überprüfen Sie die gesamte Vorlage:

    {
      "$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. Stellen Sie zum Erstellen der Bereitstellung für Cloud Services (erweiterter Support) die Vorlagen- und Parameterdatei (zum Definieren von Parametern in der Vorlagendatei) bereit. Sie können diese Beispielvorlagen verwenden.

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