{"id":753,"date":"2026-03-19T08:27:24","date_gmt":"2026-03-19T07:27:24","guid":{"rendered":"https:\/\/digitalmaterial.ch\/blog\/?p=753"},"modified":"2026-03-19T08:27:25","modified_gmt":"2026-03-19T07:27:25","slug":"deploying-python-azure-functions-on-flex-consumption","status":"publish","type":"post","link":"https:\/\/digitalmaterial.ch\/blog\/deploying-python-azure-functions-on-flex-consumption\/","title":{"rendered":"Deploying Python Azure Functions on Flex Consumption"},"content":{"rendered":"\n<p>We are using a few automations based on Azure Functions, some based on Python, others on PowerShell. Recently we have encountered some issues with one automation running on a Consumption based function with PowerShell. The function is querying the API of our back-office system for some analytics and has been timing out after the 10 Minutes, which also is the maximum Duration of a Consumption based function.<\/p>\n\n\n\n<p>As the Consumtion based plan is on the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-functions\/consumption-plan\" data-type=\"link\" data-id=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-functions\/consumption-plan\" target=\"_blank\" rel=\"noreferrer noopener\">way to retirement<\/a>, we migrated to Flex Consumption which is the new way to go. But as Flex Consumption is only running on Linux (no Windows anymore) and our Function needed some specific Windows Libraries we decided to migrate the whole function to Python and that&#8217;s where our adventure started.<\/p>\n\n\n\n<p>So we changed all the Code and  commited to Github to deploy with a Workflow to the Function. This is pretty easy at first, as Azure can create the whole Workflow directly from the Deployment Center. This left us with the following information in the Deployment Center:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"521\" height=\"404\" src=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-7.png\" alt=\"\" class=\"wp-image-779\" srcset=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-7.png 521w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-7-300x233.png 300w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><\/figure>\n\n\n\n<p>And the following Flow in Github Workflow:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>name: Build and deploy Python project to Azure Function App - dgmttestfunction\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\nenv:\n  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root\n  PYTHON_VERSION: '3.13' # set this to the python version to use (supports 3.6, 3.7, 3.8)\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Checkout repository\n        uses: actions\/checkout@v4\n\n      - name: Setup Python version\n        uses: actions\/setup-python@v5\n        with:\n          python-version: ${{ env.PYTHON_VERSION }}\n\n      - name: Create and start virtual environment\n        run: |\n          python -m venv venv\n          source venv\/bin\/activate\n\n      - name: Install dependencies\n        run: pip install -r requirements.txt\n\n      # Optional: Add step to run tests here\n\n      - name: Zip artifact for deployment\n        run: zip release.zip .\/* -r\n\n      - name: Upload artifact for deployment job\n        uses: actions\/upload-artifact@v4\n        with:\n          name: python-app\n          path: |\n            release.zip\n            !venv\/\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    permissions:\n      id-token: write #This is required for requesting the JWT\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Download artifact from build job\n        uses: actions\/download-artifact@v4\n        with:\n          name: python-app\n\n      - name: Unzip artifact for deployment\n        run: |\n          unzip release.zip\n          rm release.zip\n        \n      - name: Login to Azure\n        uses: azure\/login@v2\n        with:\n          client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID }}\n          tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID }}\n          subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}\n\n      - name: 'Deploy to Azure Functions'\n        uses: Azure\/functions-action@v1\n        id: deploy-to-function\n        with:\n          app-name: 'dgmttestfunction'\n          slot-name: 'Production'\n          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Build and deploy Python project to Azure Function App - dgmttestfunction<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">on<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">push<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">branches<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #CE9178\">main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">workflow_dispatch<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">env<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">AZURE_FUNCTIONAPP_PACKAGE_PATH<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the path to your web app project, defaults to the repository root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">PYTHON_VERSION<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;3.13&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the python version to use (supports 3.6, 3.7, 3.8)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">jobs<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">build<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Checkout repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/checkout@v4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Setup Python version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/setup-python@v5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">python-version<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.PYTHON_VERSION }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Create and start virtual environment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          python -m venv venv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          source venv\/bin\/activate<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Install dependencies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">pip install -r requirements.txt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\"># Optional: Add step to run tests here<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Zip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">zip release.zip .\/* -r<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Upload artifact for deployment job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/upload-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">path<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            !venv\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">deploy<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">needs<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">id-token<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">write<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for requesting the JWT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Download artifact from build job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/download-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Unzip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          unzip release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          rm release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Login to Azure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">azure\/login@v2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">client-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_CLIENTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">tenant-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_TENANTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">subscription-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Deploy to Azure Functions&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Azure\/functions-action@v1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">deploy-to-function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">app-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;dgmttestfunction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">slot-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Production&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">package<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now if we ignore the fact, that the Actions used are pretty old <code>actions\/checkout<\/code> is currently at v6, <code>actions\/upload-artifact<\/code> at v7 this looks pretty good, but if we look at our Function we see the following error:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"529\" src=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1-1024x529.png\" alt=\"\" class=\"wp-image-756\" srcset=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1-1024x529.png 1024w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1-300x155.png 300w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1-768x397.png 768w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1-1536x793.png 1536w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-1.png 1582w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The error message is quite clear:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>File \"\/home\/site\/wwwroot\/function_app.py\", line 1, in from flask import Flask, render_template_string ModuleNotFoundError: No module named 'flask'. Cannot find module. Please check the requirements.txt file for the missing module. <\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">File &quot;\/home\/site\/wwwroot\/function_app.py&quot;, line 1, in from flask import Flask, render_template_string ModuleNotFoundError: No module named &#39;flask&#39;. Cannot find module. Please check the requirements.txt file for the missing module. <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>But our requirements.txt looks like this (in this Test-Function)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>flask<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #CE9178\">flask<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>So the current issue is, that the Modules are not shipped to the Azure Function. But looking at the Logs of the Action, this looks fine:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Run pip install -r requirements.txt\nCollecting flask (from -r requirements.txt (line 1))\n  Downloading flask-3.1.3-py3-none-any.whl.metadata (3.2 kB)\nCollecting blinker>=1.9.0 (from flask->-r requirements.txt (line 1))\n  Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB)\n.................\nInstalling collected packages: markupsafe, itsdangerous, click, blinker, werkzeug, jinja2, flask<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #CE9178\">Run pip install -r requirements.txt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">Collecting flask (from -r requirements.txt (line 1))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">Downloading flask-3.1.3-py3-none-any.whl.metadata (3.2 kB)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">Collecting blinker&gt;=1.9.0 (from flask-&gt;-r requirements.txt (line 1))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">...<\/span><span style=\"color: #B5CEA8\">..............<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Installing collected packages<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">markupsafe, itsdangerous, click, blinker, werkzeug, jinja2, flask<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>But when we look a bit closer, the next Step (<code>Zip artifact for deployment<\/code>) does not pack the file. We can see every files that gets packed, but no Modules what we installed into the venv. Also if we download and open the Artifact, there is no Flask to be found.<\/p>\n\n\n\n<p>This suggested that the virtual environment did not persist between steps. So we tried to activate the venv before installing and zipping the requirements. That means our <code>Install dependencies<\/code> and <code>Zip artifact for deployment<\/code> steps now looks like that<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>      - name: Install dependencies\n        run: |\n          source venv\/bin\/activate\n          pip install -r requirements.txt\n\n      - name: Zip artifact for deployment\n        run: |\n          source venv\/bin\/activate\n          zip release.zip .\/* -r<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Install dependencies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          source venv\/bin\/activate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          pip install -r requirements.txt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Zip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          source venv\/bin\/activate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          zip release.zip .\/* -r<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And we can see that the dependencies are packed into the Artifact:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>  adding: venv\/bin\/flask (deflated 31%)g<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">adding<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">venv\/bin\/flask (deflated 31%)g<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And we can see the dependency in the artifact that is beeing created:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"361\" height=\"199\" src=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-3.png\" alt=\"\" class=\"wp-image-759\" srcset=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-3.png 361w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-3-300x165.png 300w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/figure>\n\n\n\n<p>But this did not resolve our issue as the Function still was not able to load the modules:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4-1024x191.png\" alt=\"\" class=\"wp-image-760\" srcset=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4-1024x191.png 1024w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4-300x56.png 300w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4-768x143.png 768w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4-1536x287.png 1536w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-4.png 1892w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>So after quite some time (and possibly some cursing) we have found two solutions: <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solution 1: Remote Build<\/h2>\n\n\n\n<p>So no luck with the venv and Shipping the Modules, thats why we tried the next thing. Let Azure Function install the dependencies from the <code>requirements.txt<\/code>. This is documented by Microsoft: <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-functions\/functions-deployment-technologies?tabs=linux#remote-build\">Deployment technologies in Azure Functions | Microsoft Learn<\/a><\/p>\n\n\n\n<p>For Linux Consumption, Elastic Premium, and App Service plans you will need to set the following environment variables:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>ENABLE_ORYX_BUILD=true\nSCM_DO_BUILD_DURING_DEPLOYMENT=true<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #CE9178\">ENABLE_ORYX_BUILD=true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">SCM_DO_BUILD_DURING_DEPLOYMENT=true<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>But for Python Apps on Flex Consumption this is not required and supported, we just need to request a remote build:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>When deploying to the Flex Consumption plan, you don&#8217;t need to set any application settings to request a remote build. You instead pass a remote build parameter when you start deployment. How you pass this parameter depends on the deployment tool you&#8217;re using. For Core Tools and Visual Studio Code, a remote build is always requested when deploying a Python app.<\/p>\n<\/blockquote>\n\n\n\n<p>So we change our <code>Deploy to Azure Functions<\/code> deploy step and add the <code>remote-build: true<\/code> and remove the whole <code>Create and start virtual environment<\/code> and <code>Install dependencies<\/code> steps.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>      - name: 'Deploy to Azure Functions'\n        uses: Azure\/functions-action@v1\n        id: deploy-to-function\n        with:\n          app-name: 'dgmttestfunction'\n          slot-name: 'Production'\n          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}\n          remote-build: true<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Deploy to Azure Functions&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Azure\/functions-action@v1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">deploy-to-function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">app-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;dgmttestfunction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">slot-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Production&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">package<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">remote-build<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">true<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And voila. The deployment succeeds, we do not get any errors in the function and are able to access our awesome App:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"223\" src=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-6-1024x223.png\" alt=\"\" class=\"wp-image-763\" srcset=\"https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-6-1024x223.png 1024w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-6-300x65.png 300w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-6-768x167.png 768w, https:\/\/digitalmaterial.ch\/blog\/wp-content\/uploads\/2026\/03\/image-6.png 1314w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This is the full workflow-file that is working now:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>name: Build and deploy Python project to Azure Function App - dgmttestfunction\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\nenv:\n  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root\n  PYTHON_VERSION: '3.13' # set this to the python version to use (supports 3.6, 3.7, 3.8)\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Checkout repository\n        uses: actions\/checkout@v4\n\n      - name: Setup Python version\n        uses: actions\/setup-python@v5\n        with:\n          python-version: ${{ env.PYTHON_VERSION }}\n\n      - name: Zip artifact for deployment\n        run: zip release.zip .\/* -\n\n      - name: Upload artifact for deployment job\n        uses: actions\/upload-artifact@v4\n        with:\n          name: python-app\n          path: |\n            release.zip\n            !venv\/\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    permissions:\n      id-token: write #This is required for requesting the JWT\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Download artifact from build job\n        uses: actions\/download-artifact@v4\n        with:\n          name: python-app\n\n      - name: Unzip artifact for deployment\n        run: |\n          unzip release.zip\n          rm release.zip\n\n      - name: Login to Azure\n        uses: azure\/login@v2\n        with:\n          client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID }}\n          tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID }}\n          subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}\n\n      - name: 'Deploy to Azure Functions'\n        uses: Azure\/functions-action@v1\n        id: deploy-to-function\n        with:\n          app-name: 'dgmttestfunction'\n          slot-name: 'Production'\n          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}\n          remote-build: true<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Build and deploy Python project to Azure Function App - dgmttestfunction<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">on<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">push<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">branches<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #CE9178\">main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">workflow_dispatch<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">env<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">AZURE_FUNCTIONAPP_PACKAGE_PATH<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the path to your web app project, defaults to the repository root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">PYTHON_VERSION<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;3.13&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the python version to use (supports 3.6, 3.7, 3.8)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">jobs<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">build<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Checkout repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/checkout@v4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Setup Python version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/setup-python@v5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">python-version<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.PYTHON_VERSION }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Zip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">zip release.zip .\/* -<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Upload artifact for deployment job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/upload-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">path<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            !venv\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">deploy<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">needs<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">id-token<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">write<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for requesting the JWT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Download artifact from build job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/download-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Unzip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          unzip release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          rm release.zip<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Login to Azure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">azure\/login@v2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">client-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_CLIENTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">tenant-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_TENANTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">subscription-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Deploy to Azure Functions&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Azure\/functions-action@v1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">deploy-to-function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">app-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;dgmttestfunction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">slot-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Production&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">package<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">remote-build<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">true<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Solution 2: Install without venv<\/h2>\n\n\n\n<p>The other working solution we have found was to ditch the venv and install the Python Modules during the build process directly into the current folder. Meaning we remove the <code>Create and start virtual environment<\/code> step and change the <code>Install dependencies step<\/code> to the following and we need to update the zip command to include folder starting with a dot<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>      - name: Install dependencies\n        run: pip install --target=\".\/.python_packages\/lib\/site-packages\" -r requirements.txt\n\n      - name: Zip artifact for deployment\n        run: zip release.zip .\/ -r<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Install dependencies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">pip install --target=&quot;.\/.python_packages\/lib\/site-packages&quot; -r requirements.txt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Zip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">zip release.zip .\/ -r<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This installs the Python Modules during the build process, packs it into the artifact and ships it to the Azure Function. Just without the venv. And this works with the following workflow:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>name: Build and deploy Python project to Azure Function App - dgmttestfunction\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\nenv:\n  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root\n  PYTHON_VERSION: '3.13' # set this to the python version to use (supports 3.6, 3.7, 3.8)\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Checkout repository\n        uses: actions\/checkout@v4\n\n      - name: Setup Python version\n        uses: actions\/setup-python@v5\n        with:\n          python-version: ${{ env.PYTHON_VERSION }}\n\n      - name: Install dependencies\n        run: pip install --target=\".\/.python_packages\/lib\/site-packages\" -r requirements.txt\n\n      - name: Zip artifact for deployment\n        run: zip release.zip .\/ -r\n\n      - name: Upload artifact for deployment job\n        uses: actions\/upload-artifact@v4\n        with:\n          name: python-app\n          path: |\n            release.zip\n            !venv\/\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    permissions:\n      id-token: write #This is required for requesting the JWT\n      contents: read #This is required for actions\/checkout\n\n    steps:\n      - name: Download artifact from build job\n        uses: actions\/download-artifact@v4\n        with:\n          name: python-app\n\n      - name: Unzip artifact for deployment\n        run: |\n          unzip release.zip\n          rm release.zip\n\n      - name: Login to Azure\n        uses: azure\/login@v2\n        with:\n          client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID }}\n          tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID }}\n          subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}\n\n      - name: 'Deploy to Azure Functions'\n        uses: Azure\/functions-action@v1\n        id: deploy-to-function\n        with:\n          app-name: 'dgmttestfunction'\n          slot-name: 'Production'\n          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Build and deploy Python project to Azure Function App - dgmttestfunction<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">on<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">push<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">branches<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #CE9178\">main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">workflow_dispatch<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">env<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">AZURE_FUNCTIONAPP_PACKAGE_PATH<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the path to your web app project, defaults to the repository root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">PYTHON_VERSION<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;3.13&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\"># set this to the python version to use (supports 3.6, 3.7, 3.8)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">jobs<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">build<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Checkout repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/checkout@v4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Setup Python version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/setup-python@v5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">python-version<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.PYTHON_VERSION }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Install dependencies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">pip install --target=&quot;.\/.python_packages\/lib\/site-packages&quot; -r requirements.txt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Zip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">zip release.zip .\/ -r<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Upload artifact for deployment job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/upload-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">path<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            !venv\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">deploy<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">runs-on<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">ubuntu-latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">needs<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">permissions<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">id-token<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">write<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for requesting the JWT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">contents<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">#This is required for actions\/checkout<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">steps<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Download artifact from build job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">actions\/download-artifact@v4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">python-app<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Unzip artifact for deployment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">run<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #C586C0\">|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          unzip release.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          rm release.zip<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Login to Azure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">azure\/login@v2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">client-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_CLIENTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">tenant-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_TENANTID }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">subscription-id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID }}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      - <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Deploy to Azure Functions&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">uses<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">Azure\/functions-action@v1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">deploy-to-function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">app-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;dgmttestfunction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">slot-name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;Production&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">package<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>So we had to learn that the default workflow created by Azure does not only use some old versions of the Actions (which is an issue Dependabot can solve) they also don&#8217;t seem to work well with Flex Consumption. There are two working solutions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use Remote Build: <\/strong>Only ship the requirements.txt to the Function and let the Function install the dependencies. This leads to very small artifacts.<\/li>\n\n\n\n<li><strong>Install Modules without the venv:<\/strong> Install the Modules using pip during the Build Process and Ship the Modules to the Function<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We are using a few automations based on Azure Functions, some based on Python, others on PowerShell. Recently we have encountered some issues with one automation running on a Consumption based function with PowerShell. The function is querying the API of our back-office system for some analytics and has been timing out after the 10 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":770,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[36,77,79,78,80],"class_list":["post-753","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","tag-azure","tag-azure-function","tag-depolyment","tag-github","tag-python"],"_links":{"self":[{"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/posts\/753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/comments?post=753"}],"version-history":[{"count":20,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/posts\/753\/revisions"}],"predecessor-version":[{"id":787,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/posts\/753\/revisions\/787"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/media\/770"}],"wp:attachment":[{"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/media?parent=753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/categories?post=753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalmaterial.ch\/blog\/wp-json\/wp\/v2\/tags?post=753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}