将没有任何Web服务器/框架的Python应用程序部署到Azure应用程序服务Linux

ghhaqwfi  于 2023-11-21  发布在  Python
关注(0)|答案(1)|浏览(165)

我有一个自定义的Linux应用程序,我没有使用任何框架.这是一个简单的应用程序,有一些模块,做一些预定的工作.要在本地运行,我使用python main.py arg1 arg2 .就是这样,它将使用schedule包和计划作业.我有requirements.txt .
现在我想将其部署到Azure。服务我得到了Azure WebApp Linux。我知道这不是正确的服务,因为我没有通过http提供任何服务,我只是连接一些数据库,API等。
当我尝试使用github操作时,我遇到了虚拟环境等问题。
例如,如果我只是使用start up命令进行部署,就会出现错误

2023-11-11T15:19:27.054568534Z Launching oryx with: create-script -appPath /home/site/wwwroot -output /opt/startup/startup.sh -virtualEnvName antenv -defaultApp /opt/defaultsite -userStartupCommand 'python main.py dev s'
2023-11-11T15:19:27.193901315Z Found build manifest file at '/home/site/wwwroot/oryx-manifest.toml'. Deserializing it...
2023-11-11T15:19:27.214165170Z Build Operation ID: 7f870c51d6df2456
2023-11-11T15:19:27.231953721Z Oryx Version: 0.2.20230707.1, Commit: 0bd28e69919b5e8beba451e8677e3345f0be8361, ReleaseTagName: 20230707.1
2023-11-11T15:19:27.243554311Z Output is compressed. Extracting it...
2023-11-11T15:19:27.243579812Z Extracting '/home/site/wwwroot/output.tar.gz' to directory '/tmp/8dbe2c7322f355e'...
2023-11-11T15:19:30.560170296Z App path is set to '/tmp/8dbe2c7322f355e'
2023-11-11T15:19:36.581666909Z Writing output script to '/opt/startup/startup.sh'
2023-11-11T15:19:36.805404566Z Using packages from virtual environment antenv located at /tmp/8dbe2c7322f355e/antenv.
2023-11-11T15:19:36.805441267Z Updated PYTHONPATH to '/opt/startup/app_logs:/tmp/8dbe2c7322f355e/antenv/lib/python3.11/site-packages'
2023-11-11T15:19:39.130548772Z ERROR:root:Critical Error: [Errno 2] No such file or directory: '/tmp/8dbe2c7322f355e/config/config.json'

字符串
下面是我的github操作

- name: azure webapp deploy
    uses: azure/webapps-deploy@v2
    with:
      app-name: ${{ vars.APP_NAME }}
      package: ${{ vars.DEPLOY_PATH }}
      startup-command: 'python main.py dev s'

ni65a41a

ni65a41a1#

如果您的Web应用程序代码未提供任何HTTP请求,则它将在Azure Web应用程序中失败。您可以做的是创建Azure计时器触发器函数,并根据CRON表达式将计划代码添加到计时器触发器中,以便计时器函数将在特定的计划CRON时间触发。您也可以,通过Github操作在Function应用程序中部署Timer Trigger,如下所示。
你可以使用基于Azure Function Consumption的基本应用程序,这不会花费你太多。
参照此MS Document1MSDocument2创建定时器触发器
在您的**Timer Trigger* init.py中,通过将其定义为方法来添加您的日程安排,我下面的init.py代码在触发定时器触发器时打印一个句子。call_your_task_function()**是我的任务,它打印一个语句,您可以在这里使用您的逻辑。

import datetime
import logging
import azure.functions as func

def main(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if mytimer.past_due:
        logging.info('The timer is past due!')

    logging.info('Python timer trigger function ran at %s', utc_timestamp)

    # Insert your task or function to be executed on schedule here
    # For example, you could call your script or function:
    call_your_task_function()

def call_your_task_function():
    # Your task logic goes here
    logging.info('This is a basic task running on a schedule!')

字符串

  • 我的function.json与CRON计划,每1分钟运行我的函数,你可以根据你的要求安排这一点 *
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */1 * * * *"
    }
  ]
}


我在My github repository中上传了这个函数,并将其部署到Azure Function应用程序中,如下所示:
你可以克隆我的仓库作为参考。

  • 在Azure Function应用>访问>部署中心>源代码- Github >存储库- TimerTrigger >分支- main >保存 *

x1c 0d1x的数据
点击保存后,Github Action工作流将开始部署Function,如下所示:

Github Action工作流程:-

name: Build and deploy Python project to Azure Function App - valleyfunc90

on:
  push:
    branches:
      - main
  workflow_dispatch:

env:
  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' 
  PYTHON_VERSION: '3.10' 

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Python version
        uses: actions/setup-python@v1
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Create and start virtual environment
        run: |
          python -m venv venv
          source venv/bin/activate
      - name: Install dependencies
        run: pip install -r requirements.txt

      # Optional: Add step to run tests here

      - name: Zip artifact for deployment
        run: zip release.zip ./* -r

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v3
        with:
          name: python-app
          path: |
            release.zip
            !venv/
  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'Production'
      url: ${{ steps.deploy-to-function.outputs.webapp-url }}
    
    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v3
        with:
          name: python-app

      - name: Unzip artifact for deployment
        run: unzip release.zip     
        
      - name: 'Deploy to Azure Functions'
        uses: Azure/functions-action@v1
        id: deploy-to-function
        with:
          app-name: 'valleyfunc90'
          slot-name: 'Production'
          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
          scm-do-build-during-deployment: true
          enable-oryx-build: true
          publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D2480FC837C6428D938011D883C5E562 }}




另一种方法,如果你想使用Azure Web应用程序,你可以使用streamlit包,并在你的main.py代码中添加streamlit通过提供streamlit页面来运行你的任务,一个示例Http页面将可用,你的任务将在后端运行.你也可以添加按钮来运行你的任务在main.py本身.参考下面:-
为了使streamlit应用程序正常工作,必须使用定价计划- B1和Python版本3.10部署您的Web应用程序:-


main.py:-

import streamlit as st

def calculate_sum(arg1, arg2):
    return arg1 + arg2

def main():
    st.title('Simple Calculator')

    # Define arguments
    arg1 = 5
    arg2 = 10

    # Calculate sum
    result = calculate_sum(arg1, arg2)

    # Display result
    st.write(f"The sum of {arg1} and {arg2} is {result}")

if __name__ == "__main__":
    main()

requirements.txt:-

streamlit


部署后,在您的Web应用程序中添加以下启动命令:-

python -m streamlit run main.py --server.port 8000 --server.address 0.0.0.0


x1c4d 1x的

部署并添加启动命令后输出:-



我也同意Lex Li的观点,Azure Web应用程序将需要在HTTPS请求中提供一些服务,并需要启动命令来初始化应用程序。Streamlit使您更容易运行任务,并为您提供一个基本的网站,而无需任何HTML,CSS或路由。
作为替代方案**,您还可以使用Azure VM**(大小与B1一样小)来运行您的任务,该任务在Azure或Azure容器应用程序或**Azure Webjobs**中提供免费大小,以在现有Web应用程序的后台运行任务,或Azure batch service运行长时间运行的任务。

相关问题