はじめに
こんにちは、KUDs です。
本記事では、基本に立ち返って WordPress を EC2 1 台で構築してみようと思います。
以下は本記事のポイントです。
- 超シンプルアーキテクチャ
- AWS EC2 1 台のみ
- 構築費用をゼロ
- 無料利用枠をふんだんに使用
- 手順確認
- 初心者向けにわかりやすく必要なコマンドを確認
- ネクストアクション確認
- 構築後に検討すべきことを確認
では始めましょう。
料金について
本記事の WordPress 構築では無料利用枠を使用します。
そのため、無料利用枠を使用しきっている人は課金される可能性があるため注意が必要です。
本記事では、初心者向けに執筆しているため、多くの人は無料利用枠を使い切っている方はいないと思いますが、以下に簡単に説明しますので、ご自身が該当しているかは一応チェックしてみてください。
「そんなことはわかってるよ!」という方は読み飛ばしてください。
AWS 無料利用枠とは
まず、AWS 無料利用枠は、AWS が提供するサービスの一部を無料で使用できる特典です。
無料利用枠には以下のようなカテゴリがあります。
- 常に無料の利用枠
- AWS が提供するいくつかのサービスは、一定の範囲内ならずっと無料で利用できます。
例えば、DynamoDB では毎月 25 GB までのストレージが常に無料で利用可能です。
- AWS が提供するいくつかのサービスは、一定の範囲内ならずっと無料で利用できます。
- 12 か月間無料の利用枠
- 新規 AWS アカウントを開設してから 12 か月間、AWS の主要サービスを無料で利用できます。
例えば、EC2 や S3 など、様々なサービスがこの範疇に含まれます。
- 新規 AWS アカウントを開設してから 12 か月間、AWS の主要サービスを無料で利用できます。
- 試用期間の利用枠
- 一部の AWS サービスは、新規にサービスを開始した日から一定期間無料で利用できます。
インスタンスタイプ t2.micro の料金について
今回 WordPress 構築に使用するインスタンスタイプ t2.micro は 12 か月間の無料利用枠に含まれます。
[参考]AWS クラウド無料利用枠
750 時間/月 の使用は無料となりますので、EC2 1 台であれば 24 時間稼働できますね。
EC2 パブリック IP アドレスの料金について
EC2 に付与するパブリック IPv4 アドレスは、2024 年 2 月から有料になりました。
[参考]新着情報 – パブリック IPv4 アドレスの利用に対する新しい料金体系を発表
しかし、1年間の無料利用枠が適用されたため、こちらも 1 年間は無料です。
[参考]パブリック IPv4 の料金の開始に伴い、AWS 無料利用枠に 750 時間の無料パブリック IPv4 アドレスが含まれるようになりました
パブリック IP アドレスも 750 時間/月 の使用は無料となりますので 24 時間稼働できます。
実際に WordPress を EC2 1 台で構築してみた
構成は以下です。
- インスタンスタイプ: t2.micro (無料利用枠の対象)
- OS: Amazon Linux 2 (無料)
- Web サーバ: httpd
- データベース: mariadb
所要時間としては、10 分 ~ 30 分ぐらいで構築できるかなという感覚です。
どこかで問題にぶち当たると 60 分くらいかかっちゃうかもです。
EC2 インスタンス作成
まず、AWS マネジメントコンソールから「インスタンスを起動」しましょう。
今回はスピード重視で AWS CLI で構築します。
aws ec2 run-instances \
--count 1 \
--key-name <your-ssh-key> \
--security-group-ids sg-xxxxxxxxxxxx \
--subnet-id subnet-xxxxxxxxxxxx \
--instance-type t2.micro \
--image-id ami-0a211f4f633a3af5f \
--tag-specifications 'ResourceType=instance,Tags={Key=Name,Value=wordpress-ec2}'
Web サーバなので、インターネットから接続可能である必要があります。
そのため、以下の点は確認しておきましょう。
- セキュリティグループ: インバウンドルールで 80 番ポートを全 IP アドレスに対して解放しているか
- サブネット: パブリックサブネットか (デフォルトルートにインターネットゲートウェイが存在するか)
EC2 インスタンスの設定
では、EC2 の設定を行っていきましょう。
EC2 インスタンスに接続
ssh -i <your-ssh-key> ec2-user@<your-ec2-ip-address>
次に、EC2 インスタンス設定を行います。
Terminal やコマンドプロンプト等から SSH 接続しましょう。
※ <your-ssh-key>, <your-ec2-ip-address> はそれぞれご自身の者に置き換えてください。
AWS マネジメントコンソールから対象のインスタンスに「接続」していただいても大丈夫です。
SSH 接続できないという方は、セキュリティグループ、ネットワーク ACL、ルートテーブルをチェックしてください。
特に、セキュリティグループのインバウンドルールで 22 番ポートが許可されているかは確認しましょう。
デフォルトパッケージをアップデート
$ sudo su -
# yum update -y
とりあえず root ユーザにスイッチしつつ、カーネル周りを最新にしておきましょう。
PHP 6.4.3 以上のバージョンを有効化
# amazon-linux-extras list | grep -i php
66 †php8.1 available [ =stable ]
68 †php8.2 available [ =stable ]
# amazon-linux-extras enable php8.2
amazon-linux-extras コマンドを使用して、PHP の新しいバージョンを有効化する必要があります。
※ デフォルトでは 5 系がインストールされますが、WordPress では 6.4.3 以上が必要となるため
必要なパッケージをインストール
# yum clean metadata
# yum install php-cli php-pdo php-fpm php-json php-mysqlnd httpd mariadb mariadb-server -y
必要なパッケージを一括でインストールします。
最新版 WordPress のダウンロード
# wget http://ja.wordpress.org/latest-ja.tar.gz -P /tmp/
# tar zxvf /tmp/latest-ja.tar.gz -C /tmp
# cp -r /tmp/wordpress/* /var/www/html/
# chown apache:apache -R /var/www/html
wordpress の最新版をダウンロードし、権限設定等行います。
httpd, mariadbを起動
# systemctl enable httpd mariadb
# systemctl start httpd mariadb
Web サーバとしての httpd, DB としての mariadb を起動し、同時に自動起動設定しておきます。
サービス稼働状況を確認
EC2 以外の PC から Curl コマンドを実行してみましょう。
※お手持ちの PC でインターネット経由で確認することを推奨
ここまでの作業に問題がなければ、以下のようなレスポンスが返されるはずです。
$ curl -I <your-ec2-ip-address>
HTTP/1.1 302 Found
Date: Sun, 17 Mar 2024 11:50:31 GMT
Server: Apache/2.4.58 ()
X-Powered-By: PHP/8.2.9
Upgrade: h2,h2c
Connection: Upgrade
Location: http://<your-ec2-ip-address>/wp-admin/setup-config.php
Content-Type: text/html; charset=UTF-8
/wp-admin/setup-config.php にリダイレクト (302 Found) されていることが確認できれば OK です。
では、再び EC2 に戻って DB 構築しましょう
データベースの設定
次に、EC2 上でデータベースの設定を行っていきましょう。
事前のセットアップ(root ユーザーのパスワード設定)
# mysql_secure_installation
EC2 インスタンスにて上記のコマンドを実行します。
すると、複数のメッセージが表示されるので、以下のように回答していきます。
Enter current password for root (enter for none):
初期構築時は root のパスワードはありません。
何も入力せずに Enter を押しましょう。
Set root password? [Y/n] Y
New password:
Re-enter new password:
root パスワードを設定したいので、「Y」を入力して Enter します。
その後、パスワードを2回入力しましょう。※ 画面には表示されないので打ち間違いには注意
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
後続の質問は全て yes (Y) で大丈夫です。
ここでは詳細の説明は省きますが、気になる人はナレッジベースを読みましょう。
[参考]mysql_secure_installation – MariaDB Knowledge Base
MariaDB に接続
# mysql --user=root --password='<your-mariadb-root-password>'
次に、MariaDB に接続します。EC2 インスタンスにて上記コマンドを実行しましょう。
※ <your-mariadb-root-password> は、先ほど入力した root のパスワードに置き換えてください
データベースの作成
MariaDB [(none)]> CREATE USER '<your-wordpress-user>' IDENTIFIED BY '<your-wordpress-password>';
MariaDB [(none)]> CREATE DATABASE `<your-wordpress-database>`;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `<your-wordpress-database>`.* TO '<your-wordpress-user>';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> Exit
無事 MariaDB に接続出来たら、上記のコマンドを実行しましょう。
※ <your-wordpress-user>, <your-wordpress-password> はそれぞれお好きな値に書き換えてください
※ 後ほど WordPress 設定画面で使用するので覚えておきましょう
WordPress の設定
今後は EC2 ではなくブラウザ上で設定していきます。
では、お手持ちの PC で Chrome なりブラウザを起動してください。
WordPress をブラウザで表示
ブラウザで EC2 のパブリック IP アドレスを入力しましょう。もしくはパブリック IPv4 DNS でも大丈夫です。
すると、以下の画面が表示されます。
「さあ、始めましょう!」をクリックします。
ブラウザで wp-config.php ファイルを作成
すると、以下の画面が表示されます。
ひとつ前の画面にも記載がありましたが、ここでは wp-config.php という設定ファイルを作成します。
ファイル作成に必要な情報として、データベースの情報を入力しましょう。
- データベース名: 先ほど設定した <your-wordpress-database>
- ユーザー名: 先ほど設定した <your-wordpress-user>
- パスワード名: 先ほど設定した <your-wordpress-password>
入力出来たら、「送信」をクリックします。
「この部分のインストールは無事完了しました。」と表示されれば OK です。
補足 (wp-config.php の手動作成)
ちなみに、この時点で EC2 内部では wp-config.php という設定ファイルが作成されています。
もし、前述のブラウザからの設定ができないという方は、手動で設定ファイルを作成する必要があります。
以下、参考までにサンプルファイルとの差分を記載しておきます。
wp-config-sample.php をコピーして、適切な値変更と権限設定を行ってください。大体の方はブラウザで設定すると思うので詳細は省きます。
# ll /var/www/html/wp-config*
-rw-rw-rw- 1 apache apache 3318 Mar 17 12:14 /var/www/html/wp-config.php
-rw-r--r-- 1 apache apache 3013 Mar 17 11:57 /var/www/html/wp-config-sample.php
# diff /var/www/html/wp-config-sample.php /var/www/html/wp-config.php -u
--- /var/www/html/wp-config-sample.php 2024-03-17 11:57:45.998838317 +0000
+++ /var/www/html/wp-config.php 2024-03-17 12:14:26.204278989 +0000
@@ -20,19 +20,19 @@
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', '<your-wordpress-database>' );
/** Database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', '<your-wordpress-user>' );
/** Database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '<your-wordpress-password>' );
WordPress のインストール
さて、話を戻しまして「インストール実行」をクリックします。
ここでは以下のように入力します
- サイトのタイトル: お好きなサイト名 (例: KUDs WordPress)
- ユーザー名: お好きなユーザー名 (例: KUDs)
- パスワード: お好きなパスワード
- メールアドレス: お好きなメールアドレス
- 検索エンジンでの表示: 「検索エンジンがサイトをインデックスしないようにする」にチェックしない
- チェックすると検索にヒットしなくなります
入力したら、「WordPress をインストール」をクリックします。
「成功しました!」と表示されれば成功です。
WordPress にログイン
「ログイン」をクリックすると、以下のログイン画面が表示されます。
ここでは、先ほど設定したユーザー名 (例: KUDs) とそのパスワードを入力しログインできます。
無事ログインできれば、以下のようなダッシュボードが表示されます。
お疲れ様でした!
後はお好きにテーマを設定したり、実際に投稿してみてください!
さいごに
今回は単一の EC2 インスタンスで WordPress を構築しました。
とはいえまだ構築しただけで、これから考えるべき課題は山積みだと思います。
ネクストアクションとなるであろう項目をまとめてみましょう。
今後検討すべきこと
HTTPS 化
現状は HTTP 接続です。
セキュリティの観点では HTTPS 接続にすべきでしょう。
実現方法として、おすすめは ELB + ACM ※ です。
※ ELB: Elastic Load Balancing
※ ACM: AWS Certificate Manager
管理が非常に楽で、かつ耐障害性も高められます。
手順については以下の repost が参考になるかと思います。
独自ドメイン
現状はパブリック IP アドレスもしくはパブリック DNS での接続です。
独自のドメインを所持した方が SEO やブランディングの観点で有効でしょう。
おすすめのレジストラは Cloudflare です。( KUDs も Cloudflare を利用してます)
理由は安いからです!
どれぐらい安いかは、更新料については TLD ※に依ります。
※ TLD: Top Level Domain
他にも Cloudflare は DNS クエリ料金が無かったりと、色々メリットが多いです。
ただ、Cloudflare のドキュメントやサポートは基本英語です。
そのため、本記事が初心者向けということを鑑みると、Amazon Route 53 を使うのが楽かと。
もしくは「我、エンジニアに非ず。日本語サポート求ム。」という方は、かの有名な お名前.com とかもアリかもしれません。
メモリ不足
t2.micro はメモリ (RAM) が 1 GB しかありません。
今後アクセス数が増えると(増えなくても)障害が発生するかもしれません。
メモリ不足でシステムがダウンするときの対処法としては以下の記事にて対応策を解説しています。
必要に応じてご参照ください。
余談ですが、以下のサイトでは、メモリ 8 GB から人権が得られるようです。1 GB は定義すらされてません。
あなたのPCに人権はありますか?メモリー別パソコン診断「4GB→著しい人権侵害」
RAM
https://togetter.com/li/1792692
2GB→てめえのPCラズパイ以下か?
4GB→人道上の深刻な危機。著しい人権侵害。
8GB→基本的人権が得られる最低限、健康で文化的かって言われるとすこし怪しい
16GB→健康で文化的な最低限度以上のPC
アクセス数が伸びてくると、適宜インスタンスタイプを拡張した方が良いでしょう。
その辺りが簡単に実施できるのはクラウドのいい所ですね。
データベースのプライベート化
そもそも EC2 に全乗せしていますが、構成としては割と危険です。
通常 DB はプライベートサブネット等 Internet Facing ではない環境に配置します。
RDS のようなマネージドサービスをマルチ AZ でプライベートサブネットに配置すると、可用性を高めつつセキュリティも向上できるでしょう。
以下、公式のチュートリアルとハンズオンが参照になるかと思います。
[参考]Deploy WordPress with Amazon RDS
[参考]スケーラブル Web サイト構築ハンズオン
永続オブジェクトキャッシュ
パフォーマンスやコスト最適化の観点から、WordPress ではオブジェクトキャッシュを導入することが推奨されます。
AWS ではフルマネージドサービスとして ElastiCache が利用できます。
実装手順については以下の記事を参照してみてください。
メディアファイルのオフロード
また、メディアファイルは本記事の設定では EBS ※ ルートボリュームへ格納されます。
可用性や料金の観点からも S3 や EFS ※ 等に配置した方が良いでしょう。
また、メディアファイルは本記事の設定では EBS ※ ルートボリュームへ格納されます。
※ EBS: Amazon Elastic Block Store
可用性や料金の観点からも S3 や EFS ※ 等に配置した方が良いでしょう。
※ S3: Amazon Simple Storage Service
※ EFS: Amazon Elastic File System
こちらについても以前書いた以下の記事が参考になるかもです。
EC2 の運用・保守
EC2 は IaaS です。
ハードウェアの管理は AWS がやってくれますが、OS レイヤ以上のミドルウェア等はユーザが管理する必要があります。
サーバを運用・保守する上で、最低限以下は押さえておきたいところです。
- 障害発生前に検知できるか (CWMetrics: Cloud Watch Metrics 等)
- 障害発生時に自動復旧できるか (ASG: Auto Scaling Group 等)
- 障害発生後に原因調査できるか (CWLogs: Cloud Watch Logs 等)
モニタリングやロギングについては、以前執筆した以下記事も参考になるかと思います。
「我エンジニアに非ず、外部に頼ム」という方は、運用保守代行サービスにでも頼みましょう。
KUDs も時期によってはやってたりやってなかったりするので X (旧 Twitter) やメールからお声がけください。
まとめ
考えることは山積みですね。
「それがいい。学習していきたい」という方にとってはいいでしょう。
一方、「可能な限り管理コスト・学習コストを削減したい」という方にとっては微妙です。
そういう方は、Lightsail を検討しましょう。
EC2 と比較した Lightsail の特徴は以下です。
- 構築がさらに簡単 & さらに爆速
- HTTPS 化、ドメイン設定が容易
- DB や ミドルウェアの管理コストが大幅減少
- スペックの拡張がさらに簡単
詳細については以下の記事をご参照ください。
以上です。
コメント