Настройка ADE для выполнения развертываний с помощью Pulumi

Из этой статьи вы узнаете, как использовать Pulumi для развертываний в средах развертывания Azure (ADE). Вы узнаете, как использовать стандартный образ, предоставляемый Pulumi или как настроить пользовательский образ для подготовки инфраструктуры с помощью платформы Pulumi Infrastructure-as-Code (IaC).

ADE поддерживает модель расширяемости, которая позволяет создавать пользовательские образы, которые можно использовать в определениях среды. Чтобы использовать эту модель расширяемости, можно создать собственные пользовательские образы и сохранить их в реестре контейнеров, например Реестр контейнеров Azure (ACR) или Docker Hub. Затем вы можете ссылаться на эти образы в определениях среды для развертывания сред.

Определение среды состоит по крайней мере из двух файлов: файла проекта Pulumi, Pulumi.yaml и файла манифеста с именем environment.yaml. Он также может содержать пользовательскую программу, написанную на предпочитаемом языке программирования: C#, TypeScript, Python и т. д. ADE использует контейнеры для развертывания определений среды.

Необходимые компоненты

Использование стандартного образа Docker, предоставленного Pulumi

Команда Pulumi предоставляет предварительно созданный образ для начала работы, который можно увидеть в папке Runner-Image . Этот образ доступен в Центре pulumi/azure-deployment-environmentsDocker в Pulumi, так что его можно использовать непосредственно из определений среды ADE.

Ниже приведен пример environment.yaml файла, который использует предварительно созданный образ:

name: SampleDefinition
version: 1.0.0
summary: First Pulumi-Enabled Environment
description: Deploys a Storage Account with Pulumi
runner: pulumi/azure-deployment-environments:0.1.0
templatePath: Pulumi.yaml

В папке "Среды" можно найти несколько примеров определений среды.

Создание и использование пользовательского образа Docker

Пользовательские образы можно создавать на основе примеров образов ADE с помощью средства интерфейса командной строки ADE. Используйте интерфейс командной строки ADE для настройки развертываний и удалений в соответствии с рабочим процессом. Интерфейс командной строки ADE предварительно установлен на примерах изображений. Дополнительные сведения о интерфейсе командной строки ADE см. в справочнике по пользовательскому образу запуска интерфейса командной строки.

В этом примере вы узнаете, как создать образ Docker для использования развертываний ADE и доступа к интерфейсу командной строки ADE, базируя образ на одном из созданных образов ADE.

Выбор примера образа контейнера с помощью инструкции FROM

Добавьте инструкцию FROM в созданный Файл DockerFile для нового образа, указывающего на образ, размещенный на Реестр артефактов Microsoft.

Ниже приведен пример инструкции FROM, ссылающейся на образ ядра примера:

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

Эта инструкция извлекает последний опубликованный основной образ и делает его основой для пользовательского образа.

Образы ADE основаны на образе Azure CLI и предварительно установлены пакеты ADE CLI и JQ. Дополнительные сведения о Azure CLI и пакете JQ можно узнать больше.

Чтобы установить все пакеты, необходимые в образе, используйте инструкцию RUN.

Установка Pulumi в Dockerfile

Вы можете установить интерфейс командной строки Pulumi в исполняемое расположение, чтобы его можно было использовать в сценариях развертывания и удаления.

Ниже приведен пример этого процесса, устанавливающий последнюю версию интерфейса командной строки Pulumi:

RUN apk add curl
RUN curl -fsSL https://get.pulumi.com | sh
ENV PATH="${PATH}:/root/.pulumi/bin"

В зависимости от того, какой язык программирования вы планируете использовать для программ Pulumi, может потребоваться установить одну или несколько соответствующих сред выполнения. Среда выполнения Python уже доступна в базовом образе.

Ниже приведен пример установки Node.js и TypeScript:

# install node.js, npm, and typescript
RUN apk add nodejs npm
RUN npm install typescript -g

Выполнение скриптов оболочки операций

В примерах образов операции определяются и выполняются на основе имени операции. В настоящее время поддерживаются два имена операций развертывания и удаления.

Чтобы настроить пользовательский образ для использования этой структуры, укажите папку на уровне именованных скриптов Dockerfile и укажите два файла, deploy.sh и delete.sh. Скрипт оболочки развертывания запускается при создании или повторном развертывании среды, а сценарий оболочки удаления запускается при удалении среды. Примеры скриптов оболочки можно просмотреть в репозитории в папке Runner-Image/scripts.

Чтобы убедиться, что эти скрипты оболочки являются исполняемыми, добавьте в Dockerfile следующие строки:

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Создание скриптов оболочки операций для использования интерфейса командной строки Pulumi

