Ejercicio: Uso de parámetros de Bicep con varios entornos

Completado

Ahora que la canalización se implementa en ambos entornos, está listo para integrar con la API de terceros para las revisiones de productos.

El equipo del sitio web le ha proporcionado las claves de API y las direcciones URL que el sitio web debe usar para acceder al servicio. Hay distintos valores para los entornos de prueba y producción que se van a usar. En esta unidad va a actualizar la canalización a fin de configurar cada uno de los entornos con la configuración correcta de la API de revisión de productos.

Durante el proceso, hará lo siguiente:

  • Crear grupos de variables para cada uno de los entornos.
  • Actualizar la canalización para que seleccione el grupo de variables correcto para cada entorno en lugar de usar parámetros de plantilla.
  • Actualizar el archivo de Bicep para propagar la configuración que necesita de la API de revisión de productos.
  • Actualizar el grupo de variables y la canalización para establecer los valores de la configuración de la API de revisión de productos.
  • Revisar los resultados de la canalización y los cambios en el entorno de Azure.

Incorporación de grupos de variables

Dado que va a incorporar más parámetros que varían entre entornos, decide no agregar los parámetros de canalización directamente a los archivos YAML de canalización. En lugar de eso, va a usar un grupo de variables para mantener juntos los valores de cada entorno.

  1. En el explorador, vaya a Canalizaciones>Biblioteca.

    Captura de pantalla de Azure DevOps en la que se muestra el elemento de menú Biblioteca en la categoría Canalizaciones.

  2. Seleccione el botón + Grupo de variables.

    Captura de pantalla de la página de la biblioteca de Azure DevOps y el botón para agregar un grupo de variables.

  3. Escriba ToyWebsiteTest como nombre del grupo de variables.

  4. Seleccione el botón + Agregar para agregar variables al grupo de variables. Cree dos variables con la siguiente configuración:

    Nombre Value
    EnvironmentType Prueba
    ResourceGroupName ToyWebsiteTest

    Observe que no define el nombre de la conexión de servicio en el grupo de variables. Los nombres de las conexiones de servicio tienen reglas especiales sobre cómo se pueden especificar. En este módulo usará parámetros de plantilla de canalización.

    Captura de pantalla del grupo de variables de prueba y las variables.

  5. Seleccione Guardar.

  6. Seleccione el botón Atrás en el explorador para volver a la lista de grupos de variables.

  7. Agregue otro grupo de variables de nombre ToyWebsiteProduction. Cree dos variables con la siguiente configuración:

    Nombre Value
    EnvironmentType Producción
    ResourceGroupName ToyWebsiteProduction

    Captura de pantalla del grupo de variables de producción y las variables.

    Observe que los nombres de las variables son los mismos en ambos entornos, pero los valores son diferentes.

  8. Guarde el grupo de variables de producción.

