Exercício - Use parâmetros do bíceps com vários ambientes

Concluído

Agora que seu pipeline é implantado em ambos os ambientes, você está pronto para integrar com a API de terceiros para análises de produtos.

A equipe do seu site forneceu as chaves de API e URLs que seu site deve usar para acessar o serviço. Há valores diferentes para seus ambientes de teste e produção usarem. Nesta unidade, você atualizará seu pipeline para configurar cada um de seus ambientes com as configurações corretas para a API de revisão do produto.

Durante o processo, você:

  • Crie grupos de variáveis para cada um dos seus ambientes.
  • Atualize o pipeline para que ele escolha o grupo de variáveis correto para cada ambiente em vez de usar parâmetros de modelo.
  • Atualize seu arquivo Bicep para propagar as configurações necessárias para a API de revisão do produto.
  • Atualize o grupo de variáveis e o pipeline para definir os valores para as configurações da API de revisão do produto.
  • Analise os resultados do pipeline e as alterações no seu ambiente do Azure.

Adicionar grupos de variáveis

Como você está adicionando mais parâmetros que variam entre cada ambiente, você decide deixar de adicionar os parâmetros do pipeline diretamente aos arquivos YAML do pipeline. Em vez disso, você usará um grupo de variáveis para manter os valores de cada ambiente juntos.

  1. No navegador, vá para Biblioteca de Pipelines>.

    Screenshot of Azure DevOps that shows the Library menu item under the Pipelines category.

  2. Selecione o botão + Grupo de variáveis .

    Screenshot of the Azure DevOps library page and the button for adding a variable group.

  3. Insira ToyWebsiteTest como o nome do grupo de variáveis.

  4. Selecione o botão + Adicionar para adicionar variáveis ao grupo de variáveis. Crie duas variáveis com as seguintes configurações:

    Nome valor
    Tipo de Ambiente Teste
    ResourceGroupName ToyWebsiteTest

    Observe que você não define o nome da conexão de serviço no grupo de variáveis. Os nomes de conexão de serviço têm regras especiais sobre como podem ser especificados. Neste módulo, você usa parâmetros de modelo de pipeline.

    Screenshot of the test variable group and variables.

  5. Selecione Guardar.

  6. Selecione o botão Voltar no navegador para retornar à lista de grupos de variáveis.

  7. Adicione outro grupo de variáveis chamado ToyWebsiteProduction. Crie duas variáveis com as seguintes configurações:

    Nome valor
    Tipo de Ambiente Produção
    ResourceGroupName ToyWebsiteProdução

    Screenshot of the production variable group and variables.

    Observe que os nomes das variáveis são os mesmos para ambos os ambientes, mas os valores são diferentes.

  8. Salve o grupo de variáveis de produção.

