Creare un'immagine e usare un'identità gestita assegnata dall'utente per accedere ai file in un account di archiviazione di Azure

Si applica a: ✔️ macchine virtuali di Linux ✔️ set di scalabilità flessibili

Questo articolo illustra come creare un'immagine personalizzata usando Image Builder di macchine virtuali di Azure. Il servizio usa un'identità gestita assegnata dall'utente per accedere ai file in un account di archiviazione di Azure e può ottenere il blocco dell'accesso non autenticato all'account di archiviazione.

Image Builder di macchine virtuali di Azure supporta l'uso di script e la copia di file da GitHub, account di archiviazione di Azure e altre posizioni. Per usare i percorsi, è necessario che siano accessibili esternamente a Image Builder della macchina virtuale.

Nell'esempio seguente verranno creati due gruppi di risorse, uno per l'immagine personalizzata e l'altro per ospitare un account di archiviazione di Azure che contiene un file di script. Questo esempio simula uno scenario reale, in cui potrebbero essere presenti artefatti di compilazione o file di immagine in vari account di archiviazione. Si creerà un'identità assegnata dall'utente e si concederanno le autorizzazioni di lettura dell'identità per il file di script, ma non si consentirà l'accesso pubblico al file. Si userà quindi la funzione di personalizzazione della shell per scaricare ed eseguire uno script dall'account di archiviazione.

Creare un gruppo di risorse

  1. Poiché si useranno ripetutamente alcune informazioni, creare alcune variabili per archiviare tali informazioni.

    # Image resource group name 
    imageResourceGroup=aibmdimsi
    # Storage resource group
    strResourceGroup=aibmdimsistor
    # Location 
    location=WestUS2
    # Name of the image to be created
    imageName=aibCustLinuxImgMsi01
    # Image distribution metadata reference name
    runOutputName=u1804ManImgMsiro
    
  2. Creare una variabile per l'ID di sottoscrizione:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Creare gruppi di risorse sia per l'immagine che per l'archiviazione di script:

    # Create a resource group for the image template
    az group create -n $imageResourceGroup -l $location
    # Create a resource group for the script storage
    az group create -n $strResourceGroup -l $location
    
  4. Creare un'identità assegnata dall'utente e impostare autorizzazioni per il gruppo di risorse:

    VM Image Builder usa l'identità utente fornita per inserire l'immagine nel gruppo di risorse. In questo esempio viene creata una definizione di ruolo di Azure con azioni specifiche per la distribuzione dell'immagine. La definizione del ruolo viene quindi assegnata all'identità utente.

    # Create a user-assigned identity for VM Image Builder to access the storage account where the script is located
    identityName=aibBuiUserId$(date +'%s')
    az identity create -g $imageResourceGroup -n $identityName
    
    # Get an identity ID
    imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)
    
    # Get the user-identity URI, which is needed for the template
    imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName
    
    # Download the preconfigured role definition example
    curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json
    
    # Update the definition
    sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
    sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json
    
    # Create role definitions
    az role definition create --role-definition ./aibRoleImageCreation.json
    
    # Grant the role definition to the user-assigned identity
    az role assignment create \
        --assignee $imgBuilderCliId \
        --role "Azure Image Builder Service Image Creation Role" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
  5. Creare l'account di archiviazione e copiarlo da GitHub:

    # Script storage account
    scriptStorageAcc=aibstorscript$(date +'%s')
    
    # Script container
    scriptStorageAccContainer=scriptscont$(date +'%s')
    
    # Script URL
    scriptUrl=https://$scriptStorageAcc.blob.core.windows.net/$scriptStorageAccContainer/customizeScript.sh
    
    # Create the storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    
    az storage container create -n $scriptStorageAccContainer --fail-on-exist --account-name $scriptStorageAcc
    
    # Copy in an example script from the GitHub repo 
    az storage blob copy start \
        --destination-blob customizeScript.sh \
        --destination-container $scriptStorageAccContainer \
        --account-name $scriptStorageAcc \
        --source-uri https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/customizeScript.sh
    
  6. Concedere a Image Builder di macchine virtuali l'autorizzazione per creare risorse nel gruppo di risorse immagine. Il valore --assignee è l'ID identità utente.

    az role assignment create \
        --assignee $imgBuilderCliId \
        --role "Storage Blob Data Reader" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$strResourceGroup/providers/Microsoft.Storage/storageAccounts/$scriptStorageAcc/blobServices/default/containers/$scriptStorageAccContainer 
    

Modificare l'esempio

Scaricare il file JSON di esempio e configurarlo con le variabili create in precedenza.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/7_Creating_Custom_Image_using_MSI_to_Access_Storage/helloImageTemplateMsi.json -o helloImageTemplateMsi.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateMsi.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" helloImageTemplateMsi.json
sed -i -e "s/<region>/$location/g" helloImageTemplateMsi.json
sed -i -e "s/<imageName>/$imageName/g" helloImageTemplateMsi.json
sed -i -e "s%<scriptUrl>%$scriptUrl%g" helloImageTemplateMsi.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateMsi.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateMsi.json

Creare l'immagine

  1. Inviare la configurazione dell'immagine al servizio Image Builder per macchine virtuali:

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Avviare la compilazione dell'immagine:

    az resource invoke-action \
        --resource-group $imageResourceGroup \
        --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01 \
        --action Run 
    

Il completamento della compilazione può richiedere circa 15 minuti.

Creare una VM

  1. Creare una macchina virtuale dall'immagine:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Dopo aver creato la macchina virtuale, avviare una sessione Ssh (Secure Shell).

    ssh aibuser@<publicIp>
    

Dopo aver stabilito la connessione SSH, si dovrebbe ricevere un messaggio "Messaggio del giorno" che informa che l'immagine è stata personalizzata:


*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

Pulire le risorse

Se non sono più necessarie le risorse create durante questo processo, è possibile eliminarle eseguendo il codice seguente:


az role definition delete --name "$imageRoleDefName"
```azurecli-interactive
az role assignment delete \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az identity delete --ids $imgBuilderId
az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateMsi01
az group delete -n $imageResourceGroup
az group delete -n $strResourceGroup

Passaggi successivi

Se si verificano problemi durante l'uso di Image Builder di macchine virtuali, vedere Risolvere i problemi di Image Builder di macchine virtuali di Azure.