Actualización de la plantilla de canalización de implementación para usar el grupo de variables

  1. En Visual Studio Code, abra el archivo deploy.yml.

  2. En la parte superior del archivo, elimine los parámetros resourceGroupName y serviceConnectionName. No elimine los parámetros environmentType y deploymentDefaultLocation.

    parameters:
    - name: environmentType
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    
  3. Actualice el trabajo ValidateBicepCode para importar el grupo de variables:

    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
    
  4. Actualice el trabajo ValidateBicepCode para deducir automáticamente el nombre de la conexión de servicio en función del valor del parámetro environmentType:

    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ToyWebsite${{parameters.environmentType}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: $(ResourceGroupName)
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType $(EnvironmentType)
    
  5. Actualice el trabajo ValidateBicepCode para usar el grupo de variables importado a fin de establecer el nombre del grupo de recursos y los argumentos de tipo de entorno para la tarea de implementación:

    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ToyWebsite${{parameters.environmentType}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: $(ResourceGroupName)
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType $(EnvironmentType)
    
  6. Guarde los cambios en el trabajo PreviewAzureChanges:

    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ToyWebsite${{parameters.environmentType}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType)
    
  7. Realice los mismos cambios en el trabajo de implementación Deploy:

    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        variables:
        - group: ToyWebsite${{parameters.environmentType}}
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ToyWebsite${{parameters.environmentType}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: $(ResourceGroupName)
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType $(EnvironmentType)
                    deploymentOutputs: deploymentOutputs
    
  8. Compruebe que el archivo deploy.yml ahora es similar al código siguiente:

    parameters:
    - name: environmentType
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    
    stages:
    
    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ToyWebsite${{parameters.environmentType}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: $(ResourceGroupName)
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType $(EnvironmentType)
    
    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ToyWebsite${{parameters.environmentType}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType)
    
    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        variables:
        - group: ToyWebsite${{parameters.environmentType}}
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ToyWebsite${{parameters.environmentType}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: $(ResourceGroupName)
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType $(EnvironmentType)
                    deploymentOutputs: deploymentOutputs
    
                - bash: |
                    echo "##vso[task.setvariable variable=appServiceAppHostName;isOutput=true]$(echo $DEPLOYMENT_OUTPUTS | jq -r '.appServiceAppHostName.value')"
                  name: SaveDeploymentOutputs
                  displayName: Save deployment outputs into variables
                  env:
                    DEPLOYMENT_OUTPUTS: $(deploymentOutputs)
    
    - stage: SmokeTest_${{parameters.environmentType}}
      displayName: Smoke Test (${{parameters.environmentType}} Environment)
      jobs:
      - job: SmokeTest
        displayName: Smoke test
        variables:
          appServiceAppHostName: $[ stageDependencies.Deploy_${{parameters.environmentType}}.DeployWebsite.outputs['DeployWebsite.SaveDeploymentOutputs.appServiceAppHostName'] ]
        steps:
          - task: PowerShell@2
            name: RunSmokeTests
            displayName: Run smoke tests
            inputs:
              targetType: inline
              script: |
                $container = New-PesterContainer `
                  -Path 'deploy/Website.Tests.ps1' `
                  -Data @{ HostName = '$(appServiceAppHostName)' }
                Invoke-Pester `
                  -Container $container `
                  -CI
    
          - task: PublishTestResults@2
            name: PublishTestResults
            displayName: Publish test results
            condition: always()
            inputs:
              testResultsFormat: NUnit
              testResultsFiles: 'testResults.xml'
    
  9. Guarde los cambios en el archivo.

Actualización de la definición de canalización para simplificar la lista de parámetros

  1. Abra el archivo azure-pipelines.yml.

  2. Actualice las fases que usan plantillas para eliminar los parámetros resourceGroupName y serviceConnectionName. Deje solo el parámetro environmentType.

    trigger:
      batch: true
      branches:
        include:
        - main
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    
    # Lint the Bicep file.
    - stage: Lint
      jobs: 
      - template: pipeline-templates/lint.yml
    
    # Deploy to the test environment.
    - template: pipeline-templates/deploy.yml
      parameters:
        environmentType: Test
    
    # Deploy to the production environment.
    - template: pipeline-templates/deploy.yml
      parameters:
        environmentType: Production
    
  3. Guarde los cambios en el archivo.

  4. Confirme los cambios en el repositorio de Git sin insertarlos mediante los siguientes comandos:

    git add .
    git commit -m "Use variable groups"
    

Actualización del archivo de Bicep

  1. Abra el archivo main.bicep.

  2. Debajo de los parámetros que ya están en el archivo, agregue los parámetros siguientes para la nueva API de revisión:

    @description('The URL to the product review API.')
    param reviewApiUrl string
    
    @secure()
    @description('The API key to use when accessing the product review API.')
    param reviewApiKey string
    
  3. Actualice la definición de recurso appServiceApp para proporcionar la dirección URL y la clave de la API de revisión a la aplicación, de modo que el código del sitio web pueda usarlos:

    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
              value: applicationInsights.properties.InstrumentationKey
            }
            {
              name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
              value: applicationInsights.properties.ConnectionString
            }
            {
              name: 'ReviewApiUrl'
              value: reviewApiUrl
            }
            {
              name: 'ReviewApiKey'
              value: reviewApiKey
            }
          ]
        }
      }
    }
    
  4. Guarde los cambios en el archivo.

