Criar uma imagem e usar uma identidade gerenciada atribuída pelo usuário para acessar arquivos em uma conta de armazenamento do Azure

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

Este artigo mostra como criar uma imagem personalizada usando o Azure VM Image Builder. O serviço usa uma identidade gerenciada atribuída pelo usuário para acessar arquivos em uma conta de armazenamento do Azure e pode conseguir bloquear o acesso não autenticado à conta de armazenamento.

O Azure VM Image Builder dá suporte ao uso de scripts e à cópia de arquivos do GitHub, contas de armazenamento do Azure e outros locais. Se você quiser usar os locais, eles devem ser acessíveis externamente ao Construtor de Imagens de VM.

No exemplo a seguir, você criará dois grupos de recursos, um para a imagem personalizada e outro para hospedar uma conta de armazenamento do Azure que contém um arquivo de script. Este exemplo simula um cenário da vida real, onde você pode ter construído artefatos ou arquivos de imagem em várias contas de armazenamento. Você criará uma identidade atribuída pelo usuário e, em seguida, concederá as permissões de leitura de identidade no arquivo de script, mas não permitirá o acesso público ao arquivo. Em seguida, você usará o personalizador de shell para baixar e executar um script da conta de armazenamento.

Criar um grupo de recursos

  1. Como você usará algumas informações repetidamente, crie algumas variáveis para armazenar essas informações.

    # 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. Crie uma variável para o ID da sua subscrição:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Crie grupos de recursos para a imagem e o armazenamento de scripts:

    # 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. Crie uma identidade atribuída pelo usuário e defina permissões no grupo de recursos:

    O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem no grupo de recursos. Neste exemplo, você cria uma definição de função do Azure com ações específicas para distribuir a imagem. A definição de função é então atribuída à identidade do usuário.

    # 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. Crie a conta de armazenamento e copie o script de exemplo para ela a partir do 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. Dê permissão ao Construtor de Imagens VM para criar recursos no grupo de recursos de imagem. O --assignee valor é o ID de identidade do usuário.

    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 
    

Modificar o exemplo

Baixe o arquivo JSON de exemplo e configure-o com as variáveis criadas anteriormente.

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

Criar a imagem

  1. Envie a configuração da imagem para o serviço VM Image Builder:

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Inicie a construção da imagem:

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

A construção pode levar cerca de 15 minutos para terminar.

Criar uma VM

  1. Crie uma VM a partir da imagem:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Depois que a VM tiver sido criada, inicie uma sessão do Secure Shell (SSH) com ela.

    ssh aibuser@<publicIp>
    

Depois que a conexão SSH for estabelecida, você deve receber uma "Mensagem do Dia" dizendo que a imagem foi personalizada:


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

Limpar os recursos

Se você não precisar mais dos recursos que foram criados durante esse processo, poderá excluí-los executando o seguinte código:


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

Próximos passos

Se você tiver problemas ao usar o Construtor de Imagens de VM, consulte Solucionar problemas do Construtor de Imagens de VM do Azure.