Re:boot!

35歳からのエンジニアWay

【AWS勉強】EC2+RDSを使った基本構成を構築してWordPressを立ち上げてみる。その2

前回のエントリでAWS上で必要なものの構築はほぼ終えたはずなので、引き続きWordpressの構築や疎通の確認をしたいと思います。

前回のエントリはこちら

reboot.hateblo.jp

RDSへmysql clientでアクセスできるか確認

まずはRDS上のMySQLへAPサーバからmysql clientでアクセスできるか試してみます。

まずはグローバルIPを持っているAPサーバへSSHでログインします。

$ ssh -i .ssh/aws-wordpress.pem ec2-user@xxx.xxx.xxx.xxx

mysql clientが入っていないのでインストールします。

$ sudo yum -y install mysql

RDSのエンドポイント(mysql clientからの接続先)はマネジメントコンソールで確認することができます。「RDSサービス」の中の「インスタンス」を開きましょう。

f:id:yusan09:20170105222231j:plain

マネジメントコンソールからIPアドレスは確認できませんでした。恐らくマルチAZで冗長化するために、アプリケーション側からIPアドレス直でアクセスしてしまうとフェイルオーバーが自動で出来ないためでしょう。

オンプレならkeepalivedでVIPふっておくとかって感じだと思うんですが、AWSDNSで切り替えする感じですかね。たぶん....。

一応APサーバからdigとか使えばIPアドレスをチェックはできます。

$ dig db-wordpress.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
#=> db-wordpress.cb5biuximzqp.ap-northeast-1.rds.amazonaws.com. 4 IN A 10.0.3.47

あれ?10.0.3.0/24内のアドレスが返ってきました...。想定としてはAPサーバと同じAZの10.0.2.0/24のアドレスが返ってくるかなと思ってたのですが。

この辺の優先度は変えられたりするんでしょうか。まあ、また改めて調べるとしてとりあえずmysql clientでアクセスしてみます。

$ mysql -p -u wordpress -h db-wordpress.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+

ユーザ名やデータベース名は、前回のエントリのRDSインスタンスの作成のタイミングで指定しています。

とりあえずこれでAPサーバ->RDSの疎通は確認できました。

APサーバでWordpressが動くようにする

次はHTTPでのアクセス確認も兼ねてWordpressをセットアップします。

といってもWordpressを動かすまでの手順を説明しても仕方ないので、Ansibleでサクッと設定しちゃいたいと思います。

Ansibleを使うのは他の目論見もあるのですが、とりあえず今はおいておきます。

私の手元の環境はMacなので、brew installしてサクッとインストール

$ brew install ansible

はい。簡単ですね。

Wordpressの設定用のファイルもきっとあるだろうと思ってググってみると、案の定ありました。

github.com

ansible公式のexampleですね。

手元に持ってきます。

$ git clone https://github.com/ansible/ansible-examples.git
$ cd ansible-examples/wordpress-nginx
$ ls -1
LICENSE.md
README.md
group_vars
hosts.example
roles
site.yml

セットアップする対象ホストを指定するためにhostsという名前でファイルを作ります。

# hostsファイルの中身
[all]
xxx.xxx.xxx.xxx ansible_ssh_user=ec2-user ansible_ssh_private_key_file=/Users/mind/.ssh/aws-wordpress.pem

xxx.xxx.xxx.xxxの部分はAPサーバのグローバルIP(Elastic IP)です。作ったファイルを使ってセットアップを行なってみます。

$ ansible-playbook -i hosts --sudo site.yml

#=>
failed: [52.198.208.8] => {"failed": true}
msg: the python mysqldb module is required

FATAL: all hosts have already failed -- aborting

エラーが出てしまいました。少し手間取りましたがセットアップされる側にyumで「MySQL-python27」をインストールすれば良いようです。(Amazon LinuxpythonのバージョンによってはMySQL-python26でないとダメな場合もあるようです。)

ansbileにインストールする設定を追加します。今回はroles/common/tasks/main.ymlに設定を追加しました。ファイルの最後に以下を追加します。

- name: install mysql python mysqldb module
  yum: name=MySQL-python27 state=latest

改めてansible-playbookを実行します。

$ ansible-playbook -i hosts --sudo site.yml

#=>
~略~
PLAY RECAP ********************************************************************
52.198.208.8               : ok=25   changed=7    unreachable=0    failed=0

無事完了しました。これで取り敢えずWordpressのセットアップは終わったはずです。

curlでチェックしてみます。

$ curl xxx.xxx.xxx.xxx (APサーバのグローバルIP)
#=>
curl: (7) Failed connect to xxx.xxx.xxx.xxx:80; Connection refused

う〜ん。アクセスが出来ませんでした。APサーバに入って原因を調べたところ、どうもnginxのconfigでエラーが出てちゃんと立ち上がってないようです。

$ sudo /etc/init.d/nginx start
nginx を起動中: nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/nginx.conf:41

どうやら80番ボートのデフォルトを握るバーチャルホスト(存在しないドメインにリクエストが来た場合に表示される)の設定が重複しているようですね。nginx.conf内のserverディレクティブの内容をまるまる消せば大丈夫そうだったので、バッサリ削除しました。

もういちどチャレンジ。

$ sudo  /etc/init.d/nginx start

Starting nginx:                                            [  OK  ]

上手く立ち上がりました。今度はいけるだろうとブラウザから直接IPでアクセスしたところ、無事に表示できました。こんな感じです。

f:id:yusan09:20170106001526j:plain

後はブラウザでポチポチするだけといきたい所ですが、このままだとWordpressはローカルのmysqldへアクセスしにいってしまいます。

接続先を変えるためにansibleのwp-config.phpを修正し、接続先をRDSのエンドポイントへと変更します。

変更するファイルは「roles/wordpress/templates/wp-config.php」です。

 /** MySQL hostname */
-define('DB_HOST', 'localhost');
+define('DB_HOST', 'db-wordpress.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com');

また、wp-config.phpではdbのパスワードが「secret」になっているのでgroup_vars/allファイルの中の「wp_db_password」も自分の使うパスワードに変えておきます。

-wp_db_password: secret
+wp_db_password: xxxxxxx

後は変更を反映するためにansible-playbookを再度実行して、ブラウザからポチポチ設定を行えばOKです。