Dave Rendón Microsoft Azure MVP, embracing and fostering tech intensity to benefit society and thrive in a digital world.

Resource Manager – Tagging

4 min read

Azure Resource Manager proporciona una capa de administración consistente para el provisionamiento y administración de recursos en Azure. En este artículo veremos de qué se trata el ARM y un ejemplo de implementación sencillo.

La infraestructura para tu aplicación se compone generalmente de muchos recursos- tal vez una máquina virtual, la cuenta de almacenamiento y de red virtual, o una aplicación web, bases de datos, servidor de base de datos, y servicios de 3 ª parte.

No ves estos componentes como entidades separadas, las visualizas como partes relacionadas e interdependientes de una sola entidad.  Azure Resource Manager te permite trabajar con los recursos de tu solución como un grupo.

Se pueden implementar, actualizar o borrar todos los recursos para tu solución en una sola operación, coordinada. Se utilizan templates para el despliegue y pueden funcionar para diferentes entornos tales como testing, staging y produción. Resource Manager proporciona seguridad, auditoría y características de etiquetas para ayudarte a gestionar tus recursos después del provisionamiento.

¿Qué es un Resource Group?

Un grupo de recursos (Resource Group) te permite organizar los recursos en conjunto, para simplificar la organización, la gestión centralizada y la supervisión, el control de acceso basado en roles y etiquetado de los servicios que provisionas en Azure.

Un grupo de recursos se crea en una ubicación, como Europa Occidental. Los recursos que contiene se pueden implementar en cualquier región, como este de Estados Unidos. Un buen ejemplo podría ser un sitio web que se implementa en 5 zonas geográficas diferentes, cada uno con su propia cuenta de almacenamiento y base de datos. Un grupo de recursos ofrece la posibilidad de asignar administradores de los recursos dentro de ese grupo.

En una oferta de servicios gestionados, es posible que necesites agrupar los recursos dentro de una suscripción para gestionar de forma centralizada y restringir el acceso.

Deployment

Antes de la creación del Azure Resource Manager, habíamos utilizado la API de administración de servicios(Service Management API). Esto es, lo que se utilizaba por el antiguo portal de azure. Si has intentado eliminar una máquina virtual dentro del portal clásico (manage.windowsazure.com), tuviste que esperar hasta que se completara la tarea de borrado antes de crear una nueva.

Azure Resource Manager permite aprovisionar recursos en paralelo. También permite definir dependencias, tales como un controlador de dominio que debe ser aprovisionado con anterioridad a las máquinas virtuales que se unirán al dominio.

Los templates del Azure Resource Manager también permiten despliegues anidados. Por ejemplo, es posible combinar varias plantillas/templates en conjunto utilizando una plantilla padre.

En un entorno u oferta de servicios administrados, es probable que necesites proporcionar varias plantillas/templates que representan soluciones comunes para los usuarios finales que puedan desplegar.

En la demostración utilizaremos una plantilla para un escenario común para nuestra organización. Necesitamos dos máquinas virtuales de carga equilibrada disponibles a través del puerto 80.

Se creará un grupo de recursos que contiene los recursos de provisión. El script se encarga del provisionamiento de cada uno de los recursos que se muestra aquí.

.

#Requires -Version 3.0

Param(
  [string] [Parameter(Mandatory=$true)] $ResourceGroupLocation,
  [string] $ResourceGroupName = 'VMWithTagging',  
  [switch] $UploadArtifacts,
  [string] $StorageAccountName,
  [string] $StorageAccountResourceGroupName, 
  [string] $StorageContainerName = $ResourceGroupName.ToLowerInvariant() + '-stageartifacts',
  [string] $TemplateFile = '..\Templates\LoadBalancedVirtualMachine.json',
  [string] $TemplateParametersFile = '..\Templates\LoadBalancedVirtualMachine.param.dev.json',
  [string] $ArtifactStagingDirectory = '..\bin\Debug\staging',
  [string] $AzCopyPath = '..\Tools\AzCopy.exe',
  [string] $DSCSourceFolder = '..\DSC'
)

if (Get-Module -ListAvailable | Where-Object { $_.Name -eq 'AzureResourceManager' -and $_.Version -ge '0.9.9' }) {
    Throw "The version of the Azure PowerShell cmdlets installed on this machine are not compatible with this script.  For help updating this script visit: http://go.microsoft.com/fwlink/?LinkID=623011"
}

Import-Module Azure -ErrorAction SilentlyContinue

try {
  [Microsoft.Azure.Common.Authentication.AzureSession]::ClientFactory.AddUserAgent("VSAzureTools-$UI$($host.name)".replace(" ","_"), "2.7.1")
} catch { }

Set-StrictMode -Version 3

$OptionalParameters = New-Object -TypeName Hashtable
$TemplateFile = [System.IO.Path]::Combine($PSScriptRoot, $TemplateFile)
$TemplateParametersFile = [System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFile)

if ($UploadArtifacts)
{
    # Convert relative paths to absolute paths if needed
    $AzCopyPath = [System.IO.Path]::Combine($PSScriptRoot, $AzCopyPath)
    $ArtifactStagingDirectory = [System.IO.Path]::Combine($PSScriptRoot, $ArtifactStagingDirectory)
    $DSCSourceFolder = [System.IO.Path]::Combine($PSScriptRoot, $DSCSourceFolder)

    Set-Variable ArtifactsLocationName '_artifactsLocation' -Option ReadOnly
    Set-Variable ArtifactsLocationSasTokenName '_artifactsLocationSasToken' -Option ReadOnly

    $OptionalParameters.Add($ArtifactsLocationName, $null)
    $OptionalParameters.Add($ArtifactsLocationSasTokenName, $null)

    # Parse the parameter file and update the values of artifacts location and artifacts location SAS token if they are present
    $JsonContent = Get-Content $TemplateParametersFile -Raw | ConvertFrom-Json
    $JsonParameters = $JsonContent | Get-Member -Type NoteProperty | Where-Object {$_.Name -eq "parameters"}

    if ($JsonParameters -eq $null) {
        $JsonParameters = $JsonContent
    }
    else {
        $JsonParameters = $JsonContent.parameters
    }

    $JsonParameters | Get-Member -Type NoteProperty | ForEach-Object {
        $ParameterValue = $JsonParameters | Select-Object -ExpandProperty $_.Name

        if ($_.Name -eq $ArtifactsLocationName -or $_.Name -eq $ArtifactsLocationSasTokenName) {
            $OptionalParameters[$_.Name] = $ParameterValue.value
        }
    }

    $StorageAccountKey = (Get-AzureRMStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Key1
    $StorageAccountContext = (Get-AzureRmStorageAccount -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Context

    # Create DSC configuration archive
    if (Test-Path $DSCSourceFolder) {
    Add-Type -Assembly System.IO.Compression.FileSystem
        $ArchiveFile = Join-Path $ArtifactStagingDirectory "dsc.zip"
        Remove-Item -Path $ArchiveFile -ErrorAction SilentlyContinue
        [System.IO.Compression.ZipFile]::CreateFromDirectory($DSCSourceFolder, $ArchiveFile)
    }

    # Generate the value for artifacts location if it is not provided in the parameter file
    $ArtifactsLocation = $OptionalParameters[$ArtifactsLocationName]
    if ($ArtifactsLocation -eq $null) {
        $ArtifactsLocation = $StorageAccountContext.BlobEndPoint + $StorageContainerName
        $OptionalParameters[$ArtifactsLocationName] = $ArtifactsLocation
    }

    # Use AzCopy to copy files from the local storage drop path to the storage account container
    & $AzCopyPath """$ArtifactStagingDirectory""", $ArtifactsLocation, "/DestKey:$StorageAccountKey", "/S", "/Y", "/Z:$env:LocalAppData\Microsoft\Azure\AzCopy\$ResourceGroupName"

    # Generate the value for artifacts location SAS token if it is not provided in the parameter file
    $ArtifactsLocationSasToken = $OptionalParameters[$ArtifactsLocationSasTokenName]
    if ($ArtifactsLocationSasToken -eq $null) {
       # Create a SAS token for the storage container - this gives temporary read-only access to the container (defaults to 1 hour).
       $ArtifactsLocationSasToken = New-AzureRMStorageContainerSASToken -Container $StorageContainerName -Context $StorageAccountContext -Permission r -ExpiryTime (Get-Date).AddHours(4)
       $ArtifactsLocationSasToken = ConvertTo-SecureString $ArtifactsLocationSasToken -AsPlainText -Force
       $OptionalParameters[$ArtifactsLocationSasTokenName] = $ArtifactsLocationSasToken
    }
}

# Create or update the resource group using the specified template file and template parameters file
New-AzureRmResourceGroup -Name $ResourceGroupName -Location $ResourceGroupLocation -Tag @( @{ Name="IO Code"; Value="10101-COGS-CLOUD-MANAGED" }) -Force -Verbose

New-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateFile $TemplateFile -TemplateParameterFile $TemplateParametersFile 


                        

 Download package

Nota:

Mientras estás trabajando con ARM, te darás cuenta de que los recursos que fueron aprovisionados mediante la API de administración de servicios aparecerán como recursos. Un buen ejemplo es una red virtual provisionada a través del portal clásico, aparecerá como un recurso en el nuevo portal.

No todas las funciones de ARM se aplican a esos recursos. Por ejemplo, un recurso aprovisionado con el portal clásica no soportará el etiquetado o RBAC(ROle Based Access Control). Es importante tener en cuenta estas limitaciones al decidir cómo la migración soluciones para soportar las nuevas características.

En un entorno de servicios administrados, es posible que desees habilitar la capacidad de etiquetado. Es importante darse cuenta de que los recursos aprovisionados con la API de gestión de servicios (el clásico portal) no son compatibles con el etiquetado o RBAC.

Dave Rendón Microsoft Azure MVP, embracing and fostering tech intensity to benefit society and thrive in a digital world.

Leave a Reply

Your email address will not be published. Required fields are marked *