Azure 函数应用 (Python v2) - 部署后未显示blob_trigger函数

Azure Function App (Python v2) - blob_trigger function not showing after deployment

提问人:average.everyman 提问时间:11/16/2023 更新时间:11/20/2023 访问量:96

问:

我有一个 Python v2 编程模型中的函数应用,它有一个blob_trigger,它应该对在给定存储帐户和容器中创建的新 blob 执行 sth。我在 VSCode 工作。使用 Azurite 在本地运行时,函数应用运行良好,但是当我将其部署到 Azure 时,函数应用下没有“blobTrigger”函数。

这是我的代码:function_app.py

import azure.functions as func
from azure.storage.blob.aio import BlobServiceClient

import datetime
import logging
import json
import os
import sys
import asyncio

_KV_SECRET_INPUT_BLOB_CONNECTION_STRING = os.environ["KV_SECRET_INPUT_BLOB_CONNECTION_STRING"]
STORAGE_CONTAINER_NAME = os.environ["STORAGE_CONTAINER_NAME"]

async def read_blob_contents(connection_string: str, input_container_name: str, input_blob_name: str):
    blob_service_client = BlobServiceClient.from_connection_string(connection_string)
    container_client = blob_service_client.get_container_client(input_container_name)
    blob_client = container_client.get_blob_client(input_blob_name)

    try:
        blob_contents = await blob_client.download_blob(encoding = 'utf-8')
        return await blob_contents.readall()
    except Exception as e:
        logging.error(f"Error reading blob: {str(e)}")
        return None
    finally:
        await blob_service_client.close()


app = func.FunctionApp()
@app.function_name(name="blobTrigger")
@app.blob_trigger(arg_name="myblob", path=STORAGE_CONTAINER_NAME, connection="KV_SECRET_INPUT_BLOB_CONNECTION_STRING")

async def blob_trigger(myblob: func.InputStream, context: func.Context) -> None:

    func_invoc_and_event_meta = json.dumps({
        "function_name" : context.function_name,
        "function_invocation_id" : context.invocation_id,
        'blob_name': myblob.name,
        'blob_length': myblob.length,
        'blob_uri': myblob.uri,
    }, indent=4)

    logging.info('Blob trigger processed an event:')
    logging.info(func_invoc_and_event_meta)

    logging.info("Attempting to read the blob...")
    
    try:
        blob_url = myblob.uri
        logging.info(f"blob_url: '{blob_url}'")
               
        # Read the contents of the blob asynchronously
        input_container_name = myblob.name.split('/', maxsplit=1)[0]
        input_blob_name = myblob.name.split('/', maxsplit=1)[1]
        blob_contents = await read_blob_contents(connection_string=_KV_SECRET_INPUT_BLOB_CONNECTION_STRING, input_container_name=input_container_name, input_blob_name=input_blob_name)
        logging.error("blob reading completed")

    except:
        logging.error("ERROR during blob read : ")
        logging.error(str(sys.exc_info()))

我确保函数应用具有适当的应用设置,即 和。该设置包含旨在存储数据(新 Blob)的存储帐户的连接字符串,并且它与通过 appsetting 链接到函数应用的存储帐户不同。KV_SECRET_INPUT_BLOB_CONNECTION_STRINGSTORAGE_CONTAINER_NAMEKV_SECRET_INPUT_BLOB_CONNECTION_STRINGAzureWebJobsStorage

那么问题可能是什么呢?

与此相关的是,我还部署了另一个由 CRON 触发的函数应用程序,对于该应用程序,一切都按预期工作。

azure-functions azure-blob-storage azure-python-sdk azure-triggers

评论

0赞 Pravallika KV 11/16/2023
函数应用配置中是否有应用程序设置。SCM_DO_BUILD_DURING_DEPLOYMENT=TRUE
0赞 average.everyman 11/16/2023
不,什么时候需要这个设置?
0赞 Pravallika KV 11/16/2023
在部署函数之前,需要手动添加此设置。参考我的 SO 答案。
0赞 average.everyman 11/16/2023
@PravallikaKV这恐怕没有帮助。在另一个 SO 问题的链接中,也没有太多关于此的细节。
0赞 Pravallika KV 11/16/2023
您是否正在尝试使用消费计划功能应用?如果是,请尝试使用任何其他计划,例如应用服务计划。

答:

0赞 D A 11/16/2023 #1

尝试:

  1. FUNCTIONS_EXTENSION_VERSION 设置为 ~4。查看本文以指导您。
  2. 必须使用常规用途存储帐户。

评论

0赞 average.everyman 11/16/2023
是的,两者都已经有了
0赞 Pravallika KV 11/20/2023 #2
  • 如果在 中设置了该设置,请添加存储连接字符串作为其值,而不是 。"AzureWebJobsStorage": "UseDevelopmentStorage=true"local.settings.json"UseDevelopmentStorage=true"

  • 在 local.settings.json 和函数应用环境变量中添加设置。"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"


我创建了一个 Python V2 Azure 函数,并使用消耗计划部署到 Azure 函数应用。

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
    "AzureWebJobsStorage": "<storage_connection_string>"
      }
}
  • 部署状态:

enter image description here

门户:

enter image description here

0赞 average.everyman 11/20/2023 #3

在测试并仔细检查所有内容后,我设法将问题范围缩小到以下几点:

  1. requirements.txt未包含代码中语句中引用的所有 Python 库importfunction_app.py
  2. 函数应用的应用程序设置在语句的应用程序代码中拼写错误,因此无法找到os.environ

解决这些问题可以解决问题。部署后,该函数会正确显示在函数应用下。