今回はMicrosoft Azureの話。
Microsoft Azureには、無料でWebアプリを公開できるAzure Web Appサービスが存在します。
その際、無料範囲内に収めるため、Web Appと同一のインスタンスで実行可能なMySQLサーバーであるMySQL In App機能を使っている人がいるかと思います。
ですが、これの利用に関してはある落とし穴があります。
前提
前提として、Web Appを無料もしくは共有モードで使用している場合、そのサーバーは共有されたものとなっています。
したがって、そこで実行されているプロセスに関しては共有サーバーで実行されているに等しいものです。
MySQL In Appの仕組みに関して
MySQL In Appは、上述の共有サーバーという仕組みの中でMySQLサーバーをユーザー個別で動かせるようにする仕組みのものです。
同一サーバー上で、同一のポートでは複数のアプリケーションは動作させることはTCP/IPの制約上できません。
ポート番号が3306ではなく、エフェメラルポートが割り当てられるのはこのような技術的制約によるものです。
ポート番号は変更される場合がある
MySQL In Appはできるだけ当初のポート番号を維持しようとします。しかしながら、サーバーは共有ですので、運悪く同一サーバー上の他のユーザーがそのポートを使ってしまうことがあります。
起動中であれば勝手に使われることはないのですが、スリープしていたり、アプリケーションが停止していたりすると他のユーザーが使ってしまうことがあります。
アプリケーションの再起動のタイミングで運悪くバッティングしてしまう場合もあります。これには何らかの原因による意図しない再起動も含みます。
このような場合、既に使用中のポートは使えませんので、MySQL In Appで使用されるポートは自動的に他のエフェメラルポートに変更されます。
正しく設定したはずのWeb Appが、しばらくしてデータベースエラーにより動かなくなることがあるのはこうした仕組みが原因です。
変更されたときに設定し直せばまた動くのですが、それでは面倒ですので自動で取得してしまうのが楽でよいでしょう。
次のページでは、この問題の解決策について説明します。