Udostępnij za pośrednictwem


Wdrażanie usług Cloud Services (wsparcie dodatkowe) przy użyciu szablonu usługi ARM

W tym artykule przedstawiono sposób użycia szablonu usługi Azure Resource Manager (szablonu arm) do utworzenia wdrożenia usług Azure Cloud Services (rozszerzonej pomocy technicznej).

Wymagania wstępne

Wykonaj poniższe kroki jako wymagania wstępne dotyczące tworzenia wdrożenia przy użyciu szablonów usługi ARM.

  1. Zapoznaj się z wymaganiami wstępnymi dotyczącymi wdrażania dla usług Cloud Services (rozszerzona pomoc techniczna) i utwórz wymagane zasoby.

  2. Utwórz nową grupę zasobów przy użyciu witryny Azure Portal lub programu Azure PowerShell. Ten krok jest opcjonalny, jeśli używasz istniejącej grupy zasobów.

  3. Utwórz nowe konto magazynu przy użyciu witryny Azure Portal lub programu Azure PowerShell. Ten krok jest opcjonalny, jeśli używasz istniejącego konta magazynu.

  4. Przekaż plik pakietu (cspkg lub .zip) i plik konfiguracji (cscfg) do konta magazynu przy użyciu witryny Azure Portal lub programu Azure PowerShell. Zapisz identyfikatory URI sygnatury dostępu współdzielonego dla obu plików, aby dodać je do szablonu usługi ARM w późniejszym kroku.

  5. (Opcjonalnie) Utwórz magazyn kluczy i przekaż certyfikaty.

    • Certyfikaty można dołączyć do wdrożenia, aby zapewnić bezpieczną komunikację z usługą i z niej. Jeśli używasz certyfikatów, odciski palca certyfikatu muszą być określone w pliku konfiguracji (cscfg) i być przekazywane do magazynu kluczy. Magazyn kluczy można utworzyć przy użyciu witryny Azure Portal lub programu Azure PowerShell.
    • Skojarzony magazyn kluczy musi znajdować się w tym samym regionie i subskrypcji co wdrożenie usług Cloud Services (wsparcie dodatkowe).
    • Skojarzony magazyn kluczy musi mieć odpowiednie uprawnienia, aby zasoby usług Cloud Services (wsparcie dodatkowe) mogły pobierać certyfikaty z magazynu kluczy. Aby uzyskać więcej informacji, zobacz Używanie certyfikatów z usługami Cloud Services (rozszerzona pomoc techniczna).
    • Magazyn kluczy musi być przywołyny w osProfile sekcji szablonu usługi ARM, jak pokazano w późniejszym kroku.

Wdrażanie usług Cloud Services (wsparcie dodatkowe)

Aby wdrożyć usługi Cloud Services (rozszerzona pomoc techniczna) przy użyciu szablonu:

Uwaga

Łatwiejszy i szybszy sposób generowania szablonu i pliku parametrów usługi ARM jest użycie witryny Azure Portal. Wygenerowany szablon usługi ARM można pobrać w portalu, aby utworzyć usługi Cloud Services (rozszerzona pomoc techniczna) za pośrednictwem programu Azure PowerShell.

  1. Utwórz sieć prywatną. Nazwa sieci wirtualnej musi być zgodna z odwołaniami sieci wirtualnej w pliku konfiguracji (cscfg). Jeśli używasz istniejącej sieci wirtualnej, pomiń tę sekcję z szablonu usługi 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" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    Jeśli tworzysz nową sieć wirtualną, dodaj następujące wiersze do dependsOn sekcji, aby upewnić się, że platforma tworzy sieć wirtualną przed utworzeniem wystąpienia usług Cloud Services (rozszerzonej pomocy technicznej):

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Utwórz publiczny adres IP i (opcjonalnie) ustaw właściwość etykiety DNS publicznego adresu IP. Jeśli używasz statycznego adresu IP, musisz odwołać się do niego jako zastrzeżony adres IP w pliku konfiguracji (cscfg). Jeśli używasz istniejącego adresu IP, pomiń ten krok i dodaj informacje o adresie IP bezpośrednio w ustawieniach konfiguracji modułu równoważenia obciążenia w szablonie usługi 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" 
          } 
        } 
    ] 
    

    Jeśli utworzysz nowy adres IP, dodaj następujące wiersze do dependsOn sekcji, aby upewnić się, że platforma tworzy adres IP przed utworzeniem wystąpienia usług Cloud Services (rozszerzonej pomocy technicznej):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Utwórz obiekt Cloud Services (wsparcie dodatkowe). Dodaj odpowiednie dependsOn odwołania w przypadku wdrażania sieci wirtualnych lub publicznych adresów IP w szablonie.

    {
      "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. Utwórz obiekt profilu sieciowego dla wdrożenia i skojarz publiczny adres IP z frontonem modułu równoważenia obciążenia. Platforma Azure automatycznie tworzy moduł równoważenia obciążenia.

    "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. Dodaj odwołanie do magazynu kluczy w osProfile sekcji szablonu usługi ARM. Magazyn kluczy przechowuje certyfikaty skojarzone z usługami Cloud Services (rozszerzona obsługa). Dodaj certyfikaty do magazynu kluczy, a następnie odwołaj się do odcisków palca certyfikatu w pliku konfiguracji (cscfg). Ponadto ustaw zasady dostępu magazynu kluczy dla usługi Azure Virtual Machines do wdrożenia w witrynie Azure Portal, aby zasób usług Cloud Services (rozszerzona pomoc techniczna) mógł pobrać certyfikaty przechowywane jako wpisy tajne w magazynie kluczy. Magazyn kluczy musi znajdować się w tym samym regionie i subskrypcji co zasób usług Cloud Services (rozszerzona pomoc techniczna) i mieć unikatową nazwę. Aby uzyskać więcej informacji, zobacz Używanie certyfikatów z usługami Cloud Services (rozszerzona pomoc techniczna).

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

    Uwaga

    sourceVaultw szablonie usługi ARM jest wartością identyfikatora zasobu dla magazynu kluczy. Te informacje można uzyskać, wyszukując identyfikator zasobu w sekcji Właściwości magazynu kluczy.

    • Wartość można uzyskać certificateUrl , przechodząc do certyfikatu w magazynie kluczy z etykietą Secret Identifier(Identyfikator wpisu tajnego). 
    • certificateUrl powinna mieć postać https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Utwórz profil roli. Upewnij się, że liczba ról, liczba wystąpień w każdej roli, nazwy ról i rozmiary ról są takie same w pliku konfiguracji (cscfg), pliku definicji (csdef) i roleProfile sekcji w szablonie usługi ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Opcjonalnie) Utwórz profil rozszerzenia, aby dodać rozszerzenia do wdrożenia usług Cloud Services (wsparcie dodatkowe). W poniższym przykładzie dodano rozszerzenie RDP (Remote Desktop Protocol) i rozszerzenie Diagnostyka Azure.

    Uwaga

    Hasło protokołu RDP musi zawierać od 8 do 123 znaków i musi spełniać co najmniej trzy z następujących wymagań dotyczących złożoności hasła:

    Zawiera wielkie litery.
    Zawiera małe litery.
    Zawiera cyfrę liczbową.
    Zawiera znak specjalny.
    Nie można zawierać znaku sterującego.

        "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. Przejrzyj pełny szablon:

    {
      "$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. Aby utworzyć wdrożenie usług Cloud Services (wsparcie dodatkowe), wdróż plik szablonu i parametrów (aby zdefiniować parametry w pliku szablonu). Możesz użyć tych przykładowych szablonów.

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