Wdrażanie usługi w chmurze (wsparcie dodatkowe) przy użyciu szablonów usługi ARM

W tym samouczku wyjaśniono, jak utworzyć wdrożenie usługi w chmurze (wsparcie dodatkowe) przy użyciu szablonów usługi ARM.

Zanim rozpoczniesz

  1. Zapoznaj się z wymaganiami wstępnymi dotyczącymi wdrażania dla Cloud Services (wsparcie dodatkowe) i utwórz skojarzone zasoby.

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

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

  4. Przekaż pliki package (cspkg) i Service Configuration (cscfg) na konto magazynu przy użyciu Azure Portal lub programu PowerShell. Uzyskaj identyfikatory URI sygnatury dostępu współdzielonego obu plików do dodania do szablonu usługi ARM w dalszej części tego samouczka.

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

    • Certyfikaty można dołączać do usług w chmurze, aby umożliwić bezpieczną komunikację z usługą i z niej. Aby można było używać certyfikatów, należy określić ich odciski palca w pliku konfiguracji usługi (cscfg) i przekazać je do magazynu kluczy. Magazyn kluczy można utworzyć za pomocą Azure Portal lub programu PowerShell.
    • Skojarzony magazyn kluczy musi znajdować się w tym samym regionie i subskrypcji co usługa w chmurze.
    • Skojarzony magazyn kluczy musi mieć włączone odpowiednie uprawnienia, aby zasób Cloud Services (wsparcie dodatkowe) mógł pobierać certyfikaty z Key Vault. Aby uzyskać więcej informacji, zobacz Certyfikaty i Key Vault
    • Do magazynu kluczy należy odwołać się w sekcji OsProfile szablonu usługi ARM pokazanego w poniższych krokach.

Wdrażanie usługi w chmurze (wsparcie dodatkowe)

Uwaga

Łatwiejszy i szybszy sposób generowania szablonu usługi ARM i pliku parametrów odbywa się za pośrednictwem Azure Portal. Wygenerowany szablon usługi ARM można pobrać za pośrednictwem portalu, aby utworzyć usługę w chmurze za pomocą programu PowerShell

  1. Utwórz sieć wirtualną. Nazwa sieci wirtualnej musi być zgodna z odwołaniami w pliku konfiguracji usługi (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" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    W przypadku tworzenia nowej sieci wirtualnej dodaj następujący kod do dependsOn sekcji , aby upewnić się, że platforma tworzy sieć wirtualną przed utworzeniem usługi w chmurze.

    "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 usługi (cscfg). Jeśli używasz istniejącego adresu IP, pomiń ten krok i dodaj informacje o adresie IP bezpośrednio do ustawień konfiguracji modułu równoważenia obciążenia szablonu 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 tworzysz nowy adres IP, dodaj następujący kod do dependsOn sekcji , aby upewnić się, że platforma tworzy adres IP przed utworzeniem usługi w chmurze.

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Utwórz obiekt usługi w chmurze (wsparcie dodatkowe), dodając odpowiednie dependsOn odwołania, jeśli wdrażasz sieci wirtualne lub publiczny adres 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 usługi w chmurze i skojarz publiczny adres IP z frontonem modułu równoważenia obciążenia. Moduł równoważenia obciążenia jest tworzony automatycznie przez platformę.

    "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. Key Vault służy do przechowywania certyfikatów skojarzonych z Cloud Services (wsparcie dodatkowe). Dodaj certyfikaty do Key Vault, a następnie odwołaj się do odcisków palca certyfikatu w pliku Service Configuration (cscfg). Należy również włączyć Key Vault "Zasady dostępu" dla usługi "Azure Virtual Machines na potrzeby wdrożenia"(w portalu), aby zasób Cloud Services (wsparcie dodatkowe) mógł pobrać certyfikat przechowywany jako wpisy tajne z Key Vault. Magazyn kluczy musi znajdować się w tym samym regionie i subskrypcji co usługa w chmurze i mieć unikatową nazwę. Aby uzyskać więcej informacji, zobacz używanie certyfikatów z Cloud Services (wsparcie dodatkowe).

    "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

     SourceVault to identyfikator zasobu usługi ARM do magazynu kluczy. Te informacje można znaleźć, lokalizując identyfikator zasobu w sekcji właściwości magazynu kluczy.

    • Element certificateUrl można znaleźć, przechodząc do certyfikatu w magazynie kluczy oznaczonym jako Identyfikator wpisu tajnego. 
    • element certificateUrl powinien mieć postać https://{keyvault-endpoin}/secrets/{secretname}/{secret-id}
  6. Utwórz profil roli. Upewnij się, że liczba ról, nazw ról, liczby wystąpień w każdej roli i rozmiarach jest taka sama w sekcji Konfiguracja usługi (cscfg), Definicja usługi (csdef) i profil roli 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 usługi w chmurze. W tym przykładzie dodajemy pulpit zdalny i rozszerzenie diagnostyki platformy Windows Azure.

    Uwaga

    Hasło pulpitu zdalnego musi mieć długość od 8 do 123 znaków i musi spełniać co najmniej 3 wymagania dotyczące złożoności hasła z następujących: 1) Zawiera wielkie litery 2) Zawiera małe litery 3) Zawiera cyfrę 4) Zawiera znak specjalny 5) Znaki sterujące są niedozwolone

        "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 CSPKG file to deploy"
          }
        },
        "configurationSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS Uri of the service configuration (.cscfg)"
          }
        },
        "roles": {
          "type": "array",
          "metadata": {
            "description": "Roles created in the cloud service application"
          }
        },
        "wadPublicConfig_WebRole1": {
          "type": "string",
          "metadata": {
             "description": "Public configuration of Windows Azure Diagnostics extension"
          }
        },
        "wadPrivateConfig_WebRole1": {
          "type": "securestring",
          "metadata": {
            "description": "Private configuration of Windows 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. Wdróż plik szablonu i parametrów (definiujący parametry w pliku szablonu), aby utworzyć wdrożenie usługi w chmurze (wsparcie dodatkowe). Zapoznaj się z tymi przykładowymi szablonami zgodnie z wymaganiami.

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

Następne kroki