AMIMOTO AMI を使って、WordPress を立ち上げて、接続先を RDS に変更してみる

# ０．はじめに

WordPress でサイトを作ろうということになって、

やっぱ AWS だよね。ということになって、

AMIMOTO AMI を使ってみました。

ついでに、
DB の接続先を RDS に変更してみました。

# １．AMIMOTO AMI の EC2 インスタンスを作成する
1. 以下のサイトの手順に沿って、AMIMOTO AMI の EC2 インスタンスを作成
    * [AMIMOTO AMIでWordPressを立ち上げる \- Qiita](http://qiita.com/Ichiro_Tsuji/items/88f9009f80f3439ad9fa)

    ん〜、細かく書いててくれて、非常にありがたい。
    感謝♪

# ２．MySQL on RDS を作成する
1. RDS のコンソール画面から、ウィザートにしたがって、ポチポチと RDS インスタンスを作成

    本当、すぐできちゃう。
    素敵♪

# ３．DB をローカルから RDS へ移行する
1. WordPress を停止

    ```bash
    nginx -s stop
    service httpd stop
    service nginx stop
    ```
<br>
1. ローカル DB からダンプファイルをエクスポート

    ```bash
    mysqldump -h localhost -P 3306 -u [USERID] -p[PASSWORD] --databases [DBNAME] > mysqldump.sql
    ```
<br>
1. RDS にデータベースを作成

    ```bash
    mysql -h [RDS EndPoint] -P 3306 -u [USERID] -p[PASSWORD] mysql
    > show databases;
    > create database [DBNAME];
    > show databases;
    ```
<br>

1. RDS にデータベースユーザーを作成

    ```bash
    mysql -h [RDS EndPoint] -P 3306 -u [USERID] -p[PASSWORD] mysql
    > select Host, User, Password from mysql.user;
    > grant all on [DBNAME].* to '[USERID]'@'[IP-Address]' identified by '[PASSWORD]';
    > select Host, User, Password from mysql.user;
    ```
<br>
1. 出力したダンプファイルから、データを RDS へインポート

    ```bash
    mysql -h [RDS EndPoint] -P 3306 -u [USERID] -p[PASSWORD] [DBNAME] < mysqldump.sql
    ```
<br>
1. WP の接続先を RDS へ変更
<br>
    * ベースディレクトリへ移動し、

    ```bash
    cd /var/www/vhosts/i-*
    ```
    * ローカル接続用の設定ファイルを mv

    ```bash
    mv local-config.php local-config.php.remove
    ```
    * 接続用の設定ファイルを変更

    ```bash
    cp -fp wp-config.php wp-config.php.ORG
    vi wp-config.php
    diff wp-config.php wp-config.php.ORG 
18,57c18
< $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' => '[DBNAME]',
<                 'username' => '[USERID]',
<                 'password' => '[PASSWORD]',
<                 'host'     => '[RDS EndPoint]:3306',
<         );
< }
< 
< /** The name of the database for WordPress */
< //define('DB_NAME', $db_data['database']);
< define('DB_NAME', '[DBNAME]');
< 
< /** MySQL database username */
< //define('DB_USER', $db_data['username']);
< define('DB_USER', '[USERID]');
< 
< /** MySQL database password */
< //define('DB_PASSWORD', $db_data['password']);
< define('DB_PASSWORD', '[PASSWORD]');
< 
< /** MySQL hostname */
< //define('DB_HOST', $db_data['host']);
< define('DB_HOST', '[RDS EndPoint]:3306');
< 
< /** Database Charset to use in creating database tables. */
< define('DB_CHARSET', 'utf8');
< 
< /** The Database Collate type. Dont change this if in doubt. */
< define('DB_COLLATE', '');
< 
< unset($db_data);
---
> require_once( dirname(__FILE__).'/local-config.php' );
128,130d88
< /** SSL **/
< define('FORCE_SSL_LOGIN', true);
< define('FORCE_SSL_ADMIN', true);
    ```
<br>
1. WordPress を開始

    ```bash
    nginx
    service httpd start
    service nginx start
    ```
<br>
1. ※参考
    * [AMIMOTO AMI で Amazon RDS を使う \| 超高速 WordPress AMI AMIMOTO](https://ja.amimoto-ami.com/2016/03/25/use-amazon-rds-amimoto-ami-wordpress/)
    * [WordPressのセキュリティ向上\-管理画面のHTTPS化　～AWSで作るWordPress～　Part\.5 \| ねっとわーくえんじにあとか](https://www.neteng.co/?p=455)

# ３．chef 関連の設定変更

作成した EC2 インスタンスから AMI を作成し、それを元に複製したりすると、動かなくなったりするので、chef 関連の設定を変更します。

1. デフォルト言語の変更
    * /opt/local/chef-repo/cookbooks/amimoto/attributes/default.rb

    ```bash
    diff default.rb.ORG default.rb
1c1
< default[:sysconfig][:lang] = 'en_US.UTF-8'
---
> default[:sysconfig][:lang] = 'ja_JP.UTF-8'
    ```
<br>
1. ローカルの MySQL の設定を削除
    * /opt/local/chef-repo/cookbooks/amimoto/recipes/default.rb

    ```bash
    diff default.rb.ORG  default.rb
30c30
< include_recipe 'amimoto::mysql'
---
> # include_recipe 'amimoto::mysql'
    ```
    * /opt/local/chef-repo/cookbooks/amimoto/recipes/wordpress.rb

    ```bash
    diff wordpress.rb.ORG wordpress.rb
7c7
< include_recipe 'amimoto::mysql'
---
> # include_recipe 'amimoto::mysql'
    ```
<br>

1. 複製によるインスタンス ID 変更時の対応の設定
    * /opt/local/chef-repo/cookbooks/amimoto/recipes/httpd.rb
<br>
        …ベースディレクトリ名の対応

    ```bash
    diff httpd.rb.ORG httpd.rb
19a20,43
> if !(File.exist?(node[:wordpress][:document_root])) then
>   pre_servername_tmp = `ls -Ft /var/www/vhosts/ | grep / | grep ^i- | grep -v #{node[:ec2][:instance_id]} | head -n 1 | tr -d ^/`.chomp
>   case pre_servername_tmp
>   when /^i-/
>     pre_document_root = '/var/www/vhosts/' + pre_servername_tmp
>     execute "pre_document_root zip" do
>       command "zip -r '#{pre_document_root}'.zip '#{pre_document_root}'" 
>       action :run
>     end
>     execute "pre_document_root rename" do
>       command "mv '#{pre_document_root}' '#{node[:wordpress][:document_root]}'" 
>       action :run
>     end
>   end
> end
> 
> template "/etc/httpd/conf/httpd.conf" do
>   variables node[:httpd][:config]
>   source "httpd/conf/httpd.conf.erb" 
>   if node[:httpd][:service_action].include?(:start)
>     notifies :restart, 'service[httpd]'
>   end
> end
     ```
    * /opt/local/chef-repo/cookbooks/amimoto/recipes/nginx.rb
<br>
        …conf ファイル内の設定の対応

    ```bash
    diff /opt/local/chef-repo/cookbooks/amimoto/recipes/nginx.rb.ORG /opt/local/chef-repo/cookbooks/amimoto/recipes/nginx.rb
16a17,32
> %w{ default.conf default.backend.conf }.each do | file_name |
>   template "/etc/nginx/conf.d/" + file_name do
>     variables(
>       :listen => node[:nginx][:config][:listen],
>       :listen_backend => node[:nginx][:config][:listen_backend],
>       :server_name => node[:ec2][:instance_id],
>       :document_root => node[:wordpress][:document_root],
>       :wp_multisite => node[:nginx][:config][:wp_multisite],
>       :mobile_detect_enable => node[:nginx][:config][:mobile_detect_enable],
>       :phpmyadmin_enable => node[:nginx][:config][:phpmyadmin_enable]
>     )
>     source "nginx/conf.d/" + file_name + ".erb" 
>     notifies :restart, 'service[nginx]'
>   end
> end
> 
    ```
<br>
1. PHP Warning:  session_start(): の対応
    * /opt/local/chef-repo/cookbooks/amimoto/recipes/mod_php7.rb

    ```bash
    diff mod_php7.rb.ORG mod_php7.rb
41c41
< %w{ /var/tmp/php /var/tmp/php/session /var/log/php-fpm }.each do | dir_name |
---
> %w{ /var/tmp/php /var/tmp/php/session /var/log/php-fpm  /var/opt/remi/php70/lib/php/session }.each do | dir_name |
    ```
    * 参考
        * [nginx\+php\-fpm環境でのCakePHPで"Warning \(2\): session\_start\(\)"エラーが出る \- Qiita](http://qiita.com/ymt93/items/b8299575bb39bfd6fa9a)
<br><br>
1. server reached MaxClients setting, consider raising the MaxClients setting の対応
    * /opt/local/chef-repo/cookbooks/amimoto/templates/default/httpd/conf/httpd.conf.erb

    ```bash
    diff httpd.conf.erb.ORG httpd.conf.erb
106,107c106,107
< ServerLimit       <%= node[:nginx][:config][:upstream_keepalive].to_i + 2 %>
< MaxClients        <%= node[:nginx][:config][:upstream_keepalive].to_i + 2 %>
---
> ServerLimit       <%= node[:nginx][:config][:upstream_keepalive].to_i + 112 %>
> MaxClients        <%= node[:nginx][:config][:upstream_keepalive].to_i + 112 %>
    ```
    * 参考
        * [実用 Apache 2\.0運用・管理術（3）：httpd\.confによるWebサーバの最適化 \(2/3\) \- ＠IT](http://www.atmarkit.co.jp/ait/articles/0509/16/news128_2.html)
<br><br>
1. nginx のログファイル名
    * 以下のファイルにおいて、 `<%= @server_name %>-` や `<%= @server_name %>.`
 の部分を削除

    ```bash
    $ cd /opt/local/chef-repo/cookbooks/amimoto/templates/default/nginx/conf.d

    $ grep 'access\.log' *.erb

    default-ssl.conf.erb:    access_log  /var/log/nginx/<%= @server_name %>-ssl.access.log  main;
    default.backend.conf.erb:    access_log  /var/log/nginx/<%= @server_name %>.backend.access.log backend;
    default.conf.erb:    access_log  /var/log/nginx/<%= @server_name %>.access.log  main;

    $ grep 'error\.log' *.erb

    default-ssl.conf.erb:    error_log   /var/log/nginx/<%= @server_name %>-ssl.error.log;
    default.conf.erb:    error_log   /var/log/nginx/<%= @server_name %>.error.log;
    ```
<br>

# ９９．ハマりポイント

* RDS への接続先の切替で大分手間取りました…。ローカル接続用の設定ファイル (local-config.php) があるとは露も知らずに、オロオロしてました…。非常に悔しい思いです。
<br><br>
* あとは、やっぱり chef 絡みです。AMI から複製してもちゃんと動かないし、色々と調べながらで苦労しました。というか、この対応で本当にいいのか、正直疑問です。何か問題があれば、言ってください。

# ＸＸ．まとめ

WrodPress も chef もよく知らなかったので色々戸惑いましたが、とりあえず、ちゃんと動いて良かったです。

t2.micro で動かしてますが、特に問題なく非常に助かってます。

そういえば、
WordPress 絡みで、Google Analytics の設定とかもしたので、その辺の事も投稿しようかなと思います。

大した設定してないですけどね…。
メモ代わりに。

ご参考になれば。