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
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
Créez une variable pour votre ID d’abonnement :
subscriptionID=$(az account show --query id --output tsv)
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
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
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
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
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
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
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
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.