Azure App ServiceのMysql In Appが自由でよかったメモ
昨日AzureのApp ServiceというPaaSがレンサバみたいにつかえて便利!というある意味怒られそうなエントリを書きました
しかし、レンサバにはFTP以外にもう一つ重要なものがあります。そう、DBですよね。
PHPerとしてはMysqlがつかいたい、そしてApp ServiceにもMysqlはあるのです!
App ServiceでつかえるDB
まず、Azureには「SQL データベース」という機能があります、AWSで言う所のRDSです。本来これをつかうのが正しい道だとおもいますね。ただ、SQL Serverなんですよね…。後、高くはないんですけど、月500円くらいからです。
この他に「Clear DB」というものが「あった」っぽいんですけど、いまはどこにあるのかよくわからないです。
あとはVMのテンプレートにMysqlもありますが、せっかくのPaaSだと思うと、ちょっと面倒ですよね…。
さて、ここまでもったいつけましたけど、タイトルの通りMysql In App
のお話です。
DISCLAIMER
このエントリでは、AzureとそのAppServiceが提供する拡張性や可用性をほとんど活用してません。このエントリは単純にセコいエンジニアがAzureで遊びでApp Serviceにトライしてみた感想です。つまり、試用や遊びの割り切った範囲で活用する方法の紹介で、(おそらく)「正しいプロダクション環境の運用」とは方向性がちがいます。(そもそも、mysql in appがそういうものじゃないしね)
また、後半にmy.cnfとかの事をかいていますが、マネージドのサービスで公式に用意されていない手段を模索するのは(一般的に)お行儀が悪い行為です、こういったことを推奨するものではありません。ただ、お行儀がよくないと理解しつつ、App ServiceとMysql In Appの理解にはつながると思いますので掲載させていただきます。
Mysql in app(プレビュー)とは?
App Serviceのコンテナ内に、専用のmysqldをつくる事ができます。
説明文をコピペしますと、「MySQL In App (プレビュー) では、アプリでローカル MySQL インスタンスを実行しつつ、App Service プランのリソースを共有できます。MySQL In App を使ったアプリは、運用環境での使用を意図したものではありません。また、単一のインスタンスの範囲を超えてスケールすることもありません。」だそうです。
ということで、やはり肝心の所は良く解らないのですが、まあ極小規模な主に開発用なんだと言いたいのは伝わります。
使い方
「MySQL In App (プレビュー)」のスイッチをオンにするだけ!(?)
「お作法」
次は管理ですね、テーブルとか作りたい。すぐさまその画面上の「管理」をおしましょう!すると我々に馴染み深いphpMyAdminが立ち上がります!
…が、実は地味にわかりづらい作法があるようです。もし以下のようなログイン画面が表示されたら、一見さんお断りで失敗です。
この画面をみたら人はかけずり回ってID/PASSを探すでしょうが、実はどこにもID/PASSは書いていません…。*1
なにいってるのかわからないでしょうが、兎に角この後の手順を踏んでみて下さい。
- 一旦閉じて、概要にいってアプリを再起動(これは大抵不要)
- なんでもいいのでアプリ内のphpのURLを開きます(phpinfo()だけとかでもよい)(これは必要)
プロセスエクスプローラー
をひらき、最新の情報に更新を押します(これは任意)- あらためて
Mysql in App
の中の管理
をひらいてみてください
うまくいけば「ログインした後のphpMyAdminが開けるはずです!やりましたね!!
(「なにいってんの」って思われるかもしれませんけど、本当にこれ気付くまで地味にハマったので)
うまくいった場合のプロセスエクスプローラーの表示は(個人差あるでしょうが)こんな感じです*2
あと、この画面もダメですが。これも上記の手順をおこなったり、phpのURLをなにかひらけばもどってくると思います(多分mysqlプロセスが終了してしまっている)
phpMyAdminについて
説明いらないじゃろ?
mysqlの状態や、渡される権限について
phpMyAdminで接続してみると、azure
というアカウントがわりあてされ、azuredb
というDBが最初から作成されているのがわかります。なるほど、これをつかえばええんじゃな…と思うのは早計だ!(いや、これでも十分なんですけど)
User Accountを確認すると、なんとazureには「ALL PRIVILEGES」が付与されているのだ!すごい!!つまりDBをドンドンつくれます!(GRANT権限はないけどね)
共有サーバーなのにどういうことなのと思われることでしょうが、先程のプロセスビューザーでみた通り、自分専用のmysqldが立ち上がっているのでこういう感じなんでしょうね。富豪的だ。
となれば、勿論mysqlのdata dirも見える所にあります。data/mysql
以下にあります。my.cnf(いや、Windowsだから、my.iniでもいいか)も、その中に置けば読んでくれるはずです。(残念なら後述)
ちなみに、Mysqlのバージョンは5.7.9でした。
PHPからの使い方
phpMyAdminがさわれれば、初期のスキーマ流し込みとかは問題無くできたとおもいます。次はアプリからの接続ですね。
詳しくは以下のURLをみていただきたいのですが、(一部の人には残念)英語です。
端折って言えば、Mysql In Appの接続情報は環境変数経由で渡されます。$_SERVER["MYSQLCONNSTR_localdb"]
にはいっています。(このキー名は固定ではないかもしれない。Mysql In Appの画面にありますので、そこからコピペしましょう)
こいつは(ここにサンプルは貼りませんけど、なかなか「なんでやねん」「マジか」感のある)文字列ですので、これを切った貼ったしましょう。上のURLの中にサンプルコードがあります。
私は「なんでやねん!」と言ってしまったので、自分で書きました。一応以下に置いておきますが、公式のコードをつかうのが一番でしょう。
<?php if(!isset($_SERVER["MYSQLCONNSTR_localdb"])) throw new Exception('MYSQLCONNSTR ENV is not defined'); $azure_mysql_connstr = $_SERVER["MYSQLCONNSTR_localdb"]; $azure_mysql_connstr_match = preg_match( "/". "Database=(?<database>.+);". "Data Source=(?<datasource>.+):". "(?<port>.+);". "User Id=(?<userid>.+);". "Password=(?<password>.+)". "/u", $azure_mysql_connstr, $_); if($azure_mysql_connstr_match === false) throw new Exception('Could not parse for MYSQLCONNSTR ENV'); $db_settings = [ 'host' => $_['datasource'], 'port' => $_['port'], 'database' => $_['database'], 'username' => $_['userid'], 'password' => $_['password'], ]; var_dump($db_settings);
さあ、これで無事にmysqlがつかえるようになりましたね!(?)
まとめ
良い点
- 本物のmysqldである
- 自由度が高い
- mysqlのバージョンも新しくて最高
- 基本無料である()
- 「(慣れ親しんだ)phpMyAdmin最高!」
悪い(悪かった)点
本物のmysqldを管理者権限で渡してもらえるみたいなので、そこらのレンサバより断然自由度が高い。これは遊びや開発だと最高ですね。(まあ、コンテナのクオータにかからないように注意する必要はあるでしょうが)
とはいえ、最初からユーザーもDBもつくってはあるわけで、初心者でmysqlよくわからんという人も、そこらのレンサバと大差無く使えるのではないか(ユーザー名とかを環境変数から引いてくる、というのに慣れないかもしれませんけど、まあ慣れるやろ)。壊してもすぐに作り直せるし、mysqlの練習にも最高ではないでしょうかね。
これをそのままプロダクションには使えないとおもいますけど、まあ中々面白いですね〜。 PHPとMysqlがあれば、8割くらいのPHPerの雑な遊びは満足するのではないかなとおもいます。 是非みなさん試して見てはいかがでしょうか。
こちらからは以上です。(多分、続きます)
(ところで、Mysql一つで200Mbyteくらい食うので、省メモリなmy.cnf設定というあまり考えた事がないことをやらないとな…)
追記
プロの着眼点による指摘
5.7.9!! default_password_lifetime(おっと誰か来たようだ)
— yoku0825 (@yoku0825) 2016年9月25日
とのこと!!!! pic.twitter.com/nx3k4lCfBk
— uzulla (@uzulla) 2016年9月25日
select @@default_password_lifetime
で確認したところ、5.7.9の有名な時限爆弾があるようです。(詳細は後述の参考リンク)
さっそくmy.cnfに修正をいれてみようとしました…が。どうもmy.cnfが反映されない。
んんん?とおもいつつ、いろいろやった結果以下の出力を得ました。
んんん〜〜〜〜(;´Д`)
D:¥home以外は共有されない気がする…
まあ、360日経過するよりも前に5.7.9が5.7.11以降になるんじゃないですかね!?
(参考リンク) yoku0825.blogspot.jp
(この作業でAdvanced Toolsの使い方になれてきましたので、またエントリ書きます…)
追記 my.cnf(あるいはmy.ini)の設置について
調べた結果、以下のmy.ini(cnf)を読むようなのですが、どれもデバッグコンソールからいじる権限がない。
Default options are read from the following files in the given order: D:\Windows\my.ini D:\Windows\my.cnf C:\my.ini C:\my.cnf D:\Program Files (x86)\mysql\5.7.9.0\my.ini D:\Program Files (x86)\mysql\5.7.9.0\my.cnf
ウーム、ダメかー。