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
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
Crie uma variável para o ID da sua subscrição:
subscriptionID=$(az account show --query id --output tsv)
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
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
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
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
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
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
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
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.