Partager via


Déployer Azure Cloud Services (support étendu) en utilisant un modèle ARM

Cet article explique comment utiliser un modèle Azure Resource Manager (modèle ARM) pour créer un déploiement Azure Cloud Services (support étendu).

Prérequis

Effectuez les étapes suivantes en tant que conditions préalables à la création de votre déploiement à l’aide de modèles ARM.

  1. Consultez les prérequis du déploiement de Cloud Services (support étendu) et créez les ressources associées.

  2. Créez un groupe de ressources à l’aide du Portail Azure ou d’Azure PowerShell. Cette étape est facultative si vous utilisez un groupe de ressources existant.

  3. Créez un compte de stockage à l’aide du Portail Azure ou d’Azure PowerShell. Cette étape est facultative si vous utilisez un compte de stockage existant.

  4. Chargez le fichier de package (.cspkg ou .zip) et le fichier de configuration (.cscfg) sur le compte de stockage à l’aide du Portail Azure ou d’Azure PowerShell. Enregistrez les URI de signature d’accès partagé (SAP) pour les deux fichiers à ajouter au modèle ARM dans une étape ultérieure.

  5. (Facultatif) Créez un coffre de clés et chargez les certificats.

    • Vous pouvez attacher des certificats à votre déploiement pour une communication sécurisée vers et depuis le service. Si vous utilisez des certificats, les empreintes de certificat doivent être spécifiées dans votre fichier de configuration (.cscfg) et être chargées dans un coffre de clés. Vous pouvez créer un coffre de clés à l’aide du Portail Azure ou d’Azure PowerShell.
    • Le coffre de clés associé doit se trouver dans la même région et dans le même abonnement que votre déploiement Cloud Services (support étendu).
    • Le coffre de clés associé doit disposer des autorisations appropriées afin que les ressources Cloud Services (support étendu) puissent récupérer des certificats à partir du coffre de clés. Pour plus d’informations, consultez Utilisation de certificats avec Cloud Services (support étendu).
    • Le coffre de clés doit être référencé dans la section osProfile du modèle ARM, comme indiqué dans une étape ultérieure.

Déployer Azure Cloud Services (support étendu)

Pour déployer Cloud Services (support étendu) à l’aide d’un modèle :

Remarque

Un moyen plus simple et plus rapide de générer votre modèle ARM et votre fichier de paramètres consiste à utiliser le Portail Azure. Vous pouvez télécharger le modèle ARM généré sur le Portail pour créer votre instance Cloud Services (support étendu) via Azure PowerShell.

  1. Créez un réseau virtuel. Le nom du réseau virtuel doit correspondre aux références de réseau virtuel figurant dans le fichier de configuration (.cscfg). Si vous utilisez un réseau virtuel existant, omettez cette section dans le modèle 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" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    Si vous créez un réseau virtuel, ajoutez les lignes suivantes à la section dependsOn pour vous assurer que la plateforme crée le réseau virtuel avant de créer l’instance Cloud Services (support étendu) :

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Créez une adresse IP publique et (éventuellement) définissez sa propriété d’étiquette DNS. Si vous utilisez une adresse IP statique, vous devez la référencer en tant qu’adresse IP réservée dans le fichier de configuration (.cscfg). Si vous utilisez une adresse IP existante, ignorez cette étape et ajoutez les informations d’adresse IP directement dans les paramètres de configuration de l’équilibreur de charge de votre modèle 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" 
          } 
        } 
    ] 
    

    Si vous créez une adresse IP, ajoutez les lignes suivantes à la section dependsOn pour vous assurer que la plateforme crée l’adresse IP avant de créer l’instance Cloud Services (support étendu) :

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Créez un objet Cloud Services (support étendu). Ajoutez des références dependsOn pertinentes si vous déployez des réseaux virtuels ou des IP publiques dans votre modèle.

    {
      "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. Créez un objet de profil réseau pour votre déploiement et associez l’IP publique au serveur front-end de l’équilibreur de charge. La plateforme Azure crée automatiquement un équilibreur de charge.

    "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. Ajoutez votre référence de coffre de clés dans la section osProfile du modèle ARM. Un coffre de clés stocke les certificats associés à Cloud Services (support étendu). Ajoutez les certificats à un coffre de clés, puis référencez les empreintes de certificat dans le fichier de configuration (.cscfg). Définissez également la stratégie d’accès au coffre de clés pour les machines virtuelles Azure pour le déploiement sur le Portail Azure afin que la ressource Cloud Services (support étendu) puisse récupérer les certificats stockés en tant que secrets dans le coffre de clés. Le coffre de clés doit se trouver dans la même région et le même abonnement que votre ressource Cloud Services (support étendu) et avoir un nom unique. Pour plus d’informations, consultez Utilisation de certificats avec Cloud Services (support étendu).

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

    Remarque

    sourceVault dans le modèle ARM est la valeur de l’ID de ressource de votre coffre de clés. Vous pouvez obtenir ces informations en recherchant l’ID de ressource dans la section Propriétés de votre coffre de clés.

    • Vous pouvez obtenir la valeur pour certificateUrl en accédant au certificat dans le coffre de clés qui est étiqueté Identificateur de secret. 
    • certificateUrl doit être de la forme https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Créez un profil de rôle. Vérifiez que le nombre de rôles, le nombre d’instances dans chaque rôle, les noms de rôles et les tailles de rôle sont identiques dans le fichier de configuration (.cscfg), le fichier de définition (.csdef) et la section roleProfile du modèle ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Facultatif) Créez un profil d’extension pour ajouter des extensions à votre déploiement Cloud Services (support étendu). L’exemple suivant ajoute l’extension RDP (Remote Desktop Protocol) et l’extension Diagnostics Azure.

    Remarque

    Le mot de passe pour RDP doit contenir de 8 à 123 caractères et doit satisfaire au moins trois des exigences suivantes en matière de complexité du mot de passe :

    Contenir un caractère majuscule.
    Contenir un caractère minuscule.
    Contenir un chiffre numérique.
    Contient un caractère spécial.
    Ne pas contenir de caractère de contrôle.

        "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. Passez en revue l’ensemble du modèle :

    {
      "$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 virtual 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. Pour créer le déploiement de Cloud Services (support étendu), déployez le fichier de modèle et de paramètres (pour définir des paramètres dans le fichier de modèle). Vous pouvez utiliser les exemples de modèles.

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