Atualizar o modelo de pipeline de implantação para usar o grupo de variáveis

  1. No Visual Studio Code, abra o arquivo deploy.yml .

  2. Na parte superior do arquivo, remova os resourceGroupName parâmetros e serviceConnectionName . Não exclua os environmentType parâmetros ou deploymentDefaultLocation .

    parameters:
    - name: environmentType
      type: string
    - name: deploymentDefaultLocation
      type: string
      default: westus3
    
  3. Atualize o trabalho para importar o ValidateBicepCode grupo de variáveis:

    - ${{ 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. Atualize o trabalho para inferir automaticamente o ValidateBicepCode nome da conexão de serviço com base no valor do environmentType parâmetro:

    - ${{ 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. Atualize o trabalho para usar o grupo de variáveis importado para definir o ValidateBicepCode nome do grupo de recursos e os argumentos de tipo de ambiente para a tarefa de implantação:

    - ${{ 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. Faça as alterações no PreviewAzureChanges trabalho:

    - ${{ 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. Faça as mesmas alterações no trabalho de Deploy implantação:

    - 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. Verifique se o arquivo deploy.yml agora se parece com o código a seguir:

    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 as alterações ao ficheiro.

Atualizar a definição de pipeline para simplificar a lista de parâmetros

  1. Abra o ficheiro azure-pipelines.yml.

  2. Atualize os estágios que usam modelos para remover os resourceGroupName parâmetros e serviceConnectionName . Deixe apenas o environmentType parâmetro.

    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 as alterações ao ficheiro.

  4. Confirme suas alterações no repositório Git sem enviá-las usando os seguintes comandos:

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

Atualizar o arquivo Bicep

  1. Abra o arquivo main.bicep .

  2. Abaixo dos parâmetros que já estão no arquivo, adicione os seguintes parâmetros para a nova API de revisão:

    @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. Atualize a definição de recurso para fornecer a URL da API de appServiceApp revisão e a chave para o aplicativo, para que o código do seu site possa usá-los:

    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 as alterações ao ficheiro.

Atualizar os grupos de variáveis

  1. No navegador, vá para Biblioteca de Pipelines e abra os grupos de> variáveis ToyWebsiteTest.

  2. Adicione as seguintes variáveis:

    Nome valor
    RevisãoApiKey sandboxsecretkey
    RevisãoApiUrl https://sandbox.contoso.com/reviews
  3. Selecione o ícone de cadeado ao lado da variável ReviewApiKey . Esta etapa informa ao Azure Pipelines para tratar o valor da variável com segurança.

    Screenshot of the test variable group and the secret variable button.

  4. Salve o grupo de variáveis.

    Screenshot of the test variable group with updated variables.

  5. Atualize o grupo de variáveis ToyWebsiteProduction para adicionar um conjunto semelhante de variáveis:

    Nome valor
    RevisãoApiKey produçãosecretkey
    RevisãoApiUrl https://api.contoso.com/reviews

    Lembre-se de selecionar o ícone de cadeado ao lado da variável ReviewApiKey .

    Screenshot of the production variable group with updated variables.

  6. Salve o grupo de variáveis.

Adicionar as variáveis da API de revisão aos grupos de variáveis

  1. No Visual Studio Code, abra o arquivo deploy.yml .

  2. ValidateBicepCode No trabalho, adicione os valores dos parâmetros de revisão da API à tarefa de implantação:

    - ${{ 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. Faça a mesma alteração no PreviewAzureChanges trabalho:

    - ${{ 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

    Certifique-se de adicionar a barra invertida (\) no final da linha que define o valor do environmentType parâmetro e na linha subsequente. O \ caractere indica que outras linhas fazem parte do mesmo comando da CLI do Azure.

  4. Faça a mesma alteração no Deploy trabalho:

    - 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. Verifique se o arquivo deploy.yml agora se parece com o código a seguir:

    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 envie suas alterações para o repositório Git usando os seguintes comandos:

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

Revise os resultados da implantação

  1. No seu navegador, vá para Pipelines.

  2. Selecione a execução mais recente do seu pipeline.

    Aguarde a pausa do pipeline antes do estágio Implantar (Ambiente de Produção ). Pode levar alguns minutos para que o gasoduto chegue a este ponto.

  3. Se lhe for pedido para conceder permissão para aceder a um recurso, selecione Ver e, em seguida, selecione Permitir.

  4. Aprove a implantação no ambiente de produção selecionando Revisar Aprovar>.

    Aguarde até que o pipeline termine a execução.

  5. Selecione Ambientes de pipelines>.

  6. Selecione o Ambiente de produção .

    Observe que agora você vê várias implantações no histórico do ambiente.

  7. No browser, aceda ao Portal do Azure.

  8. Vá para o grupo de recursos ToyWebsiteProduction .

  9. Na lista de recursos, abra o aplicativo Serviço de Aplicativo do Azure.

    Selecione Configuração.

    Screenshot of the Azure portal that shows the App Service app and the Configuration menu item.

  10. Selecione Mostrar valores.

    Screenshot of the Azure portal that shows the App Service app settings and the button for showing values.

  11. Observe que os valores do site de produção para as configurações ReviewApiKey e ReviewApiUrl são definidos para os valores que você configurou no grupo de variáveis de produção.

    Screenshot of the Azure portal that shows the App Service app settings and the configuration settings.

  12. Compare os valores atuais com as definições de configuração para o aplicativo Serviço de Aplicativo no grupo de recursos ToyWebsiteTest . Observe que os valores são diferentes.

Limpar os recursos

Agora que concluiu o exercício, pode remover os recursos para não ser cobrado por eles.

No terminal de código do Visual Studio, execute os seguintes comandos:

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

O grupo de recursos é excluído em segundo plano.

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