Ejercicio: Implementación de un recurso con ámbito de suscripción

Completado

Importante

Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.

El proyecto Project Teddybear está en pleno apogeo, y el equipo de I+D está esperando que le conceda acceso a la nueva suscripción de Azure. Ya ha creado la suscripción, pero antes de dar acceso al equipo, debe asegurarse de que solo implementa máquinas virtuales que cumplan las directivas del equipo. El equipo le ha dicho que no quiere implementar máquinas virtuales de las series F o G.

En este ejercicio, creará una plantilla de Bicep que configura la suscripción en función de las directivas del equipo.

Durante el proceso, hará lo siguiente:

  • Cree una plantilla de Bicep para implementarla en un ámbito de suscripción.
  • Agregue una definición y una asignación de Azure Policy.
  • Implemente la plantilla y compruebe el resultado.

Para realizar este ejercicio, es necesario que tenga permiso para implementar recursos con ámbito de suscripción. Si no puede cumplir estos requisitos con la cuenta de Azure actual, puede obtener una evaluación gratuita y crear una suscripción y un inquilino de Azure. Como alternativa, puede omitir los pasos de implementación de este ejercicio.

En este ejercicio se usa la extensión de Bicep para Visual Studio Code. Asegúrese de instalar esta extensión en Visual Studio Code.

Creación de una plantilla con ámbito de suscripción

  1. Abra Visual Studio Code.

  2. Cree un archivo con el nombre main.bicep.

  3. Guarde el archivo vacío para que Visual Studio Code cargue las herramientas de Bicep.

    Puede seleccionar Archivo>Guardar como o Ctrl+S en Windows (⌘+S en macOS). Debe acordarse de dónde ha guardado el archivo. Por ejemplo, podría crear una carpeta scripts para guardarlo ahí.

  4. Agregue el siguiente contenido al archivo main.bicep. Implementará la plantilla pronto. Es recomendable que lo escriba en lugar de copiar y pegar, de modo que pueda ver cómo las herramientas le ayudan a escribir los archivos de Bicep.

    targetScope = 'subscription'
    

    Esta línea de código indica a Bicep que la plantilla se va a implementar en un ámbito de suscripción.

Adición de una definición de directiva

  1. Debajo de la línea que acaba de agregar, agregue la siguiente definición de variable:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. En la parte inferior del archivo, agregue la siguiente definición de Azure Policy:

    resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
      name: policyDefinitionName
      properties: {
        policyType: 'Custom'
        mode: 'All'
        parameters: {}
        policyRule: {
          if: {
            allOf: [
              {
                field: 'type'
                equals: 'Microsoft.Compute/virtualMachines'
              }
              {
                anyOf: [
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_F*'
                  }
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_G*'
                  }
                ]
              }
            ]
          }
          then: {
            effect: 'deny'
          }
        }
      }
    }
    

    Tenga en cuenta que la definición de la directiva solo se aplica a los recursos en los que:

    • El tipo de recurso es igual a Microsoft.Compute/virtualMachines.
    • La propiedad sku.namepuede comenzar por Standard_F o Standard_G.

    Al intentar crear un recurso que coincida con estas condiciones, Azure denegará la creación del recurso.

    Advertencia

    Tenga cuidado al usar el efecto de la directiva de denegación para las definiciones de directiva, especialmente en ámbitos amplios, como suscripciones y grupos de administración. Si la definición no se crea correctamente, puede tener efectos inesperados que pueden provocar interrupciones. Es mejor empezar con el efecto de directiva de auditoría y, a continuación, cambiar al efecto de denegación solo después de que haya visto que funciona bien durante un tiempo.

    Va a crear la definición de directiva en el ámbito de la suscripción. Esto significa que, una vez implementada la definición, estará disponible en todos los grupos de recursos de la suscripción.

Asignación de la directiva

Una definición de directiva no tiene ningún efecto hasta que se aplica. En este paso, implementa un segundo recurso con ámbito de suscripción que aplica la definición de directiva a la suscripción.

  1. Debajo de la definición de variable policyDefinitionName, agregue la siguiente definición de variable:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. En la parte inferior del archivo, en el recurso de definición de directiva, agregue la siguiente asignación de directiva:

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    

    Tenga en cuenta que no configura explícitamente la asignación de directiva para que se aplique a toda la suscripción. Bicep lo entiende, porque la plantilla se implementará en el ámbito de la suscripción.

  3. Guarde los cambios en el archivo.

Comprobación de la plantilla

La plantilla debe tener un aspecto parecido al siguiente:

targetScope = 'subscription'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

Si no es así, copie el ejemplo o ajuste la plantilla para que coincida con él.

Implementación de la plantilla

Para implementar esta plantilla en Azure, debe iniciar sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de que ha instalado las herramientas de la CLI de Azure.

  1. En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.

  2. Si la ventana del terminal muestra bash en el lado derecho, significa que el shell correcto ya está abierto. Como alternativa, si ve un icono de shell de bash a la derecha, puede seleccionarlo para iniciar el shell.

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la opción bash.

    Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Bash de Git.

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la lista desplegable de shell de terminal y la selección de Git Bash (valor predeterminado).

  3. En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:

    cd templates
    

