Amimoto AMI で Amazon RDS を使う

Amazon RDS とは

Amazon リレーショナルデータベースサービスは,リレーショナルデータベースのセットアップ,運用,クラウド上でのスケール変更すべてが驚くほど簡単に実現できるウェブサービスです。
コストパフォーマンスにすぐれており,自動的にデータベース・ソフトウェアにパッチを適用し,データベースのバックアップ,ユーザ定義の保持期間のバックアップを格納し,ポイント・イン・タイム・リカバリを可能にすることによって,時間のかかるデータベース管理タスクを管理しつつ,高いコストパフォーマンスと柔軟に変更可能なストレージを提供します。

MySQL ,MariaDB,PostgreSQL,Oracle,Microsoft SQL サーバ,そして MySQL 互換の Amazon Aurora DB Engine から選択が可能です。

マルチ AZ 配置オプションにより,複数のアベイラビリティゾーンで DB インスタンスを起動が可能です。このオプションを選択すると,アマゾンは自動的にプロビジョニングと異なるアベイラビリティゾーンに自身の DB インスタンスの同期したレプリカを配置します。プライマリ DB インスタンスと同期し,データの冗長性を担保し,フェイルオーバーサポートをする I/O がフリーズを排除,またシステムバックアップ時の待ち時間のスパイクを最小限に抑えるように利用可能ゾーンの間でレプリケーションされます。

メリット

  • CPU,IOPS,ストレージのスケールが容易
  • 任意・自動のスナップショットベースのバックアップ
  • マルチ アベイラビリティのデプロイメント
  • プライマリの障害発生時には同期しているセカンダリへの切り替えが容易

デメリット

  • DB インスタンスへのシェルアクセスができない
  • ユーザ権限に制限がある
  • MySQL 内のレプリケーションが無効化される
  • 週4時間のメンテナンスウィンドウが表示される
  • RDS インスタンスを止められない

Amazon RDS 内に MySQL サーバを構築する

詳細な情報は以下の URL を参照ください:
MySQL DB インスタンスを作成して MySQL DB インスタンス上のデータベースに接続する

ここでは各設定で必要かつ重要なポイントに絞ってご説明します。

ステップ: データベースの設定を決めます

Multi-AZ Deployment (マルチ AZ 配置)

DB インスタンスをシングル AZ 配置にするであればここは[NO] を選択してください。

[Yes] にした場合 マルチ AZ デプロイメントと MySQL は複数のアベイラビリティゾーンは配置され,コールドスタンバイ状態となります。

マスターで障害が発生した場合, MySQL サーバはスレーブへ自動で切り替わります。料金が倍になる事なく障害耐性を高めることが可能です。

データベースへ割り当てるストレージサイズ

データベースが使用するストレージサイズを指定してください

データベースインスタンスの ID

データベースインスタンスに分かりやすい名前を付けてください。

マスターユーザ名,マスターパスワード,パスワードの確認

MySQL へ接続する際に設定するユーザ名とパスワードです。

ステップ: 詳細設定をする

VPC

どの VPC を選択してもよいですが,デフォルトの VPC で十分です。

データベース セキュリティグループ

RDS を置くセキュリティグループを選択してください。
詳しくは以下の URL をご参照ください:
DB セキュリティグループを操作する

設定するセキュリティグループ内ではポート 3306 を Amimoto AMI のセキュリティグループからアクセスできるよう設定をしてください。

データベース名

データベース名を入力後,データベースはRDSに自動で作成されます。
データベース名が未設定の場合,RDS を起動し, MySQL クライアントへ接続後次のコマンドを実行してデータベースを作成してください。
create database

EC2 から RDS への接続確認

RDS を有効化したあと ssh を使い Amimoto AMI インスタンスから接続ができるかを次のコマンドで確認してください。

$ mysql -h {endpoint} -P 3306 -u {mymasteruser} -p 

Endpoint は AWS マネージメントコンソールの RDS 情報の項目に表示されています。

RDS

mymasteruser と password は RDS 作成時のマスターユーザ名とマスターパスワードです。

データのマイグレーションと wp-config.php の修正

MySQL のデータを Amimoto AMI の RDS へマイグレーションする場合は以下のステップを踏んでください:

wp-cli でデータをエクスポート

データベースのデータを wp-cli でエクスポートしてください

$ wp --path=/path/to/wordpress db export

/path/to/wordpress は WordPress のインストールディレクトリです。
Amimoto AMI の場合,WordPress は通常 /var/www/vhosts/{instance_id} にインストールされています。

mysql コマンドで MySQL のデータを RDS へインポートする

wp-cli でエクスポートしたデータを今度は RDS へインポートします。

$ mysql -h {endpoint} -P 3306 -u {mymasteruser} -p {databasename} < dump.sql
wp-config.php を編集します

以下のように wp-config.php を書き換えてください:

 
// ** MySQL settings - You can get this info from your web host ** //
$db_data = false;
if ( file_exists('/opt/aws/cloud_formation.json') ) {
        $db_data = json_decode(file_get_contents('/opt/aws/cloud_formation.json'), true);
        if ( isset($db_data['rds']) ) {
                $db_data = $db_data['rds'];
                $db_data['host'] = $db_data['endpoint'] . ':' . $db_data['port'];
        }
}
if ( !$db_data ) {
        $db_data = array(
                'database' => 'RDS_DATABASE_NAME_HERE',
                'username' => 'RDS_USER_NAME_HERE',
                'password' => 'RDS_PASSWORD_HERE',
                'host'     => 'RDS_ENDPOINT_HERE',
        );
} 
  • RDS_DATABASE_NAME_HERE : 詳細設定で指定したデータベース名を入れてください
  • RDS_USER_NAME_HERE : データベース名のマスターユーザ名を入れてください
  • RDS_PASSWORD_HERE : データベース名のマスターパスワードを入れてください
  • RDS_ENDPOINT_HERE : RDS のエンドポイントを入れてください

wp-config.php の書き換えが終わったあとは WordPress へ接続ができるかを確認しましょう。

MySQL プロセスを終了

MySQL を RDS へ移動したので Amimoto AMI 内の MySQL プロセスは不要となります。止めてしまいましょう。

次の方法で MySQL の自動起動を止めた上で MySQL プロセスを終了させましょう:

設定ファイルを変更する

Amimoto AMI のミドルウェアの設定は chef-solo で行っています。設定ファイルは /opt/local/amimoto.json です。

MySQL を停止させるにはファイルを次のように書き換えてください:

{
  "nginx" : { "config" : { "user" : "nginx", "group" : "nginx" } },
  "php"   : { "config" : { "user" : "nginx", "group" : "nginx" } },
  "mysql" : { "enabled" : false },
  "phpfpm"  : { "enabled" : true },
  "run_list" : [ "recipe[amimoto]" ]
}

Amimoto AMI HHVM 版をお使いの方はこのように変えてください:

{
  "nginx" : { "config" : { "user" : "nginx", "group" : "nginx" } },
  "php"   : { "config" : { "user" : "nginx", "group" : "nginx" } },
  "mysql" : { "enabled" : false },
  "hhvm"  : { "enabled" : true },
  "run_list" : [ "recipe[amimoto]" ]
}

仕上げにこのコマンドを実行してください:

$ sudo /opt/local/provision
$ service mysql stop

これで Amimoto AMI で MySQL プロセスは起動しなくなります。

スライド