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

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis

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

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

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

Criar um grupo de recursos

  1. Como você usará algumas informações repetidamente, crie algumas variáveis para armazená-las.

    # 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 a ID da assinatura:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Crie os grupos de recursos da imagem e do armazenamento de 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. 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 do usuário fornecida para injetar a imagem em um grupo de recursos. Neste exemplo, você cria uma definição de regra do Azure com ações específicas para distribuir a imagem. A definição de função será 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 nela o script de exemplo 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. Conceda ao Construtor de Imagens de VM a permissão para criar recursos no grupo de recursos de imagem. O valor de --assignee é a 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 
    

Modifique o exemplo

Baixe o arquivo JSON de exemplo e configure-o com as variáveis que você criou 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 de imagem para o serviço Construtor de Imagens de VM:

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

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

O build pode levar cerca de 15 minutos para ser concluído.

Criar uma VM

  1. Crie uma VM usando a imagem:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Após a criação da VM, inicie uma sessão SSH (Secure Shell) com ela.

    ssh aibuser@<publicIp>
    

Logo que a conexão SSH é estabelecida, você deve receber uma "Mensagem do Dia" personalizada informando 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 criados nesse 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óximas etapas

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