こんにちは、サイオステクノロジーの佐藤 陽です。
アドベントカレンダー4回目の登場です。
今日はAzure FunctionsでNo HTTP triggers foundのエラーが発生した時の調査方法のお話です。
根本的な解決策ではないのですが、エラー解消の手がかりになればいいなと思い
備忘録の意味も込めて、記事を書いていこうと思います。
はじめに
pythonの実行環境でAzureFunctionsにアプリをデプロイした際に
「デプロイが失敗しているわけでもないのに、何故か関数が表示されない!!」
といったことが結構起こります。
具体的には以下のようなケースです。
・デプロイ時にエラーメッセージは発生しない(がエンドポイントのURLは表示されない)
デプロイ実行
func azure functionapp publish func-hogehoge --python
結果
Resetting all workers for func-hogehoge.azurewebsites.net
Deployment successful. deployer = Push-Deployer deploymentPath = Functions App ZipDeploy. Extract zip. Remote build.
Remote build succeeded!
[2024-12-02T04:03:16.963Z] Syncing triggers...
Functions in func-hogehoge: //ここで本当はデプロイされるURLが表示されるはず
C:\hogehoge
・VSCodeの拡張機能のデプロイ機能からやってみるとNo HTTP triggers found.と表示される
12:05:49 func-hogehoge: Removing existing manifest file
12:05:49 func-hogehoge: Running pip install...
12:06:01 func-hogehoge: Syncing triggers...
12:06:02 func-hogehoge: Querying triggers...
12:06:06 func-hogehoge: No HTTP triggers found.
・Azure Portalから見た時に関数が表示されない
・ソースコードのファイル自体はアップロードされているように見える
こんな問題が起きた際の調査方法を今日は書き記していこうと思います。
調査方法
まずは皆が通る道として以下のような感じでググるかと思います。
- Azure Functions No HTTP trigger
- Azure Functions 関数 表示されない
そうすると結構な数がヒットするので、困っている人は多そうです。
例えばこちらのstackoverflowなんかを見てみると、まさに同じような現象が起きている人も見受けられます。
そして、このエラーに対する回答として多種多様な回答が来ています。
つまり、様々な要因によってこのエラーは引き起こされているようです。
自分と同じ現象の人にたどり着くのはなかなか難しそうで、しらみつぶしに試していくのは骨が折れます。
ちなみに色々ググって見つけた解決方法としては
- 環境変数の値が正しく設定されていない
- 環境変数に余計な値が登録されている
- インストールしているパッケージに依存して起きるもの
といった内容が多かった気がします。
話は戻り
やみくもに試すのではなく、自分の環境に基づいて調査を行う場合にどこを見ればいいかというと
今回の場合はAzure Portal上の、該当するFunctions Appの「問題の診断と解決」でした。
そして今回は、その中でもPython関数
という指標を選択します。
すると以下のような形で、例外一覧が表示されています。
やたらめったらデプロイしていたので、例外がたくさん発生しています。
いくつか例外が発生している中で、今回原因となっていたのは以下の例外でした。
Timestamp : 12/2/2024 7:15:18 AM
Inner Exception Type: Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcException
Total Occurrences: 44
Latest Exception Message: Worker failed to index functions
Result: Failure Exception: TypeError: Client.__init__() got an unexpected keyword argument 'proxies' Stack: File '/azure-functions-host/workers/python/3.11/LINUX/X64/azure_functions_worker/dispatcher.py', line 469, in _handle__functions_metadata_request self.load_function_metadata( File '/azure-functions-host/workers/python/3.11/LINUX/X64/azure_functions_worker/dispatcher.py', line 449, in load_function_metadata self.index_functions(function_path, function_app_directory)) \ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File '/azure-functions-host/workers/python/3.11/LINUX/X64/azure_functions_worker/dispatcher.py', line 822, in index_functions indexed_functions = loader.index_function_app(function_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File '/azure-functions-host/workers/python/3.11/LINUX/X64/azure_functions_worker/utils/wrappers.py', line 44, in call return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File '/azure-functions-host/workers/python/3.11/LINUX/X64/azure_functions_worker/loader.py', line 244, in index_function_app imported_module = importlib.import_module(module_name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File '/usr/local/lib/python3.11/importlib/__init__.py', line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File '', line 1204, in _gcd_import File '', line 1176, in _find_and_load File '', line 1147, in _find_and_load_unlocked File '', line 690, in _load_unlocked File '', line 940, in exec_module File '', line 241, in _call_with_frames_removed File '/home/site/wwwroot/function_app.py', line 47, in openai_client = AzureOpenAI( ^^^^^^^^^^^^ File '/home/site/wwwroot/.python_packages/lib/site-packages/openai/lib/azure.py', line 205, in __init__ super().__init__( File '/home/site/wwwroot/.python_packages/lib/site-packages/openai/_client.py', line 112, in __init__ super().__init__( File '/home/site/wwwroot/.python_packages/lib/site-packages/openai/_base_client.py', line 793, in __init__ self._client = http_client or SyncHttpxClientWrapper( ^^^^^^^^^^^^^^^^^^^^^^^
どうやらAzureOpenAIを呼び出すクライアントに余分な引数が渡されているようです。
このエラーを解消し、再度デプロイしたところ正常にアプリがデプロイされ、関数も表示されました。
めでたし!
正直これまでAzure Portalの「問題の診断と解決」についてはあまり見てこなかったのですが、
今後はこちらの内容もしっかり押さえて、エラー解消などに役立てたいところです。
Application Insightsとの違いは?
ちなみに「Application Insightsでは分からないの?」と思われる方もいると思うのですが
あれはどちらかというとアプリが正常に起動した後のフェーズの監視ツールのイメージです。
実際、今回のエラーに関してはApplication Insightsの方には何も表示されていませんでした。
今回はそもそもアプリ起動時の処理でコケてしまっていたため、Application Insightsの監視範囲外だったのではないかと思います。
redditにこんな回答もあり、自分としても同じ認識を持っています。
診断設定は、リソース自体からログ/メトリックを取得します。また、診断設定を通じてサービス/OS 自体からどのログ/メトリックが公開されるかは、MS のリソースによって決定されます。
Application Insightsは、Azureリソース上で実行されるコードを通じてこのタイプのデータを取得します。これは、独自の診断コードを挿入することによって行われます。
(日本語訳)
そして今回も「Azure Functions」といったリソースの起動エラーであったため、「問題の診断と解決」の方に記録されたのではないかと思いました。
(もしApplication Insightsの方でも確認する方法などありましたら是非コメントなどで教えてください。)
「問題の診断と解決」の機能に関しては他にも色々と機能があるようなので
必要に応じてしっかり使い分けていきたいところです。
まとめ
今回はAzure Functionsの関数が正しくデプロイされない場合のケースについての調査方法の備忘録でした。
このようなケースにおいては、Azure Portalの「問題の診断と解決」にエラー内容が記載されていることがある、ということが分かりました
必ずしも記載があるわけではないと思うのですが、一度目を向けてみるとエラー解消の手がかりがあるかもしれません。
ではまた!