Skapa en avbildning och använd en användartilldelad hanterad identitet för att komma åt filer i ett Azure Storage-konto

Gäller för: ✔️ Flexibla skalningsuppsättningar för virtuella Linux-datorer ✔️

Den här artikeln visar hur du skapar en anpassad avbildning med hjälp av Azure VM Image Builder. Tjänsten använder en användartilldelad hanterad identitet för att komma åt filer i ett Azure Storage-konto, och det kan få blockerande oautentiserad åtkomst till lagringskontot.

Azure VM Image Builder stöder användning av skript och kopiering av filer från GitHub, Azure Storage-konton och andra platser. Om du vill använda platserna måste de vara externt tillgängliga för VM Image Builder.

I följande exempel skapar du två resursgrupper, en för den anpassade avbildningen och den andra som värd för ett Azure-lagringskonto som innehåller en skriptfil. Det här exemplet simulerar ett verkligt scenario, där du kan ha byggartefakter eller bildfiler i olika lagringskonton. Du skapar en användartilldelad identitet och ger sedan identiteten läsbehörighet för skriptfilen, men du tillåter inte offentlig åtkomst till filen. Sedan använder du gränssnittsanpassaren för att ladda ned och köra ett skript från lagringskontot.

Skapa en resursgrupp

  1. Eftersom du kommer att använda viss information upprepade gånger skapar du vissa variabler för att lagra den informationen.

    # 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. Skapa en variabel för ditt prenumerations-ID:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Skapa resursgrupper för både avbildningen och skriptlagringen:

    # 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. Skapa en användartilldelad identitet och ange behörigheter för resursgruppen:

    Vm Image Builder använder den angivna användaridentiteten för att mata in avbildningen i resursgruppen. I det här exemplet skapar du en Azure-rolldefinition med specifika åtgärder för att distribuera avbildningen. Rolldefinitionen tilldelas sedan till användaridentiteten.

    # 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. Skapa lagringskontot och kopiera exempelskriptet till det från 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. Ge VM Image Builder behörighet att skapa resurser i avbildningsresursgruppen. Värdet --assignee är användaridentitets-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 
    

Ändra exemplet

Ladda ned JSON-exempelfilen och konfigurera den med de variabler som du skapade tidigare.

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

Skapa avbildningen

  1. Skicka avbildningskonfigurationen till tjänsten Image Builder för den virtuella datorn:

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

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

Bygget kan ta cirka 15 minuter att slutföra.

Skapa en virtuell dator

  1. Skapa en virtuell dator från avbildningen:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. När den virtuella datorn har skapats startar du en SSH-session (Secure Shell) med den.

    ssh aibuser@<publicIp>
    

När SSH-anslutningen har upprättats bör du få ett meddelande om att avbildningen har anpassats:


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

Rensa dina resurser

Om du inte längre behöver de resurser som skapades under den här processen kan du ta bort dem genom att köra följande kod:


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ästa steg

Om du har problem med att använda VM Image Builder kan du läsa Felsöka Azure VM Image Builder.