マイクロソフトは、8月18日に、MySQLをウェブアプリ内でネイティブに利用できる、プレビュー機能を発表しました。以下はその発表内容を和訳したものです。

MySQL のin-app機能(プレビュー)により、MySQLをネイティブにAzure App Service プラットフォームで利用できます。データベースを別途用意する必要はありません。この機能はMySQL in-app(Preview) をウェブアプリ作成時に有効化するか、既存のウェブアプリで有効化することで利用できます。プレビュー版のMySQL in-app では、以下の主な機能が含まれています。

  • PHPをサポートし、WordPress、JoomlaやDrupalなどのMySQLアプリケーションもサポートします。
  • MySQL サーバはウェブサーバと同じインスタンス内でホストされます。これによりアプリケーションのパフォーマンスを劇的に改善します。
  • ストレージはウェブアプリのファイルとMySQLの両方を保管します。無料と共有プランをご利用の場合は、利用方法によってはクオーターの上限に達してしまう可能性があります。制限内容についての詳細はApp Service plansをご覧ください。
  • MySQLでスロークエリーログと一般クエリーログを有効化出来るようになりました。このログ記録機能によって、アプリケーションの問題調査に利用できます。ただし、サイトのパフォーマンスへ影響を及ぼすため、常時有効にすることはおすすめしません。

Web App + MySQL in-appを作成する

Azure portalへログインし、「新規作成」 –> 「Web + Mobile」 –> 「Web App + MySQL」 へアクセスします。こちらのリンクから Web App + MySQL テンプレートを開くことも可能です。

サイト名を指定し、「MySQL in-app (Preview) 」をデータベースプロバイダーとして指定します。「作成」
をクリックすると、MySQLが含まれたWeb Appがデプロイされます。

Azure マーケットプレイスから、MySQL in-appを利用した、WordPress アプリケーションを選択することも可能です。 こちらのデモサイトへアクセスし、MySQL in-appをお試し頂けます。ユーザー名: demo でパスワード: demopassword です。

制限

プレビュー版のリリースでは、いくつかの機能に制限がありますので、要注意です。

  • MySQLはシングルインスタンス仕様のため、オートスケール機能 はサポートされていません。
  • ローカルキャッシュの有効化はサポートされていません。
  • MySQL データベースは、リモートでアクセスできません。PHPMyadminや、KUDU デバッグコンソールなどを利用した、ツールが必要になります。詳細は、以下で説明しています。
  • MySQL in-appは現在WordPressWeb App + MySQLのテンプレートからのみ作成できます。他のMySQLベースのアプリケーションでもこの機能を利用できるように開発中です。

MySQL in-appを管理する

ウェブアプリへAzureポータルからアクセスし、「MySQL in-app(Preview) 」をクリックします。ここからMySQL in-app機能を管理でき、ログの有効化や、PHPmyadmin等へのアクセスが可能です。

データベースコンテンツへのアクセス

データベースはサンドボックス環境で保護されているため、MySQLワークベンチや、MySQLコマンドラインツールでのリモートアクセスはできません。データベースコンテンツへアクセスするには2つの方法があります:

  • PHPMyAdminをりようする:  MySQL in-appでは、PHPmyadminを利用する前に、MySQLのプロセス ( mysqld.exe) が事前に設定済みの状態である必要があります。つまり、Web Appsがmysql接続を許可している必要があります。こちらのセクションから、MySQL接続を設定するためのサンプルコードをご覧頂けます。
    Web Appへアクセスし、「 MySQL in-app(Preview) 」を選択します。「管理」をクリックすると、PHPmyadminが表示されます。

Web Appのデータベース名は、「azuredb」です。これで、データベースのスキーマや、新しいスキーマをWeb App用に作成できます。

  • Kudu デバッグコンソールを利用: Kudu デバッグコンソールへポータルからアクセスし、web appの中にある、「Advanced Tools」を選択するか、https://サイト名.scm.azurewebsites.net/debugconsoleのURL形式でアクセスします。
  • 以下コマンドを実行することで、クエリが実行されます。(この機能はポート番号3306を利用しないため、ポート番号を事前にweb appのMySQLポートへ変更する必要があります)

D:\Program Files (x86)\mysql\5.7.9.0\bin\mysql.exe -e “ENTER SQL STATEMENTS” –user=azure –password=password –port=49175 –bind-address=127.0.0.1

例:

D:\Program Files (x86)\mysql\5.7.9.0\bin\mysql.exe -e “USE azuredb;Select * from tasks;” –user=azure –password=password –port=49175 –bind-address=127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: Unknown OS character set ‘cp0’.
mysql: Switching to the default character set ‘latin1’.
task_id subject start_date end_date description
1 task1 2016-02-18 2016-02-19 sample task

MySQL の警告情報は無視しても問題ありません。mysqladmin.exeとmysqld.exeも上記フォーマットのように、利用することができます。以下は、ログをフラッシュするコマンドの例です:

mysqladmin.exe flush-logs –user=azure –password=password –port=49175 –bind-address=127.0.0.1

ログ収集

スロークエリーログまたは、一般ログを有効化することができます。有効にすると、ログは「D:\home\logfiles\mysql」のフォルダに格納されます。この設定を常に有効にすると、ウェブアプリのパフォーマンスへ影響を及ぼすので、要注意です。

Web Appをデプロイする際に、MySQL in-appを利用する方法

データベース接続文字列を取得する

Web Appコードをデプロイする前に一番重要なのは、データベースの接続情報へ直接参照できないため、環境変数を利用することです。データベースの接続情報は、 MYSQLCONNSTR_localdb 環境変数を利用すると、確認できます。以下は、アップからデータベースのホスト名、ポート番号、データベース名、データベースユーザーとパスワードを取得する、サンプルのコードスニペットです。

