Azure Durable Functionsでスロット使用時にリクエストが別のスロットにルーティングされる事象
- POST
はじめに 本記事では、Azure Durable Functions を使用して開発・運用されている方向けに、デプロイスロットを併用する環境で発生する「リクエストが別スロットにルーティングされる事象」について解説いたします。特に、本番と検証で同一のストレージアカウントをご利用の場合に注意が必要です。
Azure Durable Functionsとは Azure Durable FunctionsはAzure Functionsの拡張機能です。 詳細は以下の記事をご参照ください。
Azure Durable Functionsとは
事象 Azure Durable Functions において2つのスロット(production と staging)で運用をしていました。
上記構成においてstagingスロット上のアプリにリクエストしていたにも関わらず、オーケストレーター関数がproductionのアクティビティ関数を実行する事象が発生していたため調査を行いました。
原因 Durable Functions では、状態管理およびオーケストレーション処理に Azure Storage(Queue や Table)を使用しております。
このとき、本番と検証のスロットで同一のストレージアカウントおよび同一の TaskHubName を利用している場合、Durable Functions のステート情報が混在し、スロット間でリクエストが交差してしまうことあるようです。
詳細は以下の Stack Overflow のディスカッションもご参照ください:
Azure Durable Functions invoked in mixed slots
対策 1. host.json の Task Hub 名をスロットごとに分ける Durable Functions では host.json ファイルにて durableTask.hubName を指定可能です。スロットごとに異なる名前を明示的に設定することで、ステートの混在を防止できます。
{ "version": "2.0", "extensions": { "durableTask": { "hubName": "MyAppHub-Staging" } } } 例: