Ejercicio: Implementación de un recurso con ámbito de suscripción
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
Abra Visual Studio Code.
Cree un archivo con el nombre main.bicep.
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í.
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
Debajo de la línea que acaba de agregar, agregue la siguiente definición de variable:
var policyDefinitionName = 'DenyFandGSeriesVMs'
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.name
puede comenzar porStandard_F
oStandard_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.
- El tipo de recurso es igual a
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.
Debajo de la definición de variable
policyDefinitionName
, agregue la siguiente definición de variable:var policyAssignmentName = 'DenyFandGSeriesVMs'
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.
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.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
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.
Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Bash de Git.
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
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
az login
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.
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
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.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
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.
Si aparece un shell distinto de pwsh o PowerShell, seleccione la flecha desplegable del shell y, después, seleccione PowerShell.
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
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
Connect-AzAccount
En el explorador que se abre, inicie sesión en su cuenta de Azure.
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.
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.
Vaya a Azure Portal.
En el panel izquierdo, seleccione Suscripciones.
Seleccione su suscripción.
En el cuadro Buscar, escriba Implementaciones y, a continuación, seleccione el elemento de menú Implementaciones.
En la columna Nombre de la implementación, seleccione la implementación que comienza por subámbito para ver qué recursos se implementaron.
Seleccione Detalles de implementación para expandirlo. En este caso, se presentan los dos recursos de Azure Policy.
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.