Cómo apagar una VM de Azure con un Script

 Apagar una Vm o encenderla utilizando un script no parece complejo, sin embargo, para conectarse a Azure en forma segura hay que cumplir ciertos requisitos.

En este post voy a mostrar cómo conectarse a Azure en forma segura, y sin crededenciales, para una operación sencilla como apagar una VM.

Tener presente que se utilizará autenticación basada en certificados, y los certificados expiran, por lo tanto, hay que anotar en alguna parte la fecha para renovarlo, sino nuestros script fallarán.

Este método es preferido porque evitas tener que almacenar credenciales, en especial si el tenant tiene multi factor auth (MFA) o políticas de seguridad adicionales.

Este documento está basado en los módulos de Az para Powershell

I. Instalar el módulo Az.compute

Este módulo es la nueva forma de conectarse a azure, y reemplaza a AzureRM. Los comandos de AzureRM ya no se podrán utilizar despuésd de febrero de  2024.

Ejecuta en powershell 

install-module Az.compute

Si por alguna razón recibes errores relacionados a NuGet, te recomiendo validar si ese Powershell está actualizado y se puede conectar mediante TLS 1.2 o superior. Ahora Microsoft no admite conexiones anteriores a esa versión. Para estar seguro, ejecuta primero en esa ventana de Powershell:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Una vez realizado, vuelve a ejecutar el comando de instalación, y no deberías recibir errores.

II. Instalar módulo az.resources

Este módulo es necesario para crear la aplicación en Azure

install-module az.resources

III. Importar los módulos

ejecuta los comandos 

import-module az.compute

import-module az.resources

IV. Creación del certificado autofirmado

Para crear el certificado, primero tendrás que conectarte mediante el método tradicional de credenciales.

Connect-AzAccount

Aparecerá una ventana para introducir credenciales. Una vez autorizado, te habrás conecatado a tu Tenant de Azure.

Modifica el código pde acuerdo a tu necesidad. En este caso el Subject es "ScriptAzure2021" y estará almacenado en el contenedor del usuario actual de la Máquina desde la cual vas a ejecutar los scripts remotos.

$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `

  -Subject "CN=ScriptAzure2021" `

  -KeySpec KeyExchange

$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())

#########

V. Creación del App en Azure

#El siguiente comando es para crear el ServicePrincipal.

#Modifica el DisplayName de acuerdo a tus necesidades

$sp = New-AzADServicePrincipal -DisplayName appAzure001 `

  -CertValue $keyValue `

  -EndDate $cert.NotAfter `

  -StartDate $cert.NotBefore


##Espera un minuto antes de continuar. Puedes ingresar al portal Azure, y ver si se creó la App.

## Revisa en "Enterprise Applications - All applications"

VI. Asignación de permisos

Si necesitas realizar cambios en las VM, como apagar o encender, recomiendo el rol Contributor, pero puedes elegir otro. Este es el nivel de permisos que tendrá tu conexión de Scripts.

New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $sp.ApplicationId


VII. Probar conexión

Para probar la conexión, y crear tu script básico. Debes llenar los datos adecuadamente.

$Thumbprint = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

#corresponde al thumbprint de tu certificado autofirmado

$TenantId = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyy'

#Tu tenant ID de Azure. Lo puedes consultar ingresando a AzureAD

$ApplicationId = '00000000-0000-0000-0000-00000000'

#El application ID de tu aplicación, se puede consultar en "Enterprise Applications - All applications" y filtrando por el DisplayName. 

Connect-AzAccount -CertificateThumbprint $Thumbprint -ApplicationId $ApplicationId -Tenant $TenantId -ServicePrincipal


Ahora que estás conectado, puedes ejecutar tareas como apagar una máquina.

Stop-AzVM -ResourceGroupName "ResourceGroup11" -Name "VirtualMachine07"


Guarda tu script como archvo.ps1

Para invocar tu script, puedes usar un .bat con esta sintaxis de ejemplo:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\micarpeta\Script-ejemplo.ps1'"

Finalmente, te reitero que recuerdes que debes renovar el certificado cuando expire.


Fuentes:

Connect-AzAccount (Az.Accounts) | Microsoft Docs

Stop-AzVM (Az.Compute) | Microsoft Docs

Comments

Popular posts from this blog

Update DNS static servers in your local Network

Error 'General access denied error' (0x80070005). Starting SCVMM Resource

Powershell Scritp for Inventory VMS in Hyper-V and VMware