Ejercicio: Incorporación de lógica condicional a las plantillas de ARM
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
.
En Visual Studio Code, cree un archivo llamado condition.json en el mismo directorio que contiene azuredeploy.json.
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.
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.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
.
En Visual Studio Code, cree un archivo llamado condition.json en el mismo directorio que contiene azuredeploy.json.
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.
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.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.