Ejercicio: Refactorización de la plantilla para usar módulos

Completado

En este ejercicio, actualizará la plantilla de Bicep que creó anteriormente para que use un módulo para los recursos de Azure App Service. Los módulos ayudan a mantener más clara la intención de la plantilla principal. Puede reutilizar el módulo de App Service en otras plantillas si así lo decide.

Durante el proceso, hará lo siguiente:

  • Agregará un nuevo módulo y moverá a él los recursos de App Service.
  • Hará referencia al módulo desde la plantilla principal de Bicep.
  • Agregará una salida para el nombre de host de la aplicación de App Service y la emitirá desde las implementaciones de módulos y plantillas.
  • Probará la implementación para asegurarse de que la plantilla sea válida.

Adición de un nuevo archivo de módulo

  1. En Visual Studio Code, cree una carpeta llamada modules en la misma carpeta donde creó el archivo main.bicep. En la carpeta modules, cree un archivo llamado appService.bicep. Guarde el archivo.

  2. Agregue el siguiente contenido al archivo appService.bicep:

    param location string
    param appServiceAppName string
    
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    var appServicePlanName = 'toy-product-launch-plan'
    var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    Observe que ha copiado los parámetros y variables de la plantilla main.bicep, porque la plantilla appService.bicep debe ser independiente.

  3. Guarde los cambios en el archivo. Observe que Visual Studio Code no muestra ningún garabato rojo para indicar advertencias sobre variables o parámetros que faltan o recursos no válidos.

Adición de una referencia al módulo desde la plantilla primaria

Ahora que tiene un módulo completo para implementar los recursos de App Service, puede hacer referencia a él dentro de la plantilla primaria. Como ahora el módulo implementa los recursos de App Service, puede eliminar los recursos y variables asociados de la plantilla primaria.

  1. En el archivo main.bicep, elimine los recursos de App Service y las definiciones de variable appServicePlanName y appServicePlanSkuName. No elimine los parámetros de App Service, ya que todavía los necesita. Tampoco elimine los parámetros, las variables o los recursos de la cuenta de almacenamiento.

  2. En la parte inferior del archivo main.bicep, agregue el siguiente código de Bicep:

    module appService 'modules/appService.bicep' = {
      name: 'appService'
      params: {
        location: location
        appServiceAppName: appServiceAppName
        environmentType: environmentType
      }
    }
    

    Observe que, para especificar los parámetros del módulo, hace referencia a los parámetros de la plantilla primaria.

  3. Guarde los cambios en el archivo.

Adición del nombre de host como salida

  1. Agregue el siguiente código de Bicep en la parte inferior del archivo appService.bicep:

    output appServiceAppHostName string = appServiceApp.properties.defaultHostName
    

    Este código declara que una salida de este módulo, que se llamará appServiceAppHostName, será de tipo string. La salida tomará su valor de la propiedad defaultHostName de la aplicación de App Service.

  2. Guarde los cambios en el archivo.

    Esta salida se declara dentro de un archivo de Bicep que se usará como módulo, por lo que solo estará disponible para la plantilla primaria. También debe devolver la salida a la persona que implementó la plantilla.

  3. Abra el archivo main.bicep y agregue el código siguiente en la parte inferior:

    output appServiceAppHostName string = appService.outputs.appServiceAppHostName
    

    Observe que esta salida se declara de forma similar a la salida del módulo. Esta vez, sin embargo, se hace referencia a la salida del módulo en lugar de a una propiedad del recurso.

  4. Guarde los cambios en el archivo.

Comprobación de los archivos de Bicep

Una vez completados todos los cambios anteriores, el archivo main.bicep debe tener el siguiente aspecto:

param location string = 'eastus'
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

module appService 'modules/appService.bicep' = {
  name: 'appService'
  params: {
    location: location
    appServiceAppName: appServiceAppName
    environmentType: environmentType
  }
}

output appServiceAppHostName string = appService.outputs.appServiceAppHostName

El archivo appService.bicep debe parecerse al ejemplo siguiente:

param location string
param appServiceAppName string

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var appServicePlanName = 'toy-product-launch-plan'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

output appServiceAppHostName string = appServiceApp.properties.defaultHostName

Si alguno de los archivos no coincide, copie el ejemplo o ajuste la plantilla.

Implementación de la plantilla de Bicep actualizada

Ejecute el siguiente comando de la CLI de Azure en el terminal.

az deployment group create \
  --template-file main.bicep \
  --parameters environmentType=nonprod

Ejecute el siguiente comando de Azure PowerShell en el terminal.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -environmentType nonprod

Comprobación de la implementación

  1. En el explorador, vuelva a Azure Portal. Vaya al grupo de recursos; ahora hay dos implementaciones correctas.

  2. Seleccione el vínculo 2 Succeeded (2 correctas). Observe que tiene una implementación denominada main en la lista y una implementación nueva denominada appService.

    Captura de pantalla de la interfaz de Azure Portal de las implementaciones, donde se muestran las dos implementaciones con estados correctos.

  3. Seleccione la implementación llamada main y, después, Detalles de la implementación para expandir la lista de recursos implementados.

    Observe que nuestra implementación del módulo aparece en la lista.

    Captura de pantalla de la interfaz de Azure Portal de la implementación específica, con un recurso enumerado.

  4. Seleccione la pestaña Salidas; observe que hay una salida llamada appServiceAppHostName con el nombre de host de la aplicación de App Service. Copie el nombre de host en el Portapapeles.

    Captura de pantalla de la interfaz de Azure Portal de las salidas de la implementación específica.

  5. Abra una pestaña nueva del explorador y pegue el nombre de host que copió. Verá la página principal predeterminada de App Service.

    Captura de pantalla de la página principal predeterminada de App Service.

Felicidades. Ha implementado correctamente las bases de una buena aplicación.