Существует четыре шага по развертыванию инфраструктуры через Pulumi:

  1. pulumi login — подключение к хранилищу состояний в локальной файловой системе или в Pulumi Cloud
  2. pulumi stack select — создание или выбор стека, используемого для конкретной среды
  3. pulumi config set — передача параметров развертывания в качестве значений конфигурации Pulumi
  4. pulumi up — запустите развертывание, чтобы создать новую или обновить существующую инфраструктуру в Azure

Во время точки входа основного образа все существующие локальные файлы состояния извлекаются в контейнер и каталог, сохраненный в переменной $ADE_STORAGEсреды. Чтобы получить доступ к существующему файлу состояния, выполните следующие команды:

mkdir -p $ADE_STORAGE
export PULUMI_CONFIG_PASSPHRASE=
pulumi login file://$ADE_STORAGE

Чтобы войти в Pulumi Cloud, задайте маркер доступа Pulumi в качестве переменной среды и выполните следующие команды:

export PULUMI_ACCESS_TOKEN=YOUR_PULUMI_ACCESS_TOKEN
pulumi login

Все параметры, заданные для текущей среды, хранятся в переменной $ADE_OPERATION_PARAMETERS. Кроме того, выбранный регион Azure и имя группы ресурсов передаются ADE_ENVIRONMENT_LOCATION и ADE_RESOURCE_GROUP_NAME соответственно. Чтобы задать конфигурацию стека Pulumi, выполните следующие команды:

# Create or select the stack for the current environment
pulumi stack select $ADE_ENVIRONMENT_NAME --create

# Store configuration values in durable storage
export PULUMI_CONFIG_FILE=$ADE_STORAGE/Pulumi.$ADE_ENVIRONMENT_NAME.yaml

# Set the Pulumi stack config
pulumi config set azure-native:location $ADE_ENVIRONMENT_LOCATION --config-file $PULUMI_CONFIG_FILE
pulumi config set resource-group-name $ADE_RESOURCE_GROUP_NAME --config-file $PULUMI_CONFIG_FILE
echo "$ADE_OPERATION_PARAMETERS" | jq -r 'to_entries|.[]|[.key, .value] | @tsv' |
  while IFS=$'\t' read -r key value; do
    pulumi config set $key $value --config-file $PULUMI_CONFIG_FILE
  done

Кроме того, чтобы использовать привилегии ADE для развертывания инфраструктуры в подписке, скрипту необходимо использовать управляемое удостоверение службы ADE (MSI) при подготовке инфраструктуры с помощью поставщика Pulumi Azure Native или Azure Classic. Если в развертывании требуются специальные разрешения для завершения развертывания, например для определенных ролей, назначьте эти разрешения удостоверениям типа среды проекта, используемым для развертывания среды. ADE задает соответствующие переменные среды, такие как идентификаторы клиента, клиента и подписки в точке входа основного образа, поэтому выполните следующие команды, чтобы убедиться, что поставщик использует ADE MSI:

export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID

Теперь можно выполнить pulumi up команду для выполнения развертывания:

pulumi up --refresh --yes --config-file $PULUMI_CONFIG_FILE

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

pulumi destroy --refresh --yes --config-file $PULUMI_CONFIG_FILE

Наконец, чтобы сделать выходные данные развертывания отправленными и доступными при доступе к среде через Azure CLI, преобразуйте выходной объект из Pulumi в указанный ADE формат через пакет JQ. Задайте значение переменной среды $ADE_OUTPUTS, как показано в следующем примере:

stackout=$(pulumi stack output --json | jq -r 'to_entries|.[]|{(.key): {type: "string", value: (.value)}}')
echo "{\"outputs\": ${stackout:-{\}}}" > $ADE_OUTPUTS

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

Прежде чем отправлять образ в реестр, убедитесь , что на компьютере установлен модуль Docker. Затем перейдите в каталог Dockerfile и выполните следующую команду:

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

Например, если вы хотите сохранить образ в репозитории в реестре с именем customImageи отправить с помощью версии тега 1.0.0, выполните следующие действия:

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Отправка образа Docker в реестр

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

Создание Реестр контейнеров Azure и публикация образа с помощью Pulumi

Реестр контейнеров Azure — это предложение Azure, которое хранит образы контейнеров и аналогичные артефакты.

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

Создание Реестр контейнеров Azure и публикация образа вручную с помощью ИНТЕРФЕЙСА командной строки

Чтобы использовать пользовательские образы, их необходимо хранить в реестре контейнеров. для этого настоятельно рекомендуется Реестр контейнеров Azure (ACR). Из-за тесной интеграции с ADE изображение может быть опубликовано без разрешения общедоступных анонимных доступ на вытягивание.

