以下のようにまとめると、読みやすくて注意点も強調できる記事になります。特に「なぜFastAPI必須か」「環境変数設定が必要な理由」を明確に書くと読者に刺さります。
+++ title = “Azure Functions Pythonでストリーミングを実装するときの注意点” date = 2025-08-09T14:53:40+09:00 archives = “2025” thumbnail = “img/azure/azure_logo.png” toc = true tags = [ “Azure” ] categories = [ “cloud” ] menu = “main” +++
はじめに
2024年5月から、Azure FunctionsのPythonでもHTTP Streamingが公式サポートされるようになりました。 本記事では、実装の流れとハマりやすい落とし穴について解説します。
Azure Functionsでストリーミングを実装する
Functionsでストリーミングを実装する場合、以下の設定が必要になります。
環境変数設定
ストリーミングを使用する場合は、Azure Functionsの環境変数に以下の設定が必要になります。
この2つの変数の設定がないと、Functionsのリクエストがタイムアウトします
設定がなくてもエラーログなどは出力されないので、トラブルシューティングに難儀することになることを防ぐため、設定忘れがないよう注意しましょう。
PYTHON_ENABLE_INIT_INDEXING=1
PYTHON_ISOLATE_WORKER_DEPENDENCIES=1
requirements.txt
ストリーミングする際は、拡張機能としてFast-APIを有効にする必要があります。
azure-functions
azurefunctions-extensions-http-fastapi
function_app.py
上記はHello → from → Azure → Functions → Stream!の順にレスポンスをストリーミングで応答するコードです。
StreamingResponseクラスに非同期関数generate_hello_stream()の戻り値をyieldで指定することでストリーミングで応答されます。
yield は、Pythonでジェネレーター(または非同期ジェネレーター)として値を順次返すために使われるキーワードです。
import asyncio
import azure.functions as func
from azurefunctions.extensions.http.fastapi import Request, StreamingResponse
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
async def generate_hello_stream():
messages = ["Hello", "from", "Azure", "Functions", "Stream!"]
for msg in messages:
yield f"data: {msg}\n\n" # SSE形式
await asyncio.sleep(0.5)
yield "data: DONE\n\n"
@app.route(route="chat", methods=[func.HttpMethod.GET])
async def hello_stream_function(req: Request) -> StreamingResponse:
return StreamingResponse(generate_hello_stream(), media_type="text/event-stream")
他機能との併用制限
Fast-APIを使用するので、function_app.py内に通常のHTTPトリガー関数と併用して実装することはできません。
FunctionLoadError: cannot load the http_start function:
'req' binding type "httpTrigger" ... do not match ...
そのため、Durable Functionsと、Fast-APIの併用も実装することはできないため、Functions自体を分離する必要があります。
参考
おわりに
SSEのサポートでPython Functionsのリアルタイム配信がぐっとやりやすくなりました。 ただし、環境変数の設定忘れと併用不可はハマりやすいポイントなので要注意です。