AzureにLaravelで作成したアプリケーションをデプロイする　〜MySQL In Appを使う場合

## 概要

Microsoft AzureにLaravelで作成したWebアプリケーションをデプロイする場合、下記公式ドキュメントが非常に参考になります。
[『Azure への PHP Web アプリの作成、構成、デプロイ』](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-web-php-get-started/)

MySQLデータベースを使う場合も同様です。
[『Azure で MySQL データベースを作成して接続する』](https://azure.microsoft.com/ja-jp/documentation/articles/store-php-create-mysql-database/)

しかし、App, DBそれぞれ個別に環境構築するのではなく、「Web App + MySQL」で環境構築した場合、かつMySQLを(ClearDB)ではなく「MySQL In App」を選んだ場合には少し工夫が必要でしたので、そのあたりを補足したいと思います。

## 問題

### Gitリポジトリがない

一つ目に紹介したドキュメントではazure-cliから環境構築したためGitリポジトリが自動的に作成されていますが、Azureポータル(Webインターフェース)から環境構築を行った場合、それを自分で作成する必要があります。
デプロイオプション > ソースの選択 にて「ローカルGitリポジトリ」を選択して作成しましょう。
<img width="895" alt="スクリーンショット 2016-10-05 10.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/11338/ba5a0af3-108e-151c-09f7-4dfbacb4ba87.png">

### Gitリポジトリにプッシュできない

これもやはり、Azureポータルから構築した場合は設定が必要です。
これは[『`git push azure master`できないとき』](http://qiita.com/fullkawa/items/e078392f852ebc5f542c)にまとめましたので、そちらをご覧ください。

### DB名ほかが分からない

本項がこのエントリのメインです。
LaravelからMySQLに接続するためにはDB名、ユーザ名等の情報が必要ですが、ポータルで確認できるのは接続文字列を参照するための環境変数名のみ。
<img width="845" alt="スクリーンショット 2016-10-05 11.14.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/11338/99c8496a-00bf-dd6b-c2c9-f54a9a574876.png">

Laravel(5.2)のデータベース定義(database.php)は･･･

```
return [
(中略)
    'default' => env('DB_CONNECTION', 'mysql'),
(中略)
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],
(中略)
];
```

これを接続文字列から抽出した値を利用できるように修正します。

```
if ($connstr = env('MYSQLCONNSTR_localdb')) { // MySQL In App(Azure)
    $dbhost = preg_replace("/^.*Data Source=(.+?):.*$/", "\\1", $connstr);
    $dbport = preg_replace("/^.*Data Source=(.+?):(.+?);.*$/", "\\2", $connstr);
    $dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $connstr);
    $dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $connstr);
    $dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $connstr);
} else {
    $dbhost = env('DB_HOST', 'localhost');
    $dbport = env('DB_PORT', '3306');
    $dbname = env('DB_DATABASE', 'forge');
    $dbusername = env('DB_USERNAME', 'forge');
    $dbpassword = env('DB_PASSWORD', '');
}

return [
(中略)
    'default' => env('DB_CONNECTION', 'mysql'),
(中略)
    'mysql' => [
        'driver' => 'mysql',
        'host' => $dbhost,
        'port' => $dbport,
        'database' => $dbname,
        'username' => $dbusername,
        'password' => $dbpassword,
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],
(中略)
];
```
## MySQL In Appについて

このエントリを書いている2016年10月5日現在、このサービスはプレビュー版となっています。

[『Announcing MySQL in-app (Preview) for Web Apps』](https://blogs.msdn.microsoft.com/appserviceteam/2016/08/18/announcing-mysql-in-app-preview-for-web-apps/)
そのあたりも含めて上記ブログにいろいろと書いてあるのですが、個人的にポイントだと思った部分を抜粋してみます。

> MySQL server running on the same instance

なるほど、それでリソース一覧ではなくApp Serviceのメニューに「MySQL In App (プレビュー)」があるんですね。

> Storage is shared between both MySQL and your web app files. Note with Free and Shared plans you may hit our quota limits

当然ですが、利用量に気をつけないといけないですね。

> Auto scale feature is not supported

構成を考えれば当然ですが、商用サービスをデプロイするならIn Appは使えないと思っておいた方がよさそうです。

> When using this feature with Free and Shared Web App pricing plans, add the app setting WEBSITE_FASTCGI_MAXINSTANCES and set its value to 3

ベストプラクティスとのことなので、素直に従います。

以上