Menyebarkan Azure Cloud Services (dukungan yang diperluas) menggunakan templat ARM

Tutorial ini menjelaskan cara membuat penyebaran Cloud Service (dukungan diperpanjang) menggunakan templat ARM.

Sebelum Anda mulai

  1. Ulas prasyarat penyebaran untuk Cloud Services (dukungan yang diperluas) dan buat sumber daya terkait.

  2. Buat grup sumber daya baru menggunakan portal Microsoft Azure atau PowerShell. Langkah ini bersifat opsional jika Anda menggunakan grup sumber daya yang sudah ada.

  3. Buat akun penyimpanan baru menggunakan portal Microsoft Azure atau PowerShell. Langkah ini bersifat opsional jika Anda menggunakan akun penyimpanan yang sudah ada.

  4. Unggah file Paket (.cspkg) dan Konfigurasi Layanan (.cscfg) Anda ke akun penyimpanan menggunakan portal Microsoft Azure atau PowerShell. Dapatkan URI SAS dari kedua file untuk ditambahkan ke template ARM nanti dalam tutorial ini.

  5. (Opsional) Buat brankas kunci dan unggah sertifikat.

    • Sertifikat dapat dilampirkan ke layanan cloud untuk memungkinkan komunikasi yang aman ke dan dari layanan. Untuk menggunakan sertifikat, sidik jari mereka harus ditentukan dalam file Konfigurasi Layanan (.cscfg) Anda dan diunggah ke brankas kunci. Kubah kunci dapat dibuat melalui portal Microsoft Azure atau PowerShell.
    • Kubah kunci terkait harus berada di wilayah dan langganan yang sama dengan layanan cloud.
    • Kubah kunci terkait untuk harus diaktifkan izin yang sesuai sehingga sumber daya Microsoft Azure Cloud Services (dukungan diperpanjang) dapat mengambil sertifikat dari Key Vault. Untuk informasi selengkapnya, lihat Sertifikat dan Key Vault
    • Brankas kunci perlu direferensikan di bagian OsProfile dari templat ARM yang ditunjukkan pada langkah-langkah di bawah ini.

Menyebarkan Azure Cloud Services (dukungan yang diperluas)

Catatan

Cara yang lebih mudah dan lebih cepat untuk menghasilkan templat ARM dan file parameter Anda adalah melalui portal Microsoft Azure. Anda dapat mengunduh templat ARM yang dihasilkan melalui portal untuk membuat Cloud Service Anda melalui PowerShell

  1. Membuat jaringan virtual. Nama jaringan virtual harus cocok dengan referensi dalam file Konfigurasi Layanan (.cscfg). Jika menggunakan jaringan virtual yang ada, hilangkan bagian ini dari templat 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" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    Jika membuat jaringan virtual baru, tambahkan yang berikut ke bagian dependsOn untuk memastikan platform membuat jaringan virtual sebelum membuat layanan cloud.

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Buat alamat IP publik dan (secara opsional) atur properti label DNS alamat IP publik. Jika Anda menggunakan IP Statis, Anda perlu mereferensikannya sebagai IP Tercadangkan dalam file Konfigurasi Layanan (.cscfg). Jika menggunakan alamat IP yang ada, lewati langkah ini dan tambahkan informasi alamat IP langsung ke pengaturan konfigurasi load balancer template ARM Anda.

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

    Jika membuat alamat IP baru, tambahkan yang berikut ini ke bagian dependsOn untuk memastikan platform membuat alamat IP sebelum membuat layanan cloud.

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Buat objek Layanan Cloud (Dukungan Perpanjangan), tambahkan referensi dependsOn yang sesuai jika Anda menyebarkan Virtual Network atau IP Publik dalam templat Anda.

    {
      "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. Buat Objek Profil Jaringan untuk Layanan Cloud Anda dan kaitkan alamat IP publik ke frontend penyeimbang muatan. Load balancer secara otomatis dibuat oleh 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. Tambahkan referensi brankas kunci Anda di bagian OsProfile templat ARM. Key Vault digunakan untuk menyimpan sertifikat yang terkait dengan Cloud Services (dukungan diperluas). Tambahkan sertifikat ke Key Vault, lalu referensikan thumbprint sertifikat dalam file (.cscfg) Konfigurasi Layanan. Anda juga perlu mengaktifkan 'Kebijakan akses' Key Vault untuk 'Azure Virtual Machines untuk penyebaran' (di portal) sehingga sumber daya Cloud Services (dukungan diperluas) dapat mengambil sertifikat yang disimpan sebagai rahasia dari Key Vault. Brankas kunci terkait harus berada di wilayah dan langganan yang sama dengan layanan cloud. Untuk informasi selengkapnya, lihat menggunakan sertifikat dengan Azure Cloud Services (dukungan yang diperluas).

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

    Catatan

     SourceVault adalah ID Sumber Daya ARM ke brankas kunci Anda. Anda dapat menemukan informasi ini dengan menemukan ID Sumber Daya di bagian properti brankas kunci Anda.

    • certificateUrl dapat ditemukan dengan menavigasi ke sertifikat di brankas kunci yang berlabel Pengidentifikasi Rahasia. 
    • certificateUrl harus dari formulir https://{keyvault-endpoin}/secrets/{secretname}/{secret-id}
  6. Buat Profil Peran. Pastikan bahwa jumlah peran, nama peran, jumlah instans dalam setiap peran dan ukuran sama di seluruh Konfigurasi Layanan (.cscfg), Definisi Layanan (.csdef) dan bagian profil peran dalam templat ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Opsional) Buat profil ekstensi untuk menambahkan ekstensi ke layanan cloud Anda. Untuk contoh ini, kami menambahkan desktop jarak jauh dan ekstensi diagnostik Windows Azure.

    Catatan

    Kata sandi untuk desktop jauh harus berupa karakter antara 8-123 karakter dan harus memenuhi setidaknya 3 dari persyaratan kompleksitas kata sandi dari hal-hal berikut: 1) Berisi karakter huruf besar 2) Berisi karakter huruf kecil 3) Berisi digit numerik 4) Berisi karakter khusus 5) Karakter kontrol tidak diperbolehkan

        "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. Ulas templat lengkapnya.

    {
      "$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. Sebarkan file templat dan parameter (mendefinisikan parameter dalam file templat) untuk membuat penyebaran Cloud Service (dukungan yang diperluas). Harap lihat contoh templat ini jika diperlukan.

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

Langkah berikutnya