AzureのMySQL In Appがつながらなくなった

投稿者: | 2019年4月14日

AzureのApp Service上で、Laravelを使ったWebサービスを構築していたところ、DBにはMySQL In Appを使っていたのですが、あるとき急に接続できなくなりました。

調査してみると、どうもMySQL In Appはポート番号が変わることがあるそうです。最初はそんな馬鹿なと思いましたが、AzureはVM上で動作しており、パフォーマンスの調整のため、リソースを休止したり起動したりするため、ポート番号が変わってしまうとのこと。

MySQL In Appの接続情報は、 D:\home\data\mysql\
MYSQLCONNSTR_localdb.txt に記述されていましたので、それをLaravelの設定ファイルにも記述していました。
しかし、このファイルの内容は永続的ではないので、別の方法に変更することにします。

MySQL In Appの設定情報を確認してみると、接続文字列は環境変数「MYSQLCONNSTR_localdb」で取得できるようになっています。

そこでLaravelのプログラムを下記のように修正しました。
修正したファイルは config/database.php です。

<?php
// 環境変数からポート番号を調べ、$portに代入
 $port = env('DB_PORT', '3306');
 $localdb = getenv('MYSQLCONNSTR_localdb');
 if(isset($localdb)){
     if(preg_match('/Data Source=127.0.0.1:([0-9]*);/', $localdb, $tmps)){
         $port = $tmps[1];
     }
 }

return [
    (中略)
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => $port,
    (後略)

これでポート番号が知らないうちに変わっても、DBへの接続は維持されるようになりました。