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
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
Crie uma variável para a ID da assinatura:
subscriptionID=$(az account show --query id --output tsv)
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
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
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
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
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
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
Crie uma VM usando a imagem:
az vm create \ --resource-group $imageResourceGroup \ --name aibImgVm00 \ --admin-username aibuser \ --image $imageName \ --location $location \ --generate-ssh-keys
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.