Instalación de Bicep

Ejecute el comando siguiente para asegurarse de que tiene la versión más reciente de Bicep:

az bicep install && az bicep upgrade

Inicio de sesión en Azure mediante la CLI de Azure

  1. En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:

    az login
    
  2. En el explorador que se abre, inicie sesión en su cuenta de Azure.

    En el terminal de Visual Studio Code se muestra una lista de las suscripciones asociadas a esta cuenta.

  3. En la lista, busque la suscripción que desea usar para este ejercicio.

    Si ha perdido la lista del inicio de sesión, puede usar el siguiente fragmento de código para enumerar de nuevo las suscripciones.

    az account list --output table
    
  4. Establezca la suscripción predeterminada para todos los comandos de la CLI de Azure que ejecute en esta sesión.

    az account set --subscription "Your Subscription Name or ID"
    

Para implementar esta plantilla en Azure, inicie sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de que ha instalado Azure PowerShell.

  1. En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.

  2. Si la ventana del terminal muestra pwsh o powershell en el lado derecho, significa que el shell correcto ya está abierto. Como alternativa, si ve un icono de shell de PowerShell a la derecha, puede seleccionarlo para iniciar el shell.

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la opción pwsh en la lista desplegable de shell.

    Si aparece un shell distinto de pwsh o PowerShell, seleccione la flecha desplegable del shell y, después, seleccione PowerShell.

    Captura de pantalla de la ventana del terminal de Visual Studio Code, en la que se muestra la lista desplegable del shell del terminal y PowerShell seleccionado.

  3. En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:

    Set-Location -Path templates
    

Instalación de la CLI de Bicep

Para usar Bicep desde Azure PowerShell, instale la CLI de Bicep.

Inicio de sesión en Azure mediante Azure PowerShell

  1. En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:

    Connect-AzAccount
    
  2. En el explorador que se abre, inicie sesión en su cuenta de Azure.

  3. Para obtener el identificador de la suscripción que desea usar para este ejercicio, ejecute el siguiente comando:

    Get-AzSubscription
    

    El identificador de la suscripción es la segunda columna. Copie la segunda columna. Es similar a aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.

  4. Establezca la suscripción predeterminada para todos los comandos de Azure PowerShell que ejecute en esta sesión.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Implementación de la plantilla en Azure

En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de la CLI de Azure:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

Tenga en cuenta que va a crear una implementación con ámbito de suscripción mediante el comando az deployment sub create, en lugar del comando az deployment group create al que podría estar acostumbrado.

En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de Azure PowerShell:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

Tenga en cuenta que va a crear una implementación con ámbito de suscripción mediante el cmdlet New-AzSubscriptionDeployment, en lugar del cmdlet New-AzResourceGroupDeployment al que podría estar acostumbrado.

Observe también que especifica explícitamente un nombre y una ubicación para la implementación. Azure usa esta información para almacenar los metadatos de implementación.

Sugerencia

El nombre de la implementación incluye la fecha de hoy. Esto hace que sea menos probable que use accidentalmente el mismo nombre que otra implementación.

La implementación puede tardar un par de minutos en completarse; después, verá que la implementación se ha realizado correctamente.

Nota:

Si recibe un mensaje de error con el código AuthorizationFailed, es probable que no tenga permiso para implementar recursos con ámbito de suscripción. Pida al administrador de Azure que le conceda los permisos. Por otro lado, si no puede cumplir estos requisitos con la cuenta de Azure actual, puede obtener una evaluación gratuita y crear una suscripción y un inquilino de Azure.

Comprobación de la implementación

Puede ver las implementaciones con ámbito de suscripción en Azure Portal. Esto puede ser útil para comprobar que la implementación ha finalizado correctamente e inspeccionar los resultados.

  1. Vaya a Azure Portal.

  2. En el panel izquierdo, seleccione Suscripciones.

  3. Seleccione su suscripción.

  4. En el cuadro Buscar, escriba Implementaciones y, a continuación, seleccione el elemento de menú Implementaciones.

    Captura de pantalla del cuadro Buscar de Azure Portal y el elemento de menú Implementaciones.

  5. En la columna Nombre de la implementación, seleccione la implementación que comienza por subámbito para ver qué recursos se implementaron.

    Captura de pantalla de Azure Portal interfaz que muestra la lista de implementaciones.

  6. Seleccione Detalles de implementación para expandirlo. En este caso, se presentan los dos recursos de Azure Policy.

    Captura de pantalla del panel de información general de Azure Portal para la implementación seleccionada.

Limpiar los recursos

Ha implementado correctamente recursos con ámbito de suscripción. Puede quitar los recursos de directiva que ha creado mediante la ejecución de los siguientes comandos:

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId

En la siguiente unidad de ejercicio, volverá a implementar los mismos recursos de directiva. Se volverán a crear, pero puede limpiarlos de nuevo después.