Compartir a través de


Implementación de Cloud Services (soporte extendido) mediante una plantilla de ARM

En este artículo se muestra cómo usar una plantilla de Azure Resource Manager (plantilla de ARM) para crear una implementación de Azure Cloud Services (soporte extendido).

Requisitos previos

Complete los pasos siguientes como requisitos previos para crear la implementación mediante plantillas de ARM.

  1. Consulte los requisitos previos de implementación de Cloud Services (soporte extendido) y cree los recursos necesarios.

  2. Cree un nuevo grupo de recursos mediante Azure Portal o Azure PowerShell. Este paso es opcional si se usa un grupo de recursos existente.

  3. Cree una cuenta de almacenamiento mediante Azure Portal o Azure PowerShell. Este paso es opcional si se usa una cuenta de almacenamiento existente.

  4. Cargue el archivo y la configuración del paquete (.cspkg o .zip) (.cscfg) en la cuenta de almacenamiento mediante Azure Portal o Azure PowerShell. Guarde los URI de firma de acceso compartido (SAS) para ambos archivos para agregarlos a la plantilla de ARM en un paso posterior.

  5. (Opcional) Cree un almacén de claves y cargue los certificados.

    • Puede adjuntar certificados a la implementación para una comunicación segura hacia y desde el servicio. Si usa certificados, las huellas digitales del certificado deben especificarse en el archivo de configuración (.cscfg) y cargarse en un almacén de claves. Puede crear un almacén de claves mediante Azure Portal o Azure PowerShell.
    • El almacén de claves asociado debe estar en la misma región y suscripción que la implementación de Cloud Services (soporte extendido).
    • El almacén de claves asociado debe tener los permisos pertinentes para que los recursos de Cloud Services (soporte extendido) puedan recuperar certificados del almacén de claves. Para más información, consulte Uso de certificados con Cloud Services (soporte extendido).
    • Se debe hacer referencia al almacén de claves en la sección osProfile de la plantilla de ARM, como se muestra en un paso posterior.

Implementación de Cloud Services (soporte extendido)

Para implementar Cloud Services (soporte extendido) mediante una plantilla:

Nota:

Una manera más sencilla y rápida de generar la plantilla de ARM y el archivo de parámetros es mediante el uso de Azure Portal. Puede descargar la plantilla de ARM generada en el portal para crear Cloud Services (soporte extendido) mediante Azure PowerShell.

  1. Cree una red virtual. El nombre de la red virtual debe coincidir con las referencias de red virtual en el archivo de configuración (.cscfg). Si usa una red virtual existente, omita esta sección de la plantilla de 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 crea una nueva red virtual, agregue las siguientes líneas a la sección dependsOn para asegurarse de que la plataforma crea la red virtual antes de crear la instancia de Cloud Services (soporte extendido):

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. Cree una dirección IP pública y, si lo desea, establezca la propiedad de la etiqueta DNS de la dirección IP pública. Si usa una dirección IP estática, debe hacer referencia a ella como una dirección IP reservada en el archivo de configuración (.cscfg). Si usa una dirección IP existente, omita este paso y agregue la información de la dirección IP directamente en la configuración del equilibrador de carga de la plantilla de 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 crea una nueva dirección IP, agregue las siguientes líneas a la sección dependsOn para asegurarse de que la plataforma crea la dirección IP antes de crear la instancia de Cloud Services (soporte extendido):

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. Cree un objeto de Cloud Services (soporte extendido). Agregue referencias de dependsOn pertinentes si implementa redes virtuales o direcciones IP públicas en la plantilla.

    {
      "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. Cree un objeto de perfil de red para la implementación y asocie la dirección IP pública con el front-end del equilibrador de carga. La plataforma Azure crea automáticamente un equilibrador de carga.

    "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. Agregue la referencia al almacén de claves en la sección osProfile de la plantilla de ARM. Un almacén de claves almacena certificados asociados a Cloud Services (soporte extendido). Agregue los certificados al almacén de claves y, a continuación, haga referencia a las huellas digitales del certificado en el archivo de configuración (.cscfg). Además, establezca la directiva de acceso del almacén de claves para Azure Virtual Machines para la implementación en Azure Portal para que el recurso de Cloud Services (soporte extendido) pueda recuperar los certificados que se almacenan como secretos en el almacén de claves. El almacén de claves debe estar en la misma región y suscripción que el recurso de Cloud Services (soporte extendido) y tener un nombre único. Para más información, consulte Uso de certificados con Cloud Services (soporte extendido).

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

    Nota:

     El sourceVault en la plantilla de ARM es el valor del identificador de recurso del almacén de claves. Para obtener esta información, busque Id. de recurso en la sección Propiedades del almacén de claves.

    • Para obtener el valor de certificateUrl, vaya al certificado en el almacén de claves con la etiqueta Identificador secreto. 
    • certificateUrl debe tener la forma de https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}.
  6. Cree un perfil de rol. Asegúrese de que el número de roles, el número de instancias en cada rol, los nombres de rol y los tamaños de rol son los mismos en el archivo de configuración (.cscfg), el archivo de definición (.csdef) y la sección roleProfile en la plantilla de ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (Opcional) Cree un perfil de extensión para agregar extensiones a la implementación de Cloud Services (soporte extendido). En el siguiente ejemplo se agrega la extensión Protocolo de escritorio remoto (RDP) y la extensión Azure Diagnostics.

    Nota:

    La contraseña para el RDP debe tener entre 8 y 123 caracteres y debe cumplir al menos tres de los siguientes requisitos de complejidad de contraseña:

    Contiene una letra mayúscula.
    Contiene una letra minúscula.
    Contiene un dígito numérico.
    Contiene un carácter especial
    No puede contener un carácter de control.

        "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. Revise la plantilla completa:

    {
      "$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. Para crear la implementación de Cloud Services (soporte extendido), implemente la plantilla y el archivo de parámetros (para definir parámetros en el archivo de plantilla). Puede usar estas plantillas de ejemplo.

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