Приложению функции Azure Python не удается импортировать пакеты при развертывании через Azure DevOps

Объем: У меня есть приложение-функция Python, которое работает, как и ожидалось, локально и при развертывании через VS Code.

Проблема возникает при развертывании приложения-функции в группе ресурсов продукта (и приложении-функции).

Различия между двумя развертываниями:

  • приложение-функция разработки (бессерверное), не интегрированное в виртуальную сеть, развертывается с помощью щелчка правой кнопкой мыши> развертывание в приложении-функции
  • приложение-функция prod (премиум-план), интегрированное в виртуальную сеть, развернутое через конвейер Azure DevOps, которое выглядит следующим образом:
trigger:
- none

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '******'

  # Web app name
  webAppName: '*******'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Environment name
  environmentName: 'PROD'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  # Resource group
  resourceGroupName : '********'

  # Python version: 3.11
  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool: Default
    steps:
    - script: |
        pip install --target = "./.python_packages/lib/site-packages" -r ./requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool: Default
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureFunctionApp@2
            displayName: 'Deploy Azure Web App'
            inputs:
              connectedServiceNameARM: '$(azureServiceConnectionId)'
              appType: 'functionAppLinux'
              appName: '$(webAppName)'
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
              runtimeStack: 'PYTHON|3.11'
              appSettings: '-KeyvaultURL ***** -StorageaccountURL *****'
              deploymentMethod: 'auto'

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

- task: AzureCLI@2
            displayName: 'Deploy with Azure CLI'
            inputs:
              azureSubscription: '$(azureServiceConnectionId)'
              scriptType: 'pscore'
              scriptLocation: 'inlineScript'
              inlineScript: |
                $artifactPath = "$(Pipeline.Workspace)/drop/$(Build.BuildId).zip"
                az functionapp deployment source config-zip -g $(resourceGroupName) -n $(webAppName) --src $artifactPath --verbose

Результат был тот же.

Итак, первоначальная проблема, с которой я столкнулся, заключалась в том, что функции просто не отображались, развертывание почти всегда проходит успешно. Пройдя по кроличьей норе, мне удалось найти журналы, которые показывают, что «синхронизация триггеров HTTP не удалась», а также модули, которые не удалось импортировать (нет конкретных модулей — все).

Из журнала я вижу, что выбрана правильная папка:

/home/site/wwwroot/.python_packages/lib/site-packages/pandas/

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

По какой-то причине function_app.py не видит установленные модули, что вызывает цепную реакцию, которая приводит к тому, что функции не отображаются даже после успешного развертывания.

Что я пробовал до сих пор:

  • Несколько комбинаций использования ENABLE_ORYX_BUILD и SCM_DO_BUILD_DURING_DEPLOYMENT в конвейере.
  • Тип развертывания: zipDeploy и/или пакет.

Были некоторые ресурсы по SO, но, похоже, ничего не решило эту проблему, это довольно странно, поскольку я чувствую, что многие разработчики должны выполнять этот тип развертывания практически каждый день, поэтому либо я делаю что-то действительно неправильно, либо есть основная причина проблема, которую я, кажется, не понимаю.

Я добавляю UsePythonVersion@0, чтобы указать Python 3.11 в начале первого задания (ссылка здесь), и скопировал ваш yaml, развертывание прошло успешно, и приложение-функция работает нормально. Могу ли я узнать, проверили ли вы на портале Azure -> приложение целевой функции -> Функции -> файлы приложения, содержит ли он правильные файлы (например: function_app.py)? Это необходимо для проверки правильности развертывания файлов.

wade zhou - MSFT 01.07.2024 14:57

Кроме того, __pycache__ НЕ находится прямо под site-packages с моей стороны, это .python_packages\lib\site-packages\azure\functions\__pycache‌​__. Пожалуйста, проверьте, правильно ли подготовлено содержимое артефакта.

wade zhou - MSFT 01.07.2024 15:50

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

Boris Jovanovic 01.07.2024 16:12

Если вы загрузите артефакт на компьютер с агентом и развернете его с помощью Azure cli, сможет ли приложение-функция найти модуль? Как я уже упоминал выше, структура артефакта выглядит странно.

wade zhou - MSFT 01.07.2024 16:39

Я тоже попробовал это (см. Редактирование кода).

Boris Jovanovic 01.07.2024 17:00

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

wade zhou - MSFT 02.07.2024 08:16

С артефактом все в порядке, я скачал и проверил его, развернута та же структура, что и в самом артефакте, единственное, что отличается от развертывания VS Code, это то, что в артефакте есть папка .vscode при создании через конвейер. .

Boris Jovanovic 02.07.2024 09:19

Наличие папки .vscode не имеет значения. Если вы попытались развернуть Azure Cli с помощью zip-архива артефакта, но модуль по-прежнему не найден, это означает, что содержимое неверно. Нет необходимости сравнивать развертывание кода VS.

wade zhou - MSFT 02.07.2024 16:42

Однако он работает при развертывании через код VS.

Boris Jovanovic 02.07.2024 17:10

Он использует другую файловую структуру, если вы развертываете его с помощью кода VS. Но если вы выполняете развертывание с помощью Azure Cli или задачи DevOps, они оба используют одно и то же содержимое артефакта. Рекомендуется следовать документу , чтобы создать образец Python, проверить код и сравнить развертывание с Devops.

wade zhou - MSFT 03.07.2024 13:40

Могу ли я узнать, исправлено ли содержимое артефакта? Пожалуйста, проверьте, есть ли у вас .gitignore в репозитории, который обычно игнорирует __pycache__/, когда вы отправляете код из локального хранилища.

wade zhou - MSFT 15.07.2024 15:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
11
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После обширного сеанса отладки со службой поддержки Microsoft нам удалось найти решение.

Оказывается, в VS Code есть множество различных проверок при развертывании приложения-функции, тогда как эти шаги необходимо реализовать вручную в конвейере Azure DevOps.

В конечном итоге трюк заключался в первоначальной настройке:

ENABLE_ORYX_BUILD = true
SCM_DO_BUILD_DURING_DEPLOYMENT = true
WEBSITE_RUN_FROM_PACKAGE = 0

А также удалить часть требований к установке из конвейера DevOps и изменить метод развертывания на zipDeploy вместо auto.

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

После первого развертывания с вышеуказанными настройками функции наконец появились в приложении-функции, после чего мы могли отредактировать конвейер для выполнения сборки (вернули часть требований к установке) и установить:

ENABLE_ORYX_BUILD = false
SCM_DO_BUILD_DURING_DEPLOYMENT = false

После выполнения первоначальной сборки самого приложения развертывание со сборкой Azure DevOps теперь можно использовать в обычном режиме.

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

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

Другие вопросы по теме

Azure Blob: как автоматизировать преобразование архивного хранилища Azure в холодный/горячий уровень, отправить ссылку для загрузки, как только она станет доступна, и повторно заархивировать через 72 часа?
Код ошибки CS:0021 в проекте функции Azure в VS для запуска API Microsoft Graph с функциями Azure
Localhost:300/api не работает: «Эта страница не работает»
Секреты безопасно внедряются в Dockerfile во время сборки .NET
Хранилище ключей, созданное с использованием политики доступа с использованием BICEP, создает составную идентификацию
Назначение политики срока службы токена приложению в Microsoft EntraID, похоже, не имеет никакого эффекта
Azure — назначение участника сети в PIM
Как создать набор данных для пользовательской речи Azure с помощью Spx (speechCLI)
Скрипт инициализации на блоках данных
Загрузите зарегистрированный компонент в Azure ML для конвейера с помощью пакета SDK Python v2