Distribuera Cloud Services (utökat stöd) med hjälp av en ARM-mall

Den här artikeln visar hur du använder en Azure Resource Manager-mall (ARM-mall) för att skapa en Azure Cloud Services-distribution (utökad support).

Förutsättningar

Slutför följande steg som förutsättningar för att skapa distributionen med hjälp av ARM-mallar.

  1. Granska distributionskraven för Cloud Services (utökad support) och skapa de resurser som krävs.

  2. Skapa en ny resursgrupp med hjälp av Azure-portalen eller Azure PowerShell. Det här steget är valfritt om du använder en befintlig resursgrupp.

  3. Skapa ett nytt lagringskonto med hjälp av Azure-portalen eller Azure PowerShell. Det här steget är valfritt om du använder ett befintligt lagringskonto.

  4. Ladda upp paketfilen (.cspkg eller .zip) och konfigurationsfilen (.cscfg) till lagringskontot med hjälp av Azure-portalen eller Azure PowerShell. Spara SAS-URI:erna (signatur för delad åtkomst) för båda filerna som ska läggas till i ARM-mallen i ett senare steg.

  5. (Valfritt) Skapa ett nyckelvalv och ladda upp certifikaten.

    • Du kan bifoga certifikat till distributionen för säker kommunikation till och från tjänsten. Om du använder certifikat måste certifikatets tumavtryck anges i konfigurationsfilen (.cscfg) och laddas upp till ett nyckelvalv. Du kan skapa ett nyckelvalv med hjälp av Azure-portalen eller Azure PowerShell.
    • Det associerade nyckelvalvet måste finnas i samma region och prenumeration som din Cloud Services-distribution (utökad support).
    • Det associerade nyckelvalvet måste ha relevanta behörigheter så att Cloud Services-resurser (utökad support) kan hämta certifikat från nyckelvalvet. Mer information finns i Använda certifikat med Cloud Services (utökad support).
    • Nyckelvalvet måste refereras till i osProfile avsnittet i ARM-mallen som du ser i ett senare steg.

Distribuera Cloud Services (utökad support)

Så här distribuerar du Cloud Services (utökad support) med hjälp av en mall:

Kommentar

Ett enklare och snabbare sätt att generera ARM-mallen och parameterfilen är att använda Azure-portalen. Du kan ladda ned den genererade ARM-mallen i portalen för att skapa dina Molntjänster (utökad support) via Azure PowerShell.

  1. Skapa ett virtuellt nätverk. Namnet på det virtuella nätverket måste matcha referenser för virtuella nätverk i konfigurationsfilen (.cscfg). Om du använder ett befintligt virtuellt nätverk utelämnar du det här avsnittet från ARM-mallen.

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

    Om du skapar ett nytt virtuellt nätverk lägger du till följande rader i dependsOn avsnittet för att säkerställa att plattformen skapar det virtuella nätverket innan den skapar Cloud Services-instansen (utökad support):

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Skapa en offentlig IP-adress och (valfritt) ange egenskapen DNS-etikett för den offentliga IP-adressen. Om du använder en statisk IP-adress måste du referera till den som en reserverad IP-adress i konfigurationsfilen (.cscfg). Om du använder en befintlig IP-adress hoppar du över det här steget och lägger till IP-adressinformationen direkt i konfigurationsinställningarna för lastbalanseraren i ARM-mallen.

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

    Om du skapar en ny IP-adress lägger du till följande rader i dependsOn avsnittet för att säkerställa att plattformen skapar IP-adressen innan den skapar Cloud Services-instansen (utökad support):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Skapa ett Cloud Services-objekt (utökat stöd). Lägg till relevanta dependsOn referenser om du distribuerar virtuella nätverk eller offentliga IP-adresser i mallen.

    {
      "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. Skapa ett nätverksprofilobjekt för distributionen och associera den offentliga IP-adressen med lastbalanserarens klientdel. Azure-plattformen skapar automatiskt en lastbalanserare.

    "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. Lägg till key vault-referensen osProfile i avsnittet i ARM-mallen. Ett nyckelvalv lagrar certifikat som är associerade med Cloud Services (utökad support). Lägg till certifikaten i nyckelvalvet och referera sedan till certifikatets tumavtryck i konfigurationsfilen (.cscfg). Ange även åtkomstprincipen för nyckelvalvet för Azure Virtual Machines för distribution i Azure-portalen så att Cloud Services-resursen (utökad support) kan hämta de certifikat som lagras som hemligheter i nyckelvalvet. Nyckelvalvet måste finnas i samma region och prenumeration som din Cloud Services-resurs (utökad support) och ha ett unikt namn. Mer information finns i Använda certifikat med Cloud Services (utökad 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}" 
                } 
              ] 
            } 
          ] 
        } 
    

    Kommentar

    sourceVaulti ARM-mallen är värdet för resurs-ID:t för ditt nyckelvalv. Du kan hämta den här informationen genom att hitta resurs-ID i avsnittet Egenskaper i ditt nyckelvalv.

    • Du kan hämta värdet för certificateUrl genom att gå till certifikatet i nyckelvalvet med etiketten Hemlig identifierare. 
    • certificateUrl ska vara i form av https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Skapa en rollprofil. Kontrollera att antalet roller, antalet instanser i varje roll, rollnamn och rollstorlekar är desamma i konfigurationsfilen (.cscfg), definitionsfilen (.csdef) och roleProfile avsnittet i ARM-mallen.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Valfritt) Skapa en tilläggsprofil för att lägga till tillägg till din Cloud Services-distribution (utökad support). Följande exempel lägger till RDP-tillägget (Remote Desktop Protocol) och Azure Diagnostics-tillägget.

    Kommentar

    Lösenordet för RDP måste innehålla mellan 8 och 123 tecken och måste uppfylla minst tre av följande krav på lösenordskomplexitet:

    Innehåller ett versalt tecken.
    Innehåller ett gemener.
    Innehåller en numerisk siffra.
    Innehåller ett specialtecken.
    Det går inte att innehålla ett kontrolltecken.

        "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. Granska den fullständiga mallen:

    {
      "$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. Om du vill skapa distributionen av Cloud Services (utökat stöd) distribuerar du mall- och parameterfilen (för att definiera parametrar i mallfilen). Du kan använda dessa exempelmallar.

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