Esercizio - Distribuire una risorsa con ambito sottoscrizione

Completato

Importante

Per eseguire questo esercizio è necessario disporre di una propria sottoscrizione di Azure e questo potrebbe comportare dei costi. Se non hai ancora una sottoscrizione di Azure, crea un account gratuito prima di iniziare.

Il progetto Teddybear è in pieno svolgimento e il team di ricerca e sviluppo è in attesa di ricevere l'accesso alla nuova sottoscrizione di Azure. La sottoscrizione è già stata creata, ma prima di concedere l'accesso al team, è necessario assicurarsi che vengano distribuite solo le macchine virtuali conformi ai criteri del team. Il team decide di non voler distribuire macchine virtuali serie F o G.

In questo esercizio si creerà un modello Bicep che configura la sottoscrizione in base ai criteri del team.

Durante il processo, si eseguiranno queste operazioni:

  • Creare un modello Bicep da distribuire nell'ambito di una sottoscrizione.
  • Aggiungere una definizione e un’assegnazione di Criteri di Azure.
  • Distribuire il modello e verificare il risultato.

Per questo esercizio è necessario avere l'autorizzazione per distribuire risorse con ambito sottoscrizione. Se non è possibile soddisfare questo requisito con l'account Azure corrente, è possibile ottenere una versione di valutazione gratuita e creare una nuova sottoscrizione e un nuovo tenant di Azure. In alternativa, è possibile ignorare i passaggi di distribuzione in questo esercizio.

In questo esercizio viene usata l'estensione Bicep per Visual Studio Code. Assicurarsi di installare questa estensione in Visual Studio Code.

Creare un modello con ambito sottoscrizione

  1. Aprire Visual Studio Code.

  2. Creare un nuovo file denominato main.bicep.

  3. Salvare il file vuoto in modo che Visual Studio Code possa caricare gli strumenti di Bicep.

    È possibile selezionare File>Salva con nome oppure premere CTRL+S in Windows (⌘+S in macOS). Assicurarsi di ricordare dove è stato salvato il file. Ad esempio, è possibile creare una cartella scripts in cui salvarlo.

  4. Aggiungere il contenuto seguente al file main.bicep. Il modello verrà distribuito a breve. È consigliabile digitarlo manualmente invece di copiarlo e incollarlo, così si può verificare quanto risultano utili gli strumenti per la scrittura di file Bicep.

    targetScope = 'subscription'
    

    Questa riga di codice indica a Bicep che il modello verrà distribuito nell'ambito di una sottoscrizione.

Aggiungere una definizione di criteri

  1. Sotto la riga appena aggiunta, inserire la definizione di variabile seguente:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. Alla fine del file aggiungere la definizione di Criteri di Azure seguente:

    resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
      name: policyDefinitionName
      properties: {
        policyType: 'Custom'
        mode: 'All'
        parameters: {}
        policyRule: {
          if: {
            allOf: [
              {
                field: 'type'
                equals: 'Microsoft.Compute/virtualMachines'
              }
              {
                anyOf: [
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_F*'
                  }
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_G*'
                  }
                ]
              }
            ]
          }
          then: {
            effect: 'deny'
          }
        }
      }
    }
    

    Si noti che la definizione di criteri si applica solo alle risorse in cui:

    • Il tipo di risorsa è uguale a Microsoft.Compute/virtualMachines.
    • La proprietà sku.name inizia o con Standard_F oppure con Standard_G.

    Se si prova a creare una risorsa che soddisfa queste condizioni, Azure negherà l'operazione.

    Avviso

    Prestare attenzione quando si usa l'effetto del criterio deny per le definizioni di criteri, in particolare in ambiti ampi come le sottoscrizioni e i gruppi di gestione. Se la definizione non viene creata correttamente, possono verificarsi effetti imprevisti e anche interruzioni del servizio. È preferibile iniziare con l'effetto del criterio audit e quindi passare a deny dopo aver verificato se funziona bene in un periodo di tempo.

    La definizione di criteri viene creata nell'ambito della sottoscrizione. Questo significa che, dopo la distribuzione, la definizione sarà disponibile in tutti i gruppi di risorse della sottoscrizione.

Assegnare i criteri

Una definizione di criteri non ha alcun effetto finché non viene applicata. In questo passaggio si distribuirà una seconda risorsa con ambito sottoscrizione che applica la definizione di criteri alla sottoscrizione.

  1. Sotto la definizione di variabile policyDefinitionName aggiungere la definizione di variabile seguente:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. Alla fine del file, sotto la risorsa di definizione di criteri, aggiungere l'assegnazione di criteri seguente:

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    

    Si noti che l'assegnazione di criteri non viene configurata esplicitamente per l'applicazione all'intera sottoscrizione. Bicep lo riconosce perché il modello verrà distribuito nell'ambito della sottoscrizione.

  3. Salvare le modifiche apportate al file.

Verificare il modello

Il modello sarà simile al seguente:

targetScope = 'subscription'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

In caso contrario, copiare l'esempio oppure modificare il modello in modo che corrisponda all'esempio.

Distribuire il modello

Per distribuire questo modello in Azure, è necessario accedere all'account Azure dal terminale di Visual Studio Code. Assicurarsi di aver installato gli strumenti dell'interfaccia della riga di comando di Azure.

  1. Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.

  2. Se la shell visualizzata sul lato destro della finestra del terminale è bash, significa che è aperta la shell corretta ed è possibile passare alla sezione successiva.

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. Se viene visualizzata una shell diversa da bash, seleziona l'elenco a discesa delle shell, quindi seleziona Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. Nell'elenco delle shell del terminale selezionare bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

  5. Nel terminale passare alla directory in cui è stato salvato il modello. Se, ad esempio, il salvataggio del modello è stato eseguito nella cartella templates, è possibile usare questo comando:

    cd templates
    

Installare Bicep

Eseguire il comando seguente per assicurarsi che sia installata la versione più recente di Bicep:

az bicep install && az bicep upgrade

Accedere ad Azure usando l'interfaccia della riga di comando di Azure

  1. Nel terminale di Visual Studio Code accedere ad Azure eseguendo il comando seguente:

    az login
    
  2. Nel browser visualizzato accedere al proprio account Azure.

    Il terminale di Visual Studio Code mostra un elenco delle sottoscrizioni associate a questo account.

  3. Nell'elenco trovare la sottoscrizione da usare per questo esercizio.

    Se l'elenco non è stato visualizzato all'accesso, è possibile usare il frammento di codice seguente per elencare di nuovo le sottoscrizioni.

    az account list --output table
    
  4. Impostare la sottoscrizione predefinita per tutti i comandi dell'interfaccia della riga di comando di Azure eseguiti in questa sessione.

    az account set --subscription "Your Subscription Name or ID"
    

Per distribuire questo modello in Azure, accedere all'account Azure dal terminale di Visual Studio Code. Assicurarsi di aver installato Azure PowerShell.

  1. Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.

  2. Se la shell visualizzata sul lato destro della finestra del terminale è PowerShell o pwsh, la shell corretta è aperta ed è possibile passare alla sezione successiva.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. Se viene visualizzata una shell diversa da powershell o pwsh, seleziona l'elenco a discesa delle shell, quindi seleziona PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. Nell'elenco delle shell del terminale selezionare powershell o pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

  5. Nel terminale passare alla directory in cui è stato salvato il modello. Se, ad esempio, il salvataggio del modello è stato eseguito nella cartella templates, è possibile usare questo comando:

    Set-Location -Path templates
    

Installare l'interfaccia della riga di comando di Bicep

Per usare Bicep da Azure PowerShell, installare l'interfaccia della riga di comando di Bicep.

Accedere ad Azure usando Azure PowerShell

  1. Nel terminale di Visual Studio Code accedere ad Azure eseguendo il comando seguente:

    Connect-AzAccount
    
  2. Nel browser visualizzato accedere al proprio account Azure.

  3. Ottenere l'ID della sottoscrizione da usare per questo esercizio eseguendo il comando seguente:

    Get-AzSubscription
    

    L'ID sottoscrizione è la seconda colonna. Copiare la seconda colonna. Sarà simile a cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Impostare la sottoscrizione predefinita per tutti i comandi di Azure PowerShell eseguiti in questa sessione.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Distribuire il modello in Azure

Distribuire il modello usando i comandi dell'interfaccia della riga di comando di Azure seguenti nel terminale di Visual Studio Code:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

Si noti che si sta creando una distribuzione con ambito sottoscrizione usando il comando az deployment sub create invece del consueto comando az deployment group create.

Distribuire il modello usando i comandi di Azure PowerShell seguenti nel terminale di Visual Studio Code:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

Si noti che si sta creando una distribuzione con ambito sottoscrizione usando il cmdlet New-AzSubscriptionDeployment invece del consueto cmdlet New-AzResourceGroupDeployment.

Si noti anche che si specificano in modo esplicito un nome e una località per la distribuzione. Azure usa queste informazioni per archiviare i metadati della distribuzione.

Suggerimento

Il nome della distribuzione include la data odierna. In questo modo è meno probabile che si usi accidentalmente lo stesso nome di un'altra distribuzione.

La distribuzione può richiedere uno o due minuti e al termine verrà visualizzato un messaggio di operazione completata.

Nota

Se si riceve un messaggio di errore con il codice AuthorizationFailed, è probabile che non si abbia l'autorizzazione per distribuire risorse con ambito sottoscrizione. Chiedere all'amministratore di Azure di concedere le autorizzazioni. In alternativa, se non è possibile soddisfare questo requisito con l'account Azure corrente, è possibile ottenere una versione di valutazione gratuita e creare una nuova sottoscrizione e un nuovo tenant di Azure.

Verificare la distribuzione

È possibile visualizzare le distribuzioni con ambito sottoscrizione nel portale di Azure. Ciò può essere utile per verificare che la distribuzione sia stata completata correttamente e per esaminare i risultati.

  1. Vai al portale di Azure.

  2. Nel riquadro sinistro selezionare Sottoscrizioni.

  3. Selezionare la propria sottoscrizione.

  4. Nella casella Cerca immettere Distribuzioni e quindi selezionare la voce di menu Distribuzioni.

    Screenshot of the Azure portal Search box and the Deployments menu item.

  5. Nella colonna Nome distribuzione selezionare la distribuzione che inizia con sub-scope per verificare quali risorse sono state distribuite.

    Screenshot of the Azure portal interface showing the list of deployments.

  6. Selezionare Dettagli distribuzione per espandere la sezione. In questo caso, vengono elencate le due risorse di Criteri di Azure.

    Screenshot of the Azure portal overview pane for the selected deployment.

Pulire le risorse

Le risorse con ambito sottoscrizione sono state distribuite correttamente. È possibile rimuovere le risorse dei criteri create eseguendo i comandi seguenti:

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId

Nell'unità di esercizi successiva si ridistribuiranno le stesse risorse dei criteri. Verranno ricreate, ma è possibile pulirle di nuovo in un secondo momento.