【AWS勉強】EC2+RDSを使った基本構成を構築してWordPressを立ち上げてみる。その2
前回のエントリでAWS上で必要なものの構築はほぼ終えたはずなので、引き続きWordpressの構築や疎通の確認をしたいと思います。
前回のエントリはこちら
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サービス」の中の「インスタンス」を開きましょう。
マネジメントコンソールからIPアドレスは確認できませんでした。恐らくマルチAZで冗長化するために、アプリケーション側からIPアドレス直でアクセスしてしまうとフェイルオーバーが自動で出来ないためでしょう。
オンプレならkeepalivedでVIPふっておくとかって感じだと思うんですが、AWSはDNSで切り替えする感じですかね。たぶん....。
一応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の設定用のファイルもきっとあるだろうと思ってググってみると、案の定ありました。
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 Linuxのpythonのバージョンによっては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でアクセスしたところ、無事に表示できました。こんな感じです。
後はブラウザでポチポチするだけといきたい所ですが、このままだと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です。