You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Python版Azure存储队列触发函数时,全局配置环境变量导致函数不可用的问题求助

部署Python版Azure存储队列触发函数时,全局配置环境变量导致函数不可用的问题求助

各位大佬好,我最近在折腾Python版的Azure App Function,想用队列存储来触发我的函数,部署是通过VS Code来做的,但遇到了个头疼的问题:当我把环境变量和端点配置放在代码全局级别时,部署完成后函数就变得不可用了;但只要把这些全局配置注释掉,部署就一切正常,函数和触发器都能正常显示。

先给大家看看我的代码:

import os
import requests
import logging
from datetime import datetime
from azure.storage.blob.aio import BlobServiceClient
import azure.functions as func
import asyncio
import json
import aiohttp
from isodate import parse_duration
import numpy as np
from ruptures.detection import Pelt
import librosa
import tempfile
import time

# --- Azure Function Configuration ---
# Replace with your actual values
STORAGE_CONNECTION_STRING = os.environ["AzureWebJobsStorage"]  # Use single connection string if same
SOURCE_CONTAINER_NAME = os.environ["STORAGE_CONNECTION_STRING"]
DESTINATION_CONTAINER_NAME = os.environ["DESTINATION_CONTAINER_NAME"]
SPEECH_API_KEY = os.environ["SPEECH_API_KEY"]
YOUR_SAS_TOKEN = os.environ["YOUS_SAS_TOKEN"]

# --- Logging Configuration ---
logging.basicConfig(level=logging.INFO)

# --- Speech to Text API Configuration (with v3.2) ---
endpoint = "https://my-speech-name.cognitiveservices.azure.com/speechtotext/v3.2/transcriptions"
headers = {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": SPEECH_API_KEY
}

app = func.FunctionApp()

@app.function_name(name="sttqueue")
@app.queue_trigger(arg_name="msg",
                   queue_name="transcription-queue",
                   connection="AzureWebJobsStorage")
async def sttqueue(msg: func.QueueMessage):
    logging.info('Python Queue trigger function processed a queue item: %s', msg.get_body().decode('utf-8'))

    try:
        batch = json.loads(msg.get_body().decode('utf-8'))
        logging.info(f"Processing batch: {batch}")

        source_blob_client = BlobServiceClient.from_connection_string(STORAGE_CONNECTION_STRING)
        destination_blob_client = BlobServiceClient.from_connection_string(STORAGE_CONNECTION_STRING)

        async with source_blob_client, destination_blob_client:
            source_container_client = source_blob_client.get_container_client(SOURCE_CONTAINER_NAME)
            destination_container_client = destination_blob_client.get_container_client(DESTINATION_CONTAINER_NAME)

            async with aiohttp.ClientSession() as session:
                for blob_name in batch:
                    blob_url = f"https://{source_container_client.account_name}.blob.core.windows.net/{source_container_client.container_name}/{blob_name}?{YOUR_SAS_TOKEN}"
                    await transcribe_audio(blob_name, blob_url, session, destination_container_client, endpoint, headers)

    except Exception as e:
        logging.error(f"Error processing queue message: {e}")

async def transcribe_audio(blob_name, blob_url, session, destination_container_client, endpoint, headers):
    try:
        # . endpoint and headers)

    except aiohttp.ClientError as e:
        logging.error(f"Error communicating with Speech API: {e}")
    except azure.core.exceptions.AzureError as e:
        logging.error(f"Error accessing Azure Storage: {e}")
    except Exception as e:
        logging.error(f"Error transcribing {blob_name}: {e}")

return app  # Return the Function App object

部署后出现问题的状态:函数显示不可用,没有任何可用的函数实例。
注释掉全局的环境变量和端点配置后,部署成功,函数和队列触发器都正常显示。

我实在搞不懂哪里出问题了,有没有大佬能帮我分析下,给点修复建议?


可能的问题分析与解决方案

我仔细看了你的代码,发现几个明显的问题,这应该就是导致函数部署后不可用的原因:

  1. 环境变量取值错误

    • 你代码里的SOURCE_CONTAINER_NAME = os.environ["STORAGE_CONNECTION_STRING"]明显写错了!这里应该取容器名称对应的环境变量,比如SOURCE_CONTAINER_NAME = os.environ["SOURCE_CONTAINER_NAME"],而不是重复取存储连接字符串的变量。
    • 还有YOUR_SAS_TOKEN = os.environ["YOUS_SAS_TOKEN"]这里拼写错误,环境变量名少了个R,应该是YOUR_SAS_TOKEN = os.environ["YOUR_SAS_TOKEN"]。
  2. 全局代码执行导致初始化失败
    Azure函数在启动时会执行全局级别的代码,如果你在全局里直接用os.environ[]获取不存在或者拼写错误的环境变量,会直接抛出KeyError异常,导致函数初始化失败,最终显示不可用。

针对这些问题,给你几个修复建议:

  • 修正环境变量的取值代码
    把全局配置部分的代码改成:

    # --- Azure Function Configuration ---
    # Replace with your actual values
    STORAGE_CONNECTION_STRING = os.environ["AzureWebJobsStorage"]  # Use single connection string if same
    SOURCE_CONTAINER_NAME = os.environ["SOURCE_CONTAINER_NAME"]
    DESTINATION_CONTAINER_NAME = os.environ["DESTINATION_CONTAINER_NAME"]
    SPEECH_API_KEY = os.environ["SPEECH_API_KEY"]
    YOUR_SAS_TOKEN = os.environ["YOUR_SAS_TOKEN"]
    
  • 确保Azure函数应用中已配置对应环境变量
    登录Azure门户,找到你的函数应用,进入「配置」→「应用程序设置」,添加所有你代码中用到的环境变量键值对,比如SOURCE_CONTAINER_NAME、DESTINATION_CONTAINER_NAME等,确保变量名和代码里的完全一致。

  • 添加容错处理避免初始化失败
    可以用os.getenv()替代os.environ[],这样即使环境变量不存在也不会直接抛出异常,而是返回None,方便你排查问题:

    STORAGE_CONNECTION_STRING = os.getenv("AzureWebJobsStorage")
    SOURCE_CONTAINER_NAME = os.getenv("SOURCE_CONTAINER_NAME")
    # 其他变量同理
    

    或者在全局代码里捕获异常,记录详细日志:

    try:
        STORAGE_CONNECTION_STRING = os.environ["AzureWebJobsStorage"]
        SOURCE_CONTAINER_NAME = os.environ["SOURCE_CONTAINER_NAME"]
        DESTINATION_CONTAINER_NAME = os.environ["DESTINATION_CONTAINER_NAME"]
        SPEECH_API_KEY = os.environ["SPEECH_API_KEY"]
        YOUR_SAS_TOKEN = os.environ["YOUR_SAS_TOKEN"]
    except KeyError as e:
        logging.error(f"Missing required environment variable: {e}")
        raise
    
  • 本地调试验证
    在VS Code里调试函数前,先在local.settings.json里添加所有环境变量,确保本地能正常运行,再进行部署,这样能提前发现问题。

备注:内容来源于stack exchange,提问作者M B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:24:31