年度内くらいにIDCFクラウドを追い出されそうなので、無料利用枠の充実しているGCPへの引っ越しを試みる。GCPでwordpressを動かすには、GCEで普通に構築するか、GAEで動かすか。どちらも1インスタンスは無料なので、PHPをGAEで動かして、DBをGCEで動かせば完全無料じゃん、という安直な発想。GCEは今までとそれほど変化はないだろう。NICをブリッジ化できなかったり、フローティングIPが使えなかったりで、多少の構成変更は求められるが。一方のGAEは触ったこともないので、こちらから使ってみる。
最初は皆さんがやっているようなwordpressのapp engine用starter kitを動かすところから始めたんだけど、これがまあ動かない。PHPは動いているようなんだけど、どうしてもDBに繋ぐことが出来ない。仕方がないので、簡単なphpから少しずつ進めていく方針に変更。何事も小さな成功事例を作るところから。という訳で、基本はhelloworldですよ!ぐぐってhelloworld的なサンプルを見つけて真似してみる。小さく始めてみると、何も難しいことはなく、あっさり動作する。試してみた操作は以下のような感じ。
cd /usr/local/src
git clone -b phase0-helloworld https://github.com/GoogleCloudPlatform/appengine-php-guestbook.git helloworld
cd helloworld
gcloud app deploy
これで初めてapp engineが動作しているところを確認できた。続いて、これをDBに接続してみる。本当は高価なCloud SQLなんて使いたくないんだけど、世の中の紹介事例はことごとくCloud SQLなので、とりあえずこちらから。Cloud SQLのインスタンスはCloud Consoleで直感的に作れると思う。気を付けるのは権限だけで、GAEからはlocalhost接続が出来なかったので、dbuser@%のようにどこからでも接続出来る権限を持つユーザーを作っておくこと。これもCloud Consoleで出来る。
準備が出来たら、GCEインスタンスからCloud SQLインスタンスへ接続して、データベースを作成しておく。
sudo ssh gce1
gcloud sql connect db1 --user root
create database wordpress
\q
DBを作ったら、先ほどのアプリを改造していく。まずはapp.yamlを修正。
vi app.yaml
:
runtime: php55
api_version: 1
threadsafe: true
env_variables:
MYSQL_DSN: mysql:unix_socket=/cloudsql/cloud-4321:us-central1:db1;dbname=wordpress
MYSQL_USER: dbuser
MYSQL_PASSWORD: xxxxxxxx
handlers:
- url: /.*
script: helloworld.php
helloworld.phpにDB接続する処理を追加する。
<?php
echo 'Hello World ';
$username = getenv('MYSQL_USER');
$password = getenv('MYSQL_PASSWORD');
$dsn = getenv('MYSQL_DSN');
try{
$db = new PDO($dsn, $username, $password);
} catch (PDOException $e){
echo 'Connection failed: ' . $e->getMessage();
}
$stmt = $db->prepare('SELECT NOW() now');
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo $result['now'];
?>
これをgcloud app deployして確認してみると・・・、おお、DBに繋がった!これで、ようやく接続記述子の書き方がわかった。続いて、今度はGCE上に構築した自前のMySQLに接続出来るか試してみる。内部接続は出来ないようなので、3306をグローバルIPから繋がるように、cloud consoleにてfirewallに穴を開けておくこと。今回は検証なのでポートそのままの3306を開けたものと仮定する。こちらも試行錯誤を繰り返した挙句、以下の設定でGAEからGCEのMySQLへ繋げられることを確認した。
vi app.yaml
:
env_variables:
MYSQL_DSN: mysql:host=35.111.222.123:3306;dbname=wordpress
MYSQL_USER: dbuser
MYSQL_PASSWORD: xxxxxxxx
もちろんIPアドレスの部分は、自分のインスタンスのグローバルIPに書き換えて試して下さい。これでGAE+GCEでwordpress環境を構築できる算段が立ったので、本格的な移行作業を始める。一方でGAEを使った場合のwordpress更新作業をどうするかという問題も考えていかないといけない。ダメなときはPHPもGCEで動かすだけなんだけど。今までの運用水準より悪くなるのは避けたいしね。次回はとりあえずappengine-php-wordpress-starter-projectを動かすところからかなあ。