Создание образа и использование управляемого удостоверения, назначаемого пользователем, для доступа к файлам в учетной записи хранения Azure

Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы

Из этой статьи вы узнаете, как создать настраиваемый образ с помощью Конструктора образов виртуальных машин Azure. Служба использует управляемое удостоверение, назначаемое пользователем, для доступа к файлам в учетной записи хранения Azure без необходимости предоставлять общий доступ к файлам.

Конструктор образов виртуальных машин Azure поддерживает использование скриптов и копирование файлов из GitHub, учетных записей хранения Azure и других расположений. Если вы хотите использовать расположения, они должны быть внешне доступными для Конструктора образов виртуальных машин.

В приведенном ниже примере вы создадите две группы ресурсов, одна из которых будет использоваться для пользовательского образа, а другая будет размещать учетную запись хранения Azure, содержащую файл скрипта. Этот пример имитирует реальный сценарий, при котором вы можете иметь артефакты сборки или файлы образов в разных учетных записях хранения. Вы создадите назначаемое пользователем удостоверение, а затем предоставите удостоверению разрешения на чтение файла скрипта, но без разрешения общего доступа к файлу. Затем с помощью программы настройки оболочки вы сможете скачать и запустить этот скрипт из учетной записи хранения.

Регистрация функций

  1. Чтобы использовать Конструктор образов виртуальных машин, необходимо зарегистрировать функцию:

    az feature register --namespace Microsoft.VirtualMachineImages --name VirtualMachineTemplatePreview
    
  2. Проверка состояния регистрации функции.

    az feature show --namespace Microsoft.VirtualMachineImages --name VirtualMachineTemplatePreview | grep state
    
  3. Проверьте свою регистрацию.

    az provider show -n Microsoft.VirtualMachineImages | grep registrationState
    az provider show -n Microsoft.KeyVault | grep registrationState
    az provider show -n Microsoft.Compute | grep registrationState
    az provider show -n Microsoft.Storage | grep registrationState
    az provider show -n Microsoft.Network | grep registrationState
    
  4. Если выходные данные не отображают функции как зарегистрированные, выполните следующие команды:

    az provider register -n Microsoft.VirtualMachineImages
    az provider register -n Microsoft.Compute
    az provider register -n Microsoft.KeyVault
    az provider register -n Microsoft.Storage
    az provider register -n Microsoft.Network
    

Создание группы ресурсов

  1. Так как вы будете использовать несколько блоков информации повторно, необходимо создать переменные для их хранения.

    # 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. Создайте переменную для идентификатора подписки:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Создайте группы ресурсов для образа и хранилища скриптов:

    # 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. Создайте назначаемое пользователем удостоверение и задайте разрешения для группы ресурсов:

    Для внедрения образа в группу ресурсов Конструктор образов использует предоставленное удостоверение пользователя. В этом примере вы создаете определение роли Azure с помощью специальных действий для распространения образа. Затем определение роли будет назначено удостоверению пользователя.

    # 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. Создайте учетную запись хранения и скопируйте в нее пример скрипта из 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. Предоставьте разрешение Конструктору образов виртуальных машин на создание ресурсов в группе ресурсов образа. Значением --assignee является идентификатор удостоверения пользователя.

    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 
    

Изменение примера

Скачайте пример в формате JSON и настройте его с помощью созданных ранее переменных.

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

Создание образа

  1. Отправьте конфигурацию образа в службу "Конструктор образов виртуальных машин":

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Запустите сборку образа:

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

На сборку может потребоваться около 15 минут.

Создание виртуальной машины

  1. Создайте виртуальную машину на основе образа:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. После создания виртуальной машины запустите сеанс SSH с ней.

    ssh aibuser@<publicIp>
    

Как только ваше SSH-подключение будет установлено, вы должны получить "сообщение дня" с уведомлением о том, что образ настроен:


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

Очистка ресурсов

Если вам больше не нужны ресурсы, созданные во время этого процесса, их можно удалить с помощью следующего кода:


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

Дальнейшие действия

Если у вас возникли проблемы при использовании Конструктора образов виртуальных машин, см. руководство по устранению неполадок Конструктора образов виртуальных машин Azure.