提问人:average.everyman 提问时间:11/16/2023 更新时间:11/20/2023 访问量:96
Azure 函数应用 (Python v2) - 部署后未显示blob_trigger函数
Azure Function App (Python v2) - blob_trigger function not showing after deployment
问:
我有一个 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_STRING
STORAGE_CONTAINER_NAME
KV_SECRET_INPUT_BLOB_CONNECTION_STRING
AzureWebJobsStorage
那么问题可能是什么呢?
与此相关的是,我还部署了另一个由 CRON 触发的函数应用程序,对于该应用程序,一切都按预期工作。
答:
尝试:
- 将 FUNCTIONS_EXTENSION_VERSION 设置为 ~4。查看本文以指导您。
- 必须使用常规用途存储帐户。
评论
如果在 中设置了该设置,请添加存储连接字符串作为其值,而不是 。
"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>"
}
}
- 部署状态:
门户:
在测试并仔细检查所有内容后,我设法将问题范围缩小到以下几点:
requirements.txt
未包含代码中语句中引用的所有 Python 库import
function_app.py
- 函数应用的应用程序设置在语句的应用程序代码中拼写错误,因此无法找到
os.environ
解决这些问题可以解决问题。部署后,该函数会正确显示在函数应用下。
评论
SCM_DO_BUILD_DURING_DEPLOYMENT=TRUE