$connectstr_dbhost = ”;
$connectstr_dbname = ”;
$connectstr_dbusername = ”;
$connectstr_dbpassword = ”;

foreach ($_SERVER as $key => $value) {
if (strpos($key, “MYSQLCONNSTR_localdb”) !== 0) {
continue;
}

$connectstr_dbhost = preg_replace(“/^.*Data Source=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbname = preg_replace(“/^.*Database=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbusername = preg_replace(“/^.*User Id=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbpassword = preg_replace(“/^.*Password=(.+?)$/”, “\\1“, $value);
}

$link = mysqli_connect($connectstr_dbhost, $connectstr_dbusername, $connectstr_dbpassword,$connectstr_dbname);

if (!$link) {
echo “Error: Unable to connect to MySQL.” . PHP_EOL;
echo “Debugging errno: ” . mysqli_connect_errno() . PHP_EOL;
echo “Debugging error: ” . mysqli_connect_error() . PHP_EOL;
exit;
}

echo “Success: A proper connection to MySQL was made! The my_db database is great.” . PHP_EOL;
echo “Host information: ” . mysqli_get_host_info($link) . PHP_EOL;

mysqli_close($link);

例として、WordPressのサイトを利用している場合は、wp-config.phpを更新することで、環境変数の接続文字列を取得することができます。

/*Add at the begining of the file*/

$connectstr_dbhost = ”;
$connectstr_dbname = ”;
$connectstr_dbusername = ”;
$connectstr_dbpassword = ”;

foreach ($_SERVER as $key => $value) {
if (strpos($key, “MYSQLCONNSTR_localdb”) !== 0) {
continue;
}

$connectstr_dbhost = preg_replace(“/^.*Data Source=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbname = preg_replace(“/^.*Database=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbusername = preg_replace(“/^.*User Id=(.+?);.*$/”, “\\1“, $value);
$connectstr_dbpassword = preg_replace(“/^.*Password=(.+?)$/”, “\\1“, $value);
}

// ** MySQL settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, $connectstr_dbname);

/** MySQL database username */
define(‘DB_USER’, $connectstr_dbusername);

/** MySQL database password */
define(‘DB_PASSWORD’, $connectstr_dbpassword);

/** MySQL hostname : this contains the port number in this format host:port . Port is not 3306 when using this feature*/
define(‘DB_HOST’, $connectstr_dbhost);

MySQL in-appを利用する際の、最適な利用方法として、Web Appとのデータベース接続障害を防ぐため、常に環境変数を利用されることをおすすめします。 もし、アプリケーションがポート番号のために別の変数を必要としている場合、WEBSITE_MYSQL_PORT 環境変数が利用できます。インスタンスがリサイクルされた場合に、ポート番号が変更となる場合があるため、常に環境変数を利用しましょう。

コードのデプロイ

Azure Web Appsでは、GITまたは、FTPまたは、サポートされているデプロイ手段でWeb Appのコードをデプロイできます。詳細は Deploy to Azure app service web apps (英語)をご参照ください。

データベースのデプロイ

データベースは直接デプロイすることはできません。そのため、ローカルにあるデータベースは、SQLスクリプトとして、エクスポートする必要があります。Web AppのMySQL in-app データベースへ、PHPmyAdminを利用して接続し、 ( https://サイト名.scm.azurewebsites.net/phpmyadmin) 「インポート」タブをクリック、azuredbデータベースへスクリプトをインパクトしてください。例として:

USE azuredb;

CREATE TABLE IF NOT EXISTS tasks (
task_id INT(11) NOT NULL AUTO_INCREMENT,
subject VARCHAR(45) DEFAULT NULL,
start_date DATE DEFAULT NULL,
end_date DATE DEFAULT NULL,
description VARCHAR(200) DEFAULT NULL,
PRIMARY KEY (task_id)
) ENGINE=InnoDB
USE azuredbを常にスクリプトに含めて下さい。これによって、正しいデータベースへスキーマとデータがインポートされます。

既存のWeb Appsで MySQL を有効化する

Web app から「MySQL in-app(Preview) 」を選択し、MySQL in-app を有効にします。

ウェブアプリを参照し、プロセスエクスプローラーから、mysqld.exeが実行されているかを確認します。もし実行されていれば、MySQLサーバは利用可能な状態です。MySQL in-appデータベースのazuredbへアクセスできるように、MySQL接続を解放することをお忘れ無く。

本番データベースへの移行

このデータベースは簡単に、本番環境へ移行することができます。

ベストプラクティス

  • MySQL in-appでWeb Appのベーシック、スタンダード、プレミアムプランをご利用の場合、ALWAYS ON の設定を有効化してください。既定の設定では、一定の時間が経過するとアイドル時にWeb Appはアンロードされてしまいます。そのため、web app と MySQL in-app サーバはより長い時間がかかってロードすることになり、アイドル時は結果としてPHPMyadminへアクセス出来なくなる場合があります。ALWAYS ON 機能を有効化することで、Web Appをアイドルモードにしないように出来ます。
  • 同時ユーザー数が10から20を想定しており、この機能を無料または共有プランでご利用される場合は、WEBSITE_FASTCGI_MAXINSTANCESの設定を追加し、値を3に設定する事を推奨します。この設定はPHP FastCGIのインスタンスを作り過ぎないようにし、メモリの消費を抑えることで、クオータの上限に達してしまう問題を回避します。詳細は、ベンチマークについての投稿をご覧ください。

参考情報

MySQL データベースをMySQL in-app データベースへエクスポートする
MySQL in-app のパフォーマンスをベンチマークする

情報元: https://blogs.msdn.microsoft.com/appserviceteam/2016/08/18/announcing-mysql-in-app-preview-for-web-apps/