Creación de una imagen y uso de una identidad administrada asignada por el usuario para acceder a archivos en una cuenta de Azure Storage
Se aplica a: ✔️ máquinas virtuales Linux ✔️ conjuntos de escalado flexibles
En este artículo, obtendrá información sobre cómo crear una imagen personalizada mediante Azure VM Image Builder. El servicio usa una identidad administrada asignada por el usuario para acceder a los archivos de una cuenta de almacenamiento de Azure, y puede conseguir bloquear el acceso no autenticado a la cuenta de almacenamiento.
Azure VM Image Builder admite el uso de scripts y la copia de archivos desde GitHub, cuentas de almacenamiento de Azure y otras ubicaciones. Si desea usar las ubicaciones, deben ser accesibles externamente para VM Image Builder.
En el ejemplo siguiente, creará dos grupos de recursos: uno para la imagen personalizada y el otro para hospedar una cuenta de Azure Storage, que contiene un archivo de script. Este ejemplo simula un escenario real, en el que puede tener los artefactos de compilación o los archivos de imagen en varias cuentas de almacenamiento. Creará una identidad asignada por el usuario y, a continuación, concederá permisos de lectura de identidad en el archivo de script, pero no permitirá ningún acceso público a ese archivo. Después, usará el personalizador de shell para descargar y ejecutar un script desde la cuenta de almacenamiento.
Crear un grupo de recursos
Ya que usará algunos datos de forma repetida, cree diversas variables para almacenar esa información.
# 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
Cree una variable para el id. de suscripción:
subscriptionID=$(az account show --query id --output tsv)
Cree grupos de recursos para la imagen y el almacenamiento del 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
Creación de una identidad asignada por el usuario y establecimiento de los permisos en el grupo de recursos:
VM Image Builder usa la identidad de usuario proporcionada para insertar la imagen en el grupo de recursos. En este ejemplo, creará una definición de roles de Azure con acciones específicas para distribuir la imagen. La definición de roles se asigna a la identidad del usuario.
# 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
Cree la cuenta de almacenamiento y copie ahí el script de ejemplo 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
Conceda a VM Image Builder permiso para crear recursos en el grupo de recursos de imagen. El valor
--assignee
es el identificador de identidad del usuario.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
Modificación del ejemplo
Descargue el archivo JSON de ejemplo y configúrelo con las variables que ha creado.
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
Crear la imagen
Envíe la configuración de la imagen al servicio de VM Image Builder:
az resource create \ --resource-group $imageResourceGroup \ --properties @helloImageTemplateMsi.json \ --is-full-object \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01
Inicie la generación de la imagen:
az resource invoke-action \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01 \ --action Run
La compilación puede tardar unos 15 minutos en finalizar.
Crear una VM
Cree una máquina virtual a partir de la imagen:
az vm create \ --resource-group $imageResourceGroup \ --name aibImgVm00 \ --admin-username aibuser \ --image $imageName \ --location $location \ --generate-ssh-keys
Una vez creada la máquina virtual, inicie una sesión de Secure Shell (SSH) con ella.
ssh aibuser@<publicIp>
En cuanto se haya establecido la conexión SSH, recibirá un "Mensaje del día" indicando que la imagen se ha personalizado:
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
Limpieza de los recursos
Si ya no necesita los recursos que se crearon durante este proceso, puede eliminarlos ejecutando el código siguiente:
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
Pasos siguientes
Si tiene algún problema al usar VM Image Builder, consulte Solución de problemas de Azure VM Image Builder.