Actualización de los grupos de variables

  1. En el explorador, vaya a Canalizaciones>Biblioteca y abra los grupos de variables ToyWebsiteTest.

  2. Agregue las siguientes variables:

    Nombre Value
    ReviewApiKey sandboxsecretkey
    ReviewApiUrl https://sandbox.contoso.com/reviews
  3. Seleccione el icono de candado junto a la variable ReviewApiKey. Este paso indica a Azure Pipelines que trate el valor de la variable de forma segura.

    Captura de pantalla del grupo de variables de prueba y el botón de variable secreta.

  4. Guarde el grupo de variables.

    Captura de pantalla del grupo de variables de prueba con las variables actualizadas.

  5. Actualice el grupo de variables ToyWebsiteProduction para agregar un conjunto similar de variables:

    Nombre Value
    ReviewApiKey productionsecretkey
    ReviewApiUrl https://api.contoso.com/reviews

    Acuérdese de seleccionar el icono de candado junto a la variable ReviewApiKey.

    Captura de pantalla del grupo de variables de producción con las variables actualizadas.

  6. Guarde el grupo de variables.

Incorporación de las variables de la API de revisión a los grupos de variables

  1. En Visual Studio Code, abra el archivo deploy.yml.

  2. En el trabajo ValidateBicepCode, agregue los valores de parámetro de la API de revisión a la tarea de implementación:

    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ToyWebsite${{parameters.environmentType}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: $(ResourceGroupName)
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType $(EnvironmentType)
                  -reviewApiUrl $(ReviewApiUrl)
                  -reviewApiKey $(ReviewApiKey)
    
  3. Realice el mismo cambio en el trabajo PreviewAzureChanges:

    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ToyWebsite${{parameters.environmentType}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType) \
                                 reviewApiUrl=$(ReviewApiUrl) \
                                 reviewApiKey=$(ReviewApiKey)
    

    Importante

    Asegúrese de agregar la barra diagonal inversa (\) al final de la línea que establece el valor de parámetro environmentType, y en la línea siguiente. El carácter \ indica que hay más líneas que forman parte del mismo comando de la CLI de Azure.

  4. Realice el mismo cambio en el trabajo Deploy:

    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        variables:
        - group: ToyWebsite${{parameters.environmentType}}
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ToyWebsite${{parameters.environmentType}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: $(ResourceGroupName)
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType $(EnvironmentType)
                      -reviewApiUrl $(ReviewApiUrl)
                      -reviewApiKey $(ReviewApiKey)
                    deploymentOutputs: deploymentOutputs
    
  5. Compruebe que el archivo deploy.yml ahora es similar al código siguiente:

    parameters:
    - name: environmentType
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    
    stages:
    
    - ${{ if ne(parameters.environmentType, 'Production') }}:
      - stage: Validate_${{parameters.environmentType}}
        displayName: Validate (${{parameters.environmentType}} Environment)
        jobs:
        - job: ValidateBicepCode
          displayName: Validate Bicep code
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureResourceManagerTemplateDeployment@3
              name: RunPreflightValidation
              displayName: Run preflight validation
              inputs:
                connectedServiceName: ToyWebsite${{parameters.environmentType}}
                location: ${{parameters.deploymentDefaultLocation}}
                deploymentMode: Validation
                resourceGroupName: $(ResourceGroupName)
                csmFile: deploy/main.bicep
                overrideParameters: >
                  -environmentType $(EnvironmentType)
                  -reviewApiUrl $(ReviewApiUrl)
                  -reviewApiKey $(ReviewApiKey)
    
    - ${{ if eq(parameters.environmentType, 'Production') }}:
      - stage: Preview_${{parameters.environmentType}}
        displayName: Preview (${{parameters.environmentType}} Environment)
        jobs:
        - job: PreviewAzureChanges
          displayName: Preview Azure changes
          variables:
          - group: ToyWebsite${{parameters.environmentType}}
          steps:
            - task: AzureCLI@2
              name: RunWhatIf
              displayName: Run what-if
              inputs:
                azureSubscription: ToyWebsite${{parameters.environmentType}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group what-if \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType) \
                                 reviewApiUrl=$(ReviewApiUrl) \
                                 reviewApiKey=$(ReviewApiKey)
    
    - stage: Deploy_${{parameters.environmentType}}
      displayName: Deploy (${{parameters.environmentType}} Environment)
      jobs:
      - deployment: DeployWebsite
        displayName: Deploy website
        variables:
        - group: ToyWebsite${{parameters.environmentType}}
        environment: ${{parameters.environmentType}}
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
    
                - task: AzureResourceManagerTemplateDeployment@3
                  name: DeployBicepFile
                  displayName: Deploy Bicep file
                  inputs:
                    connectedServiceName: ToyWebsite${{parameters.environmentType}}
                    deploymentName: $(Build.BuildNumber)
                    location: ${{parameters.deploymentDefaultLocation}}
                    resourceGroupName: $(ResourceGroupName)
                    csmFile: deploy/main.bicep
                    overrideParameters: >
                      -environmentType $(EnvironmentType)
                      -reviewApiUrl $(ReviewApiUrl)
                      -reviewApiKey $(ReviewApiKey)
                    deploymentOutputs: deploymentOutputs
    
                - bash: |
                    echo "##vso[task.setvariable variable=appServiceAppHostName;isOutput=true]$(echo $DEPLOYMENT_OUTPUTS | jq -r '.appServiceAppHostName.value')"
                  name: SaveDeploymentOutputs
                  displayName: Save deployment outputs into variables
                  env:
                    DEPLOYMENT_OUTPUTS: $(deploymentOutputs)
    
    - stage: SmokeTest_${{parameters.environmentType}}
      displayName: Smoke Test (${{parameters.environmentType}} Environment)
      jobs:
      - job: SmokeTest
        displayName: Smoke test
        variables:
          appServiceAppHostName: $[ stageDependencies.Deploy_${{parameters.environmentType}}.DeployWebsite.outputs['DeployWebsite.SaveDeploymentOutputs.appServiceAppHostName'] ]
        steps:
          - task: PowerShell@2
            name: RunSmokeTests
            displayName: Run smoke tests
            inputs:
              targetType: inline
              script: |
                $container = New-PesterContainer `
                  -Path 'deploy/Website.Tests.ps1' `
                  -Data @{ HostName = '$(appServiceAppHostName)' }
                Invoke-Pester `
                  -Container $container `
                  -CI
    
          - task: PublishTestResults@2
            name: PublishTestResults
            displayName: Publish test results
            condition: always()
            inputs:
              testResultsFormat: NUnit
              testResultsFiles: 'testResults.xml'
    
  6. Confirme e inserte los cambios en el repositorio de Git mediante los siguientes comandos:

    git add .
    git commit -m "Add new review API settings to Bicep file and pipeline"
    git push
    

Revisión de los resultados de la implementación

  1. En el explorador, vaya a Canalizaciones.

  2. Seleccione la ejecución más reciente de la canalización.

    Espere a que la canalización se ponga en pausar antes de la fase Implementación (entorno de producción). La canalización puede tardar unos minutos en llegar a este punto.

  3. Si se le pide que conceda permiso para acceder a un recurso, seleccione Ver y, a continuación, seleccione Permitir.

  4. Apruebe la implementación en el entorno de producción; para ello, seleccione el botón Revisar>Aprobar.

    Espere a que finalice la ejecución de la canalización.

  5. Seleccione Canalizaciones>Entornos.

  6. Seleccione el entorno Producción.

    Observe que ahora se ven varias implementaciones en el historial del entorno.

  7. En el explorador, vaya a Azure Portal.

  8. Vaya al grupo de recursos ToyWebsiteProduction.

  9. En la lista de recursos, abra la aplicación Azure App Service.

    Seleccione Configuración.

    Captura de pantalla de Azure Portal en la que se muestra la aplicación App Service y el elemento de menú Configuración.

  10. Seleccione Mostrar valores.

    Captura de pantalla de Azure Portal en la que se muestra la configuración de la aplicación App Service y el botón para mostrar valores.

  11. Observe que los valores del sitio de producción para las opciones ReviewApiKey y ReviewApiUrl se establecen en los valores configurados en el grupo de variables de producción.

    Captura de pantalla de Azure Portal en la que se muestra la configuración de la aplicación App Service y las opciones de configuración.

  12. Compare los valores actuales con las opciones de configuración de la aplicación App Service en el grupo de recursos ToyWebsiteTest. Observe que los valores son diferentes.

Limpiar los recursos

Ahora que ha completado el ejercicio, puede quitar los recursos para que no se le facturen.

En el terminal de Visual Studio Code, ejecute los comandos siguientes:

az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait

El grupo de recursos se elimina en segundo plano.

Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force