Кроме того, можно сохранить образ в другом реестре контейнеров, например Docker Hub, но в этом случае он должен быть общедоступным.

Внимание

Хранение образа контейнера в реестре с анонимным (неуправляемым) доступ на вытягивание делает его общедоступным. Не делайте этого, если изображение содержит конфиденциальную информацию. Вместо этого сохраните его в Реестр контейнеров Azure (ACR) с анонимным доступ на вытягивание отключен.

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

Чтобы создать экземпляр ACR, который можно выполнить с помощью Azure CLI, портал Azure, команд PowerShell и многое другое, выполните одно из кратких руководств.

Использование общедоступного реестра с анонимным извлечением

Чтобы настроить реестр для включения анонимного извлечения образа, выполните следующие команды в Azure CLI:

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

Когда вы будете готовы отправить образ в реестр, выполните следующую команду:

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Использование ACR с защищенным доступом

По умолчанию доступ к извлечению или отправке содержимого из Реестр контейнеров Azure доступен только для пользователей, прошедших проверку подлинности. Вы можете дополнительно защитить доступ к ACR, ограничив доступ из определенных сетей и назначив определенные роли.

Ограничение сетевого доступа

Чтобы защитить сетевой доступ к ACR, можно ограничить доступ к собственным сетям или полностью отключить доступ к общедоступной сети. Если ограничить доступ к сети, необходимо включить исключение брандмауэра allow trusted службы Майкрософт для доступа к этому реестру контейнеров.

Чтобы отключить доступ из общедоступных сетей, выполните приведенные действия.

  1. Создайте экземпляр ACR или используйте существующий.

  2. В портал Azure перейдите к ACR, который требуется настроить.

  3. В меню слева в разделе "Параметры" выберите "Сеть".

  4. На странице "Сеть" на вкладке "Общедоступный доступ" в разделе "Доступ к общедоступной сети" выберите "Отключено".

    Снимок экрана: портал Azure с параметрами сети ACR с выделенным общедоступным доступом и отключенным.

  5. В разделе "Исключение брандмауэра" установите флажок разрешить доверенным службы Майкрософт доступ к этому реестру контейнеров, а затем нажмите кнопку "Сохранить".

    Снимок экрана: параметры сети ACR с выделенным параметром

Назначение роли AcrPull

Создание сред с помощью образов контейнеров использует инфраструктуру ADE, включая проекты и типы сред. Каждый проект имеет один или несколько типов среды проекта, которые нуждаются в доступе на чтение к образу контейнера, определяющему среду для развертывания. Чтобы получить доступ к изображениям в ACR безопасно, назначьте роль AcrPull каждому типу среды проекта.

Чтобы назначить роль AcrPull типу среды проекта:

  1. В портал Azure перейдите к ACR, который требуется настроить.

  2. В меню слева выберите контроль доступа (IAM).

  3. Выберите Добавить>Добавить назначение ролей.

  4. Назначьте следующую роль. Подробные инструкции см. в статье Назначение ролей Azure с помощью портала Microsoft Azure.

    Параметр Значение
    Роль Выберите AcrPull.
    Назначение доступа Выберите "Пользователь", "Группа" или "Субъект-служба".
    Участники Введите имя типа среды проекта, который должен получить доступ к образу в контейнере.

    Тип среды проекта отображается следующим образом:

    Снимок экрана: область

В этой конфигурации ADE использует управляемое удостоверение для PET, назначаемое системой или назначаемое пользователем.

Совет

Это назначение роли должно быть сделано для каждого типа среды проекта. Его можно автоматизировать с помощью Azure CLI.

Когда вы будете готовы отправить образ в реестр, выполните следующую команду:

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Подключение образа к определению среды

При создании определений среды для использования пользовательского образа в развертывании измените runner свойство в файле манифеста (environment.yaml или manifest.yaml).

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

Доступ к журналам операций и сведениям об ошибках

ADE сохраняет сведения об ошибке для неудачного развертывания файла $ADE_ERROR_LOG .

Чтобы устранить неполадки с неудачным развертыванием, выполните приведенные ниже действия.

  1. Войдите на портал разработчика.

  2. Определите среду, которая не удалось развернуть, и выберите "Просмотреть сведения".

    Снимок экрана: сведения об ошибке развертывания с ошибкой, в частности недопустимое имя учетной записи хранения.

  3. Просмотрите сведения об ошибке в разделе сведений об ошибке.

    Снимок экрана: сбой развертывания среды с кнопкой

Кроме того, azure CLI можно использовать для просмотра сведений об ошибке среды с помощью следующей команды:

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

Чтобы просмотреть журналы операций для развертывания или удаления среды, используйте Azure CLI для получения последней операции для вашей среды, а затем просмотрите журналы для этого идентификатора операции.

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}