Help us understand the problem. What is going on with this article?

初心者でも試せる!AWS上でwordpress構築方法

概要

AWSを使うと様々なメリットがありますよね。
根本的なインフラの管理やAPIを使って簡単にインスタンスを作成したりなど・・・。

サーバーサイドエンジニアとして最近AWSを使い始めたのですが、ECS + ECR を用いたDocker環境等...を触ることが多くあります。

思い返してみると素のEC2等をあまり触ったことが無いので、初心に振り返ってみようと思ったのがこの記事を書くきっかけです。
純粋な EC2 + ELB + RDS + Route53 という構成でwordpressを用いて、ブログサイトの環境構築をしてみました。

※ 基本的に無料枠で作っているけど、使用状況に応じてインスタンスタイプの変更をしたほうがよい。
※ この記事ではRDSは一台構成でつくっていますが、必要に応じてクラスタ構成を組んで読み取り専用エンドポイントを
ReadOnlyとして使用するように設定すると尚よし。

完成予定図

Untitled Diagram.png
①ユーザーがインターネットを通じてアクセスする経路
②EC2にアクセスを振り分けるELB(ロードバランサー)
③アクセスを処理するEC2インスタンス(Apache, PHP + Wordpressが動作)
④RDSインスタンス(MySQL5.7)
⑤Route53(DNSサービスの提供)

これらを順番に作っていく

VPC(Amazon Virtual Private Cloud)の設定

VPCの作成

①ユーザーがインターネットを通じてアクセスする経路①→②という形でインターネットを介してELBにアクセスする経路となる。

この際、②のELBを作成する必要があるが、先にVPCを作成する必要がある。
(VPCはELBやEC2、RDSなどを置く場所のようなものと捉えると理解が進むと思う)

①サービスからVPCを選択して、【VPCの作成】を押下
②test-ip1と記入する
③IPv4 CIDR ブロックに有効なIpv4 CDIRを入力(例: 10.0.0.0/16 で一旦設定)
④作成ボタンを押下
⑤IPv6 CIDR ブロック・テナンシーは必要がなければデフォルトのまま
IPv4 アドレスの範囲を Classless Inter-Domain Routing
(CIDR) ブロックの形式で指定する必要があります (例: 10.0.0.0/16)。

VPC_の作成___VPC_Management_Console.png

サブネットの作成

①サービスからVPCを選択して、メニューからサブネットを選択後、【サブネットの作成】を押下
②名前タグにtest-public-subnet-1aと入力
③VPCに先程作成したVPCを選択
④アベイラビリティーゾーンはap-notrtheast-1aを選択
⑤IPv4 CIDR ブロックに10.0.10.0/24を入力
⑥もう一度サブネット作成を押下し名前タグにtest-private-subnet-1aと入力。④は同じものを選択
⑦IPv4 CIDRに10.0.20.0/24を入力
⑧もう一度サブネット作成を押下し名前タグにtest-private-subnet-1cと入力
⑨アベイラビリティーゾーンはap-notrtheast-1cを入力

サブネットの作成___VPC_Management_Console.png

参考: https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

ルーティングの設定

①サービスからVPCを選択し、メニューからインターネットゲートウェイを選択しインターネットゲートウェイの作成を押下
②名前タグにtest-internet-gateway1と入力し作成ボタンを押下
③作成されたインターネットゲートウェイのチェックボックスを押下する
④アクションからVPCにアタッチを選択し、先ほど作成したVPCのtest-ip1を選択し、アタッチボタンを押下

インターネットゲートウェイの作成___VPC_Management_Console.png

インターネットゲートウェイ___VPC_Management_Console.png

ルートテーブルの作成

①サービスからVPCを選択し、メニューからルートテーブルを選択
②ルートテーブルの作成を押下し、名前タグにtest-public-route-table1と入力
③VPCは作成したtest-ip1を選択

ルートテーブルの作成___VPC_Management_Console.png

④作成されたtest-public-route-table1のチェックボックスを押下し、サブネットの関連付けタブを押下しサブネット関連付けの編集を押下

ルートテーブル___VPC_Management_Console.png

⑤作成したtest-public-subnet-1a,test-private-subnet-1a,test-public-subnet-1cを選択し、作成ボタンを押下する

サブネットの関連付けの編集___VPC_Management_Console.png

test-public-route-table1のチェックボックスを再度押下し、ルートタブからルートの編集を押下
ルートの追加を押下
⑧送信先に0.0.0.0/0、ターゲットはInternet Gatewayを選びtest-internet-gateway1にする

ルートテーブル___VPC_Management_Console.png

EC2インスタンスのセットアップ

②→③の流れでユーザーはWordpressにアクセスする。
②のロードバランサーは、EC2インスタンスが無いと設定できないので、③のEC2インスタンスを先にセットアップする。

①サービスからEC2を選択し、 インスタンス作成ボタンを押下
②AMI(Amazon Machine Image)は クイックスタートから無料枠のAmazonLinuxを選択
③インスタンスタイプは無料枠のt2.microを選択(動作確認くらいなのでこれで一旦進む※)
インスタンスの詳細の設定 を押下し、下記のテーブルの項目は変更する

項目 内容
ネットワーク VPCで作成したものを選択
サブネット VPCで作成したものを選択
ストレージサイズ 8Gb ボリュームタイプ: 汎用SSD
Key: Name テストインスタンス01(作成するEC2インスタンスの名前)
自動パブリック割り当てパブリック 有効

ストレージの追加 を押下
タグの追加 を押下し、 タグの追加 を押下し、下記のように入力

項目 内容
キー Name
テストインスタンス01

セキュリティグループの設定 を押下
⑧ 下記のように作成する。ルールの追加を押下して、ルールも追加する

項目 内容
セキュリティグループ名 wordpress-access
説明 wordpress-allow-access

⑨ ルールの追加 を押下し、下記のようなルールを作成する

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 0.0.0.0/0
HTTP TCP 80 0.0.0.0/0

※IPアドレスは適切な範囲から絞り込んでください。今回は検証のためにセキュリティはあえて強固にしていません。

確認と作成 を押下
起動 を押下
新しいキーペアの作成 を押下し、 キーペア名に wordpress と入力
キーペアのダウンロード を押下 ※この時ダウンロードしたファイルは後で使います
インスタンスの作成 を押下

ここまでで EC2インスタンスの起動が完了。
冗長構成にするためこちらをからもう一台インスタンスを設定する

apacheのインストール

① EC2にログイン

console.bash
ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
➜  ~ ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
Last login: Mon Nov 11 11:47:42 2019 from zz20194022436f572964.userreverse.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
12 package(s) needed for security, out of 27 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-10-10 ~]$

②EC2インスタンスのライブラリをアップデートしおく

sudo yum update -y

③apacheをインストール

sudo yum install -y httpd

④apacheを起動

sudo systemctl start httpd.service

ファイアーウォールの設定

①コンソール画面からEC2を選択し、インスタンスからtest-instance01を選択
②セキュリティグループに記載されているインスタンス名をクリックしインバウンドタブを押下
編集ボタンを押下し、ルールの追加からHTTPを選択ポート番号は80のまま
ソースを任意の場所に変更し保存を押下

EC2インスタンスにsshして wordpress, apache の起動

sshで接続する

AWSコンソール上で、作成したEC2インスタンスを選択すると画面下部の詳細で下記のように表示される

スクリーンショット 2019-11-11 1.02.25.png

この赤枠のIPアドレスに対して ssh接続を行う。
下記以降、EC2インスタンスに接続するIPアドレスは 52.194.253.117 としてアクセスするが、適宜自分自身のIPアドレスに置き換えてください。

① sshで接続する ※1

console.bash
ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117

※1: ~/Downloads/wordpress.pem の部分は、こちらの⑬で作成したファイルを指定する

②下記のような画面となれば、 ssh接続は完了

➜  ~ ssh -i ~/Downloads/wordpress.pem ec2-user@52.194.253.117
Last login: Mon Nov 11 11:47:42 2019 from zz20194022436f572964.userreverse.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
12 package(s) needed for security, out of 27 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-10-10 ~]$

③ rootユーザーに切り替えておく

sudo su -

PHPのインストール

①PHPのインストールコマンドをたたく

console.bash
sudo amazon-linux-extras install -y php7.2
console.bash
sudo yum install -y  php php-mbstring

wordpressのインストール

① wgetコマンドでファイルを取得する

console.bash
wget https://ja.wordpress.org/latest-ja.tar.gz

② 次のように表示され、ダウンロードが完了する

[ec2-user@ip-10-0-10-10 ~]$ wget https://ja.wordpress.org/latest-ja.tar.gz
--2019-11-11 11:57:07--  https://ja.wordpress.org/latest-ja.tar.gz
ja.wordpress.org (ja.wordpress.org) をDNSに問いあわせています... 198.143.164.252
ja.wordpress.org (ja.wordpress.org)|198.143.164.252|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 11838159 (11M) [application/octet-stream]
`latest-ja.tar.gz.1' に保存中

100%[==================================================================================================================>] 11,838,159  5.51MB/s 時間 2.0s

2019-11-11 11:57:10 (5.51 MB/s) - `latest-ja.tar.gz' へ保存完了 [11838159/11838159]

④ tarコマンドで解凍

tar xzvf latest-ja.tar.gz

/var/www/html にファイルコピー

cp -r wordpress/* /var/www/html/

⑥ chown コマンドでファイルの所有権を変更

chown -R apache:apache /var/www/html/

⑦ apache を起動させる

systemctl restart httpd.service

restartだと、止まってても起動してても、再度起動がかかる

⑧ ここまでで、WEBページにアクセスすると wordpressの設定画面が見れるようになる

著者の場合: http://52.194.253.117/wp-admin/setup-config.php

wordpressで使用する RDSの設定

③→④の部分。
EC2インスタンスがRDSにSQLを送信してその結果を画面に返すような構成にしたい。
そのためにRDSの設定と、EC2インスタンスにRDSの接続先情報を設定する
①サービスからRDSを選択し、データベースの作成を押下
②データベース作成方法を選択で標準作成を選択
③ エンジンのオプションMySql、Mysqlバージョンは安定バージョン(筆者は5.7系を選択)
④テンプレートでは今回は無料利用枠を指定する
⑤DB インスタンス識別子にtest-database-01と記載
⑥認証情報の設定でDBにログインする際のユーザー名、パスワードを設定する
接続こちらで作成したVPCを選択
⑧追加の接続設定で
⑨その他はデフォルトのままでデータベース作成を押下

wordpressを冗長構成にする

③の部分を見ると、EC2インスタンスが1台しか存在していない。
つまり、EC2インスタンスが1台障害等で使えなくなってしまった場合、このブログサイトはダウンしてしまう。
それを防ぐために複数のEC2インスタンスでwordpressを稼働させ、②のロードバランサーを使ってホットスタンバイかつ、ラウンドロビンを用いて冗長構成にする

ホットスタンバイ
https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%90%E3%82%A4

冗長構成
http://e-words.jp/w/%E5%86%97%E9%95%B7%E6%A7%8B%E6%88%90.html

wordpressにログイン

①EC2で作成したインスタンスの説明情報からIPv4 パブリック IPを確認し、新規タブでアクセスする
②Wordpressの画面が表示されるのでさあ始めましょうボタンを押下
③下記画面が表示されるので情報を記載する

wordpress-login.png

④データベースのホスト名には下記のRDS作成したDBのエンドポイントを記載する

エンドポイント.png

DNSの設定を行う

現在wordpressにアクセスしようとすると、IPアドレスでのアクセスとなる。
著者の場合: http://52.194.253.117

IPアドレスでアクセスするサイトは基本的に稀で、一般的にはドメインが使われます。
そのため、ドメインを用いてアクセスできるようにします。

①サービスからRoute53をクリックし、メニューから登録済みのドメインを選択
ドメインの登録を押下
③取得したいドメインを入力し、トップレベルドメインを選び、チェックボタンをクリックし、使用できるドメインをカートに入れるを押下し、最下部の続行を押下。
④個人情報を入力し、続行を押下
ドメインを自動的に更新しますか?は、お試しであれば無効化がおすすめ。
⑥規約に同意し、注文を完了を押下。

※ ⑥を完了すると認証メールが登録したメールアドレスに届くのでメールを確認してリンクをクリックし認証しておく

ドメイン
https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D

DNS
https://ja.wikipedia.org/wiki/Domain_Name_System

ELBの設定

ELB作成ステップ1

①サービスからEC2を選択し、メニューからロードバランサーをクリック
ロードバランサーの作成をクリックし、Application Load Balancer作成を押下
③名前にtest-lb-01を入力する
リスナーの追加をクリックし、以下をHTTPの設定を削除し追加する

ロードバランサーのプロトコル ロードバランサーのポート
HTTPS 443

⑤ 作成したVPCを選択しアベイラビリティゾーン最低2つ選択(作成したサブネットをそれぞれ選択)し、次の手順へすすむ
ACM から新しい証明書をリクエストというリンクが出ているのでそのリンクをクリック

ACMでELB設定用の証明書作成

①ドメイン名にこちらで購入したドメインを入力し、次へを押下
DNS の検証を選択し確認を押下
確定とリクエストを押下
Route53でのレコード作成を押下する(Route53にCNAMEが登録される)

domain_route53.png

Route_53_Management_Console.png

ELB作成ステップ2

①下記にある更新部分のボタンを押下し、作成したドメインの証明書が表示されたことを確認し、次の手順へ進む

elb_acm.png

②セキュリティグループの設定で新しいセキュリティグループの作成するを選択
③セキュリティグループ名と説明を入力し次の手順へすすむ(他はデフォルトでOK)
④ルーティングの設定で名前にtest-target-group01と入力し、次へ
⑤下記の図を参照(EC2インスタンスを2台作成しているので2つのインスタンスを登録済みにする)

target.png

確認を押下し、作成を押下

Route53でAレコードの設定

レコードセットの作成を押下し、タイプをA-IPv4アドレス、エイリアスをはいにする
②エイリアス先のターゲット名の入力欄をクリックし、ELB Application Load Balancerで作成したろーELBを選択する
③レコードセットの保存を押下

Route_53_Management_Console.png

確認

①ロードバランサーの一覧画面に遷移して、DNS名をコピー

lb.png

②新しいタブを開き、DNS名をペーストしWordpressの画面がでてきたらOK
③購入したドメインでも接続を試してみてWordpressの画面が表示されればOK

WordPressにCSSがあたらない

ELBを介すると、WordpressのCSSが上手く当たらないため対策を入れなければいけない

test-title_–_Just_another_WordPress_site.png

①以下のコードをfunctions.phpに追記する

/var/www/html/wp-includes/functions.php
class relative_URI {
    function relative_URI() {
        add_action('get_header', array(&$this, 'get_header'), 1);
        add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
    }
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace($home_url, '/', $content);
    }
    function get_header(){
        ob_start(array(&$this, 'replace_relative_URI'));
    }
    function wp_footer(){
        ob_end_flush();
    }
}
new relative_URI();
//↑ここまでをコピペ

require( ABSPATH . WPINC . '/option.php' );

②apacheの再起動

console.bash
systemctl restart httpd.service

③再度ドメインにアクセスし、表示が問題なければOK
参照: https://dogmap.jp/2011/03/18/wordpress-relative-url/
test-title_–_Just_another_WordPress_site.png

完成

ここまでで、ELBによってロードバランシングされ、冗長構成な wordpressの作成が完了です。
データベースはRDSが使用され、ドメインもRoute53で管理されている、全てAWSを使ってwordpressのインフラを構築してみました。

完成図

Untitled Diagram.png

感想

AWSの管理画面をポチポチするだけでサーバやロードバランサー、DBなどの設定を簡単にできる。
ただ、ネットワークの知識とか基礎的なものがないと操作わかっていてもあいまいなところがあるので勉強は必要だなと感じた。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away