Ejercicio: Incorporación de lógica condicional a las plantillas de ARM

Completado

En los ejercicios anteriores trabajamos con máquinas virtuales Linux. En este caso, se cambia un poco de tema y se centra en la administración de las cuentas de almacenamiento.

Supongamos que tiene tres entornos en los que ha de realizar la implementación: dev, staging y production.

  • El entorno dev es el primer lugar donde se reúne todo lo que necesita la aplicación. Este entorno puede incluir servidores web, un equilibrador de carga y una base de datos.
  • En el entorno staging es donde se realizan las pruebas finales antes de que se publiquen nuevas características de aplicación para los usuarios finales.
  • El entorno production es donde los usuarios finales acceden a la aplicación.

A medida que pase de dev a production necesitará una infraestructura adicional. Por ejemplo, en production, se necesita una cuenta de almacenamiento adicional que no es necesaria en los entornos anteriores.

En este caso, se usa una condición para controlar cuándo se aprovisiona una cuenta de almacenamiento. Esto le permite admitir cada uno de los entornos de la infraestructura desde la misma plantilla de ARM.

Creación de la plantilla de Resource Manager

Aquí crearemos una plantilla de Azure Resource Manager (ARM) que define un recurso de la cuenta de almacenamiento.

La plantilla también define dos parámetros:

  • environment: nombre del entorno actual.
  • storageAccountName: nombre de la cuenta de almacenamiento.

environment puede mostrar uno de los tres valores siguientes: dev, staging o production. La condición aprovisiona la cuenta de almacenamiento solo cuando environment es igual a production.

  1. En Visual Studio Code, cree un archivo llamado condition.json en el mismo directorio que contiene azuredeploy.json.

  2. Agregue este contenido a condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Aquí implementará una plantilla de ARM, con una construcción de condición, mediante PowerShell y el módulo AZ.

Aprovisionamiento del entorno de desarrollo

En este caso, implemente la plantilla de ARM en el entorno dev. Para ello, hay que establecer el parámetro de plantilla environment en dev.

Dado que la condición aprovisiona la cuenta de almacenamiento solo cuando environment es igual a production, se espera que la plantilla no aprovisione la cuenta de almacenamiento. En otras palabras, se espera una implementación que no contenga ningún recurso.

  1. Cree una variable de PowerShell que contenga el nombre de la cuenta de almacenamiento.

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    El nombre de la cuenta de almacenamiento debe ser único. El elemento Get-Random garantiza que el nombre de la cuenta de almacenamiento finaliza en una serie aleatoria de números.

  2. Ejecute el comando New-AzResourceGroupDeployment siguiente para implementar la plantilla en el entorno dev:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment dev
    

Comprobación de la implementación en desarrollo

Recuerde que espera que la plantilla no haya aprovisionado la cuenta de almacenamiento.

Para tener la certeza, ejecute el comando Get-AzStorageAccount para comprobar si el nombre de la cuenta de almacenamiento ya está en uso.

Ejecute el comando Get-AzStorageAccount:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

La salida será similar a esta:

Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

Esto le indica que aún no se ha aprovisionado la cuenta de almacenamiento. Esto se espera porque todavía no se ha implementado en el entorno de producción.

Aprovisionamiento del entorno de producción

En este caso, se implementa la plantilla de ARM en el entorno production, de manera similar a como lo hizo para el entorno dev.

Como recordatorio, este es el aspecto de la condición en la plantilla:

"condition": "[equals(parameters('environment'),'production')]"

Para desencadenar esta condición, establezca el parámetro de plantilla environment en production.

Ejecute el comando New-AzResourceGroupDeployment siguiente para implementar la plantilla en el entorno production:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment production

Comprobación de la implementación en producción

Esta vez, espera que la plantilla haya aprovisionado la cuenta de almacenamiento.

Para tener la certeza, vuelva a ejecutar el comando Get-AzStorageAccount para comprobar que el nombre de la cuenta de almacenamiento está en uso.

Ejecute el comando Get-AzStorageAccount siguiente:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

Esta vez obtendrá una salida diferente. En lugar de un mensaje de error, muestra la salida de esta tabla con información sobre el recurso de la cuenta de almacenamiento:

La salida será similar a esta:

Location Name              Type                              Kind
-------- ----              ----                              ----
westus   tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2

Estos valores indican que la cuenta de almacenamiento se ha aprovisionado tal como se espera.

Aunque este es un ejemplo básico, se muestra cómo realizar la implementación en función de una condición.

En la práctica, los entornos dev, staging y production contendrían recursos adicionales de Azure para satisfacer las necesidades de proceso, red y almacenamiento. Es probable que cada entorno se administre a través de su propio grupo de recursos para que se pueda aprovisionar y tratar como una sola unidad.

Creación de la plantilla de Resource Manager

Aquí crearemos una plantilla de Azure Resource Manager (ARM) que define un recurso de la cuenta de almacenamiento.

La plantilla también define dos parámetros:

  • environment: nombre del entorno actual.
  • storageAccountName: nombre de la cuenta de almacenamiento.

environment puede mostrar uno de los tres valores siguientes: dev, staging o production. La condición aprovisiona la cuenta de almacenamiento solo cuando environment es igual a production.

  1. En Visual Studio Code, cree un archivo llamado condition.json en el mismo directorio que contiene azuredeploy.json.

  2. Agregue este contenido a condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Aprovisionamiento del entorno de desarrollo

En este caso, implemente la plantilla de ARM en el entorno dev. Para ello, hay que establecer el parámetro de plantilla environment en dev.

Dado que la condición aprovisiona la cuenta de almacenamiento solo cuando environment es igual a production, se espera que la plantilla no aprovisione la cuenta de almacenamiento. En otras palabras, se espera una implementación que no contenga ningún recurso.

  1. Cree una variable de Bash que contenga el nombre de la cuenta de almacenamiento.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    El nombre de la cuenta de almacenamiento debe ser único. El elemento $RANDOM garantiza que el nombre de la cuenta de almacenamiento finaliza en una serie aleatoria de números.

  2. Ejecute el comando az deployment group create siguiente para implementar la plantilla en el entorno dev:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
    

Comprobación de la implementación en desarrollo

Recuerde que espera que la plantilla no haya aprovisionado la cuenta de almacenamiento.

Para tener la certeza, ejecute el comando az storage account check-name para comprobar si el nombre de la cuenta de almacenamiento ya está en uso.

Ejecute el comando az storage account check-name siguiente:

az storage account check-name --name $STORAGE_ACCT_NAME

Verá lo siguiente:

{
  "message": null,
  "nameAvailable": true,
  "reason": null
}

El valor de nameAvailable es true, lo que significa que el nombre de la cuenta de almacenamiento sigue disponible y aún no se ha aprovisionado. Esto se espera porque todavía no se ha implementado en el entorno de producción.

Aprovisionamiento del entorno de producción

En este caso, se implementa la plantilla de ARM en el entorno production, de manera similar a como lo hizo para el entorno dev.

Como recordatorio, este es el aspecto de la condición en la plantilla:

"condition": "[equals(parameters('environment'),'production')]"

Para desencadenar esta condición, establezca el parámetro de plantilla environment en production.

Ejecute el comando az deployment group create siguiente para implementar la plantilla en el entorno production:

az deployment group create \
  --template-file condition.json \
  --parameters storageAccountName=$STORAGE_ACCT_NAME environment=production

Comprobación de la implementación en producción

Esta vez, espera que la plantilla haya aprovisionado la cuenta de almacenamiento.

Para tener la certeza, vuelva a ejecutar el comando az storage account check-name para comprobar que el nombre de la cuenta de almacenamiento está en uso.

Ejecute el comando az storage account check-name siguiente:

az storage account check-name --name $STORAGE_ACCT_NAME

La salida será similar a esta:

{
  "message": "The storage account named tailwindsa32100 is already taken.",
  "nameAvailable": false,
  "reason": "AlreadyExists"
}

Estos valores indican que la cuenta de almacenamiento se ha aprovisionado tal como se espera.

Aunque este es un ejemplo básico, se muestra cómo realizar la implementación en función de una condición.

En la práctica, los entornos dev, staging y production contendrían recursos adicionales de Azure para satisfacer las necesidades de proceso, red y almacenamiento. Es probable que cada entorno se administre a través de su propio grupo de recursos para que se pueda aprovisionar y tratar como una sola unidad.