Een installatiekopieën maken en een door de gebruiker toegewezen beheerde identiteit gebruiken om toegang te krijgen tot bestanden in een Azure-opslagaccount

Van toepassing op: ✔️ Flexibele schaalsets voor Linux-VM's ✔️

In dit artikel wordt beschreven hoe u een aangepaste installatiekopieën maakt met behulp van Azure VM Image Builder. De service maakt gebruik van een door de gebruiker toegewezen beheerde identiteit om toegang te krijgen tot bestanden in een Azure-opslagaccount en kan niet-geverifieerde toegang tot het opslagaccount blokkeren.

Azure VM Image Builder ondersteunt het gebruik van scripts en het kopiëren van bestanden vanuit GitHub, Azure-opslagaccounts en andere locaties. Als u de locaties wilt gebruiken, moeten ze extern toegankelijk zijn voor VM Image Builder.

In het volgende voorbeeld maakt u twee resourcegroepen, een voor de aangepaste installatiekopie en de andere voor het hosten van een Azure-opslagaccount dat een scriptbestand bevat. In dit voorbeeld wordt een praktijkscenario gesimuleerd, waarbij u mogelijk artefacten of afbeeldingsbestanden in verschillende opslagaccounts hebt gemaakt. U maakt een door de gebruiker toegewezen identiteit en verleent de identiteit leesmachtigingen voor het scriptbestand, maar u staat geen openbare toegang tot het bestand toe. Vervolgens gebruikt u de shell-customizer om een script te downloaden en uit te voeren vanuit het opslagaccount.

Een brongroep maken

  1. Omdat u enkele stukjes informatie herhaaldelijk gebruikt, maakt u enkele variabelen om die informatie op te slaan.

    # 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. Maak een variabele voor uw abonnements-id:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Maak resourcegroepen voor zowel de installatiekopieën als de scriptopslag:

    # 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. Maak een door de gebruiker toegewezen identiteit en stel machtigingen in voor de resourcegroep:

    VM Image Builder gebruikt de opgegeven gebruikersidentiteit om de installatiekopieën in de resourcegroep te injecteren. In dit voorbeeld maakt u een Azure-roldefinitie met specifieke acties voor het distribueren van de installatiekopieën. De roldefinitie wordt vervolgens toegewezen aan de gebruikersidentiteit.

    # 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. Maak het opslagaccount en kopieer het voorbeeldscript ernaar vanuit 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. Geef VM Image Builder toestemming om resources te maken in de resourcegroep van de installatiekopieën. De --assignee waarde is de id van de gebruikersidentiteit.

    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 
    

Het voorbeeld wijzigen

Download het JSON-voorbeeldbestand en configureer het met de variabelen die u eerder hebt gemaakt.

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

De installatiekopie maken

  1. Verzend de installatiekopieënconfiguratie naar de VM Image Builder-service:

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Start de build van de installatiekopieën:

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

Het duurt ongeveer 15 minuten voordat de build is voltooid.

Een VM maken:

  1. Maak een VIRTUELE machine op basis van de installatiekopieën:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Nadat de VIRTUELE machine is gemaakt, start u er een SSH-sessie (Secure Shell) mee.

    ssh aibuser@<publicIp>
    

Nadat de SSH-verbinding tot stand is gebracht, ontvangt u het bericht 'Bericht van de dag' waarin staat dat de afbeelding is aangepast:


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

Uw resources opschonen

Als u de resources die tijdens dit proces zijn gemaakt niet meer nodig hebt, kunt u ze verwijderen door de volgende code uit te voeren:


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

Volgende stappen

Als u problemen ondervindt met het gebruik van VM Image Builder, raadpleegt u Problemen met Azure VM Image Builder oplossen.