WordPress
AWS
RDS
chef
Amimoto

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

More than 1 year has passed since last update.

0.はじめに

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

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

AMIMOTO AMI を使ってみました。

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

1.AMIMOTO AMI の EC2 インスタンスを作成する

  1. 以下のサイトの手順に沿って、AMIMOTO AMI の EC2 インスタンスを作成

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

2.MySQL on RDS を作成する

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

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

3.DB をローカルから RDS へ移行する

  1. WordPress を停止

    nginx -s stop
    service httpd stop
    service nginx stop
    


  2. ローカル DB からダンプファイルをエクスポート

    mysqldump -h localhost -P 3306 -u [USERID] -p[PASSWORD] --databases [DBNAME] > mysqldump.sql
    


  3. RDS にデータベースを作成

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


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

    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;
    


  5. 出力したダンプファイルから、データを RDS へインポート

    mysql -h [RDS EndPoint] -P 3306 -u [USERID] -p[PASSWORD] [DBNAME] < mysqldump.sql
    


  6. WP の接続先を RDS へ変更

    • ベースディレクトリへ移動し、
    cd /var/www/vhosts/i-*
    
    • ローカル接続用の設定ファイルを mv
    mv local-config.php local-config.php.remove
    
    • 接続用の設定ファイルを変更
    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);
    


  7. WordPress を開始

    nginx
    service httpd start
    service nginx start
    


  8. ※参考

3.chef 関連の設定変更

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

  1. デフォルト言語の変更

    • /opt/local/chef-repo/cookbooks/amimoto/attributes/default.rb
    diff default.rb.ORG default.rb
    1c1
    < default[:sysconfig][:lang] = 'en_US.UTF-8'
    ---
    > default[:sysconfig][:lang] = 'ja_JP.UTF-8'
    


  2. ローカルの MySQL の設定を削除

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


  3. 複製によるインスタンス ID 変更時の対応の設定

    • /opt/local/chef-repo/cookbooks/amimoto/recipes/httpd.rb
      …ベースディレクトリ名の対応
    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
      …conf ファイル内の設定の対応
    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
    > 
    


  4. PHP Warning: session_start(): の対応

    • /opt/local/chef-repo/cookbooks/amimoto/recipes/mod_php7.rb
    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 |
    
  5. server reached MaxClients setting, consider raising the MaxClients setting の対応

    • /opt/local/chef-repo/cookbooks/amimoto/templates/default/httpd/conf/httpd.conf.erb
    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 %>
    
  6. nginx のログファイル名

    • 以下のファイルにおいて、 <%= @server_name %>-<%= @server_name %>. の部分を削除
    $ 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;
    


99.ハマりポイント

  • RDS への接続先の切替で大分手間取りました…。ローカル接続用の設定ファイル (local-config.php) があるとは露も知らずに、オロオロしてました…。非常に悔しい思いです。

  • あとは、やっぱり chef 絡みです。AMI から複製してもちゃんと動かないし、色々と調べながらで苦労しました。というか、この対応で本当にいいのか、正直疑問です。何か問題があれば、言ってください。

XX.まとめ

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

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

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

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

ご参考になれば。