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

  1. 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
    
  2. Cree una variable para el id. de suscripción:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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

  1. 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
    
  2. 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

  1. 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
    
  2. 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.