Créer une image et utiliser une identité managée affectée par l’utilisateur pour accéder aux fichiers dans un compte de stockage Azure

S’applique à : ✔️ Machines virtuelles Linux ✔️ Groupes identiques flexibles

Cet article explique comment créer une image personnalisée à l’aide d’Azure VM Image Builder. Le service utilise une identité managée attribuée par l'utilisateur pour accéder aux fichiers d'un compte de stockage Azure et peut bloquer l'accès non authentifié au compte de stockage.

Azure VM Image Builder prend en charge l’utilisation de scripts et la copie de fichiers à partir de GitHub, des comptes de stockage Azure et d’autres emplacements. Si vous souhaitez utiliser ces emplacements, ils doivent être accessibles en externe à VM Image Builder.

Dans l’exemple suivant, vous allez créer deux groupes de ressources, l’un pour l’image personnalisée et l’autre pour héberger un compte de stockage Azure contenant un fichier de script. Cet exemple simule un scénario réel, où vous pouvez avoir des artefacts de build ou des fichiers image dans différents comptes de stockage. Vous allez créer une identité affectée par l’utilisateur, puis accorderez à cette identité les autorisations de lecture sur le fichier de script, mais vous n’autoriserez pas l’accès public à ce fichier. Vous utiliserez ensuite le personnalisateur de l’interpréteur de commandes pour télécharger et exécuter un script à partir du compte de stockage.

Créer un groupe de ressources

  1. Comme nous allons utiliser certains éléments d’information à plusieurs reprises, créez des variables pour les stocker.

    # 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. Créez une variable pour votre ID d’abonnement :

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Créez des groupes de ressources pour le stockage de script et d’images :

    # 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. Créez une identité affectée par l’utilisateur et définissez des autorisations sur le groupe de ressources :

    VM Image Builder utilise l’identité d’utilisateur fournie pour injecter l’image dans le groupe de ressources. Dans cet exemple, vous créez une définition de rôle Azure avec des actions spécifiques pour distribuer l’image. La définition de rôle est alors attribuée à l’identité de l’utilisateur.

    # 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. Créez le compte de stockage et copiez-y l’exemple de script à partir de 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. Accordez à VM Image Builder l’autorisation de créer des ressources dans le groupe de ressources d’image. La valeur --assignee est l’ID de l’identité de l’utilisateur.

    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 
    

Modifier l’exemple

Téléchargez l’exemple de fichier JSON et configurez-le avec les variables que vous avez créées précédemment.

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

Création de l’image

  1. Envoyez la configuration de l’image au service VM Image Builder :

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Lancez la génération d’image :

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

La génération peut prendre environ 15 minutes.

Créer une machine virtuelle

  1. Créez une machine virtuelle à partir de l’image :

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Une fois la machine virtuelle créée, démarrez une session Secure Shell (SSH) avec elle.

    ssh aibuser@<publicIp>
    

Une fois la connexion SSH établie, vous devez recevoir un « Message du jour » indiquant que l’image a été personnalisée :


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

Nettoyer vos ressources

Si vous n’avez plus besoin des ressources qui ont été créées durant ce processus, vous pouvez les supprimer en exécutant le code suivant :


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

Étapes suivantes

Si vous rencontrez des problèmes en utilisant VM Image Builder, consultez Résoudre les problèmes liés à Azure VM Image Builder.