Image erstellen und mit einer benutzerseitig zugewiesenen verwalteten Identität auf Dateien in Azure Storage zugreifen

Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen

In diesem Artikel erfahren Sie, wie Sie mit dem Azure VM Image Builder ein benutzerdefiniertes Image erstellen. Der Dienst verwendet eine benutzerseitig zugewiesene verwaltete Identität für den Zugriff auf Dateien in einem Azure-Speicherkonto, und er kann den nicht authentifizierten Zugriff auf das Speicherkonto blockieren.

Azure VM Image Builder unterstützt die Verwendung von Skripts und das Kopieren von Dateien aus GitHub, Azure-Speicherkonten und anderen Speicherorten. Diese Speicherorte müssen allerdings für den VM Image Builder extern zugänglich sein.

Im folgenden Beispiel erstellen Sie zwei Ressourcengruppen: eine wird für das benutzerdefinierte Image verwendet, die andere hostet das Azure-Speicherkonto, das eine Skriptdatei enthält. Dadurch wird realitätsnah ein Szenario simuliert, in dem Sie Artefakte oder Imagedateien in verschiedenen Speicherkonten erstellt haben. Sie erstellen eine benutzerseitig zugewiesene Identität und erteilen dann die Berechtigungen zum Lesen der Identität in der Skriptdatei, erlauben aber keinen öffentlichen Zugriff auf die Datei. Anschließend verwenden Sie die Shellanpassung, um das Skript aus dem Speicherkonto herunterzuladen und auszuführen.

Erstellen einer Ressourcengruppe

  1. Da Sie einige Informationen wiederholt verwenden werden, erstellen Sie einige Variablen, um diese Informationen zu speichern.

    # 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. Erstellen Sie eine Variable für Ihre Abonnement-ID:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Erstellen Sie die Ressourcengruppen für das Image und das Speichern des Skripts:

    # 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. Erstellen Sie eine benutzerseitig zugewiesene Identität und legen Berechtigungen für die Ressourcengruppe fest:

    VM Image Builder verwendet die angegebene Benutzeridentität, um das Image in die Ressourcengruppe einzufügen. In diesem Beispiel erstellen Sie eine Azure-Rollendefinition mit spezifischen Aktionen für die Verteilung des Images. Die Rollendefinition wird dann der Benutzeridentität zugewiesen.

    # 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. Erstellen Sie das Speicherkonto, kopieren Sie das Beispielskript von GitHub und fügen Sie es ein:

    # 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. Erteilen Sie Azure Image Builder die Berechtigung, Ressourcen in dieser Imageressourcengruppe zu erstellen. Der Wert --assignee ist die Benutzeridentitäts-ID.

    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 
    

Anpassen des Beispiels

Laden Sie die JSON-Beispieldatei herunter und konfigurieren Sie sie mit den Variablen, die Sie zuvor erstellt haben.

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

Erstellen des Images

  1. Senden Sie die Imagekonfiguration an den VM-Image Builder-Dienst.

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Starten Sie die Imageerstellung:

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

Es kann etwa 15 Minuten dauern, bis das Kompilieren abgeschlossen ist.

Erstellen einer VM

  1. Erstellen Sie eine VM aus dem Image:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Erstellen Sie die VM und starten Sie dann eine SSH-Sitzung.

    ssh aibuser@<publicIp>
    

Sobald die SSH-Verbindung hergestellt wurde, sollten Sie eine „Nachricht des Tages“ erhalten, dass das Image angepasst wurde.


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

Bereinigen von Ressourcen

Wenn Sie die Ressourcen, die während dieses Vorgangs erstellt wurden, nicht mehr benötigen, können Sie sie mit dem folgenden Code löschen:


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

Nächste Schritte

Falls bei der Verwendung des VM Image Builder Probleme auftreten, lesen Sie den Artikel Problembehandlung beim Azure VM Image Builder.