【WordPress】AWS基盤のWebサイトを構築 ~前編
はじめに
本記事ではAWSを使ったWordPressのWebサイトを構築してみます。ただ構築するだけでは面白くないので2つのテーマに沿って構築していきます。
テーマ① 管理者サイトとユーザーサイトはドメインを分ける
なぜ管理者とユーザーでドメインを分けるのかというとセキュリティを担保するためです。私たちが普段何気なく閲覧しているサイトも管理者サイトのドメインというのは内部のシステム管理者のみがアクセスする用に保管されており、一般に公開しているサイトはユーザーサイトのドメインで公開しています。そうすることで部外者による内部アクセスを防ぎ、システムが改ざんされるリスクを低減しています。
テーマ② サイトのSSL化
昨今WebサイトをSSL化することは当たり前な時代ですが、なぜSSL化するのでしょうか。それはSSL化することで通信を暗号化し、なりすまし、改ざん、盗聴を防止するためです。Webサイトによっては個人情報やクレジットカード情報を扱うサイトがありますが、それらの情報を暗号化し守るためにもSSL化は必須といえます。
構成図
環境
- OS:Amazon Linux 2023
- DB:Mysql 8.0
事前準備
本記事ではドメインを使いますので、事前にドメインの取得をお願いします。
構築してみる
NWの作成
AWSマネジメントコンソールより以下のように検索しNWリソースを作成していきます。
VPC > お使いのVPC > VPCを作成
- 作成するリソース :VPCなど
- 名前タグの自動生成 :「自動生成」をチェックして任意の値を入力
- VPCエンドポイント :なし
- 他はデフォルトのままでOK
作成が完了したらVPC > サブネット > 各Publicサブネットを選択 > アクション > サブネットの設定を編集
からパブリックIPv4アドレスの自動割り当てを有効化します。これによってPublicサブネットに起動されたEC2にはPublicIPアドレスが付与されるようになります。
セキュリティグループの作成
AWSマネジメントコンソールより以下のように検索しセキュリティグループを作成していきます。
EC2 > セキュリティグループ > セキュリティグループを作成
セキュリティグループ名 | 対象リソース | インバウンドルール |
---|---|---|
[Name]-alb-sg | ALB用 | タイプ:HTTP, 送信先:[カスタム]0.0.0.0/0 タイプ:HTTPS, 送信先:[カスタム]0.0.0.0/0 |
[Name]-ec2-sg | EC2用 | タイプ:HTTP, 送信先:[カスタム]0.0.0.0/0 タイプ:SSH, 送信先:[マイIP]表示されたIP |
[Name]-db-sg | RDS用 | タイプ:MYSQL/Aurora, 送信先:[カスタム]EC2用セキュリティグループ |
VPCを選択する画面では作成したVPCを選択します。アウトバウンドはデフォルトとします。
EC2の作成
AWSマネジメントコンソールより以下のように検索しEC2を作成していきます。
EC2 > インスタンス > インスタンスを起動
- 名前 :[Name]-ec2
- AMI :Amazon Linux 2023 AMI
- インスタンスタイプ :t2.micro
- キーペア :新しいキーペアの作成
- キーペア名 :[Name]-key
- キーペアのタイプ :ED25519
- プライベートキーファイル形式 :.pem
- VPC :作成したVPC
- サブネット :作成したpublic-subnet-1a
- セキュリティグループ :既存のセキュリティグループを選択する
- 共通のセキュリティグループ :作成したEC2用のセキュリティグループ
- 他はデフォルトのままでOK
作成したキーペアの秘密鍵はローカルPCにダウンロードされるので大切に保管しておいてください。
ターゲットグループの作成
AWSマネジメントコンソールより以下のように検索しターゲットグループを作成していきます。
EC2 > ターゲットグループ > ターゲットグループの作成
- ターゲットグループ名 :[Name]-tg
- VPC :作成したVPC
- 使用可能なインスタンス :作成したEC2を選択して「保留中として以下を含める」を押下
- 他はデフォルトのままでOK
ALBの作成
AWSマネジメントコンソールより以下のように検索しALBを作成していきます。
EC2 > ロードバランサー > ロードバランサーの作成 > ALB
- ロードバランサー名 :[Name]-alb
- VPC :作成したVPC
- アベイラビリティゾーン :作成した各AZのPablicサブネット
- セキュリティグループ :作成したALB用のセキュリティグループ
- デフォルトアクション :作成したターゲットグループ
- 他はデフォルトのままでOK
Route53ホストゾーンの作成
AWSマネジメントコンソールより以下のように検索しRoute53ホストゾーンを作成していきます。
Route53 > ホストゾーン > ホストゾーンの作成
- ドメイン :取得済みのドメイン名
- 他はデフォルトのままでOK
Route53レコードの作成
AWSマネジメントコンソールより以下のように検索しRoute53レコードを作成していきます。
Route53 > ホストゾーン > 作成したドメイン名 > レコードを作成
#管理者サイト用レコードの作成
- レコード名 :admin
- エイリアス :有効化
- トラフィックのルーティング先 :作成したALB
- 他はデフォルトのままでOK
#ユーザーサイト用レコードの作成
- レコード名 :user
- エイリアス :有効化
- トラフィックのルーティング先 :作成したALB
- 他はデフォルトのままでOK
ネームサーバの変更
Route53でドメインの設定が完了したらお名前ドットコムなどドメインを契約したリセラーにてネームサーバをRoute53のネームサーバに変更します。
DBサブネットグループの作成
AWSマネジメントコンソールより以下のように検索しDBサブネットグループを作成していきます。
RDS > サブネットグループ > DBサブネットグループを作成
- 名前 :[Name]-subnetgroup
- 説明 :任意
- VPC :作成したVPC
- アベイラビリティゾーン :ap-northeast-1a, ap-northeast-1c
- サブネット :作成した各AZのPrivateサブネット
RDSの作成
AWSマネジメントコンソールより以下のように検索しRDSを作成していきます。
RDS > データベース > データベースの作成
- エンジンタイプ :MySQL
- エンジンバージョン :MySQL 8.0.39
- テンプレート :開発/テスト
- 可用性と耐久性 :単一のDBインスタンス
- DBクラスター識別子 :[Name]-db
- マスターユーザー名 :任意
- 認証情報管理 :セルフマネージド
- マスターパスワード :任意
- DBインスタンスクラス :db.t3.micro
- VPC :作成したVPC
- DBサブネットグループ :作成したサブネットグループ
- 既存のセキュリティグループ :作成したDB用セキュリティグループ
- 他はデフォルトのままでOK
EC2に接続してミドルウェアの設定
ここからはターミナルからEC2にssh接続して作業していきます。
ルートユーザーになる
ログインしたらルートユーザーとなります。なお、以降の作業はすべてルートユーザーで行います。
sudo su -
ソフトウェアパッケージの更新
ソフトウェアパッケージを最新バージョンに更新します。
dnf update -y
ApacheとPHPをインストール
WordPress構築に必要なパッケージをインストールします。
dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel
MYSQLをインストール
Mysqlをインストールします。
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
dnf -y install mysql mysql-community-client
dnf -y install mysql mysql-devel
WordPressのダウンロード
WordPressのパッケージをダウンロードします。
curl -L -O https://ja.wordpress.org/latest-ja.zip
unzip latest-ja.zip
Apacheの設定
ApacheのドキュメントルートとルートディレクトリをWordPressに変更します。こうすることでWebサーバ(EC2)へのアクセスに対してWordPressの画面が表示されるようになります。
mv -iv wordpress /var/www/html/
chown -R apache:apache /var/www/html/wordpress
cp -ipv /etc/httpd/conf/httpd.conf /etc/httpd/conf/.httpd.conf.org
sed -i '/^DocumentRoot/s/DocumentRoot "\/var\/www\/html"/DocumentRoot "\/var\/www\/html\/wordpress"/' /etc/httpd/conf/httpd.conf
sed -i '/^<Directory/s/Directory "\/var\/www\/html"/Directory "\/var\/www\/html\/wordpress"/' /etc/httpd/conf/httpd.conf
diff -U0 /etc/httpd/conf/.httpd.conf.org /etc/httpd/conf/httpd.conf
DBの設定
RDSへ接続してWordPress用のデータベース、ユーザーを作成します。
mysql -h [RDSのエンドポイント] -u[マスターユーザー名] -p
> create database wp_db;
> create user 'wp_user'@'10.0.%' identified by 'パスワード';
> grant all on wp_db.* to 'wp_user'@'10.0.%';
> exit
Apacheの起動
ここまでの設定が完了したらApacheを再起動します。
systemctl enable httpd
systemctl start httpd
WordPressの初期設定
ここまでの設定が問題なく出来ていればブラウザからWordPressの初期設定画面にアクセスできるようになります。ブラウザに作成したadminのドメインを貼り付けて検索するとWordPressの初期画面が表示されます。アクセス出来たらWordPressの初期設定をしていきましょう。
※ネームサーバの登録に時間がかかるためWordPressの画面が表示されなかった場合には少し待ってから再度アクセスしてみてください。
「さあ、始めましょう!」を押下して以下の通り設定していきます。
- データベース名 :wp_db
- ユーザー名 :wp_user
- パスワード :設定したパスワード
- データベースホスト名 :RDSのエンドポイント
- テーブル接頭辞 :そのまま
- タイトのタイトル :任意
- ユーザー名 :任意
- パスワード :任意
- メールアドレス :ご自身のメールアドレス
- 検索に表示しないのチェックをいれておく
設定が出来たら「成功しました!」と表示されるので「ログイン」を押下します。
ログインし、以下のような管理者サイトが表示されたらOKです。管理者サイトには画像のように黒いヘッダーが付きます。
管理者サイトとユーザーサイトをドメインで分ける
本記事のテーマの1つ、管理者サイトとユーザーサイトをドメインで分ける作業をやっていきます。
設定 > 一般 >
と進み「サイトアドレス」の箇所をadminのドメインからuserのドメインに変更します。
ブラウザからuserのドメインでアクセスしてユーザーサイトが表示されればOKです。ユーザーサイトは画像のように黒いヘッダーがないです。
サイトをSSL化する
本記事のテーマの2つ目、サイトのSSL化をやっていきます。現在HTTPで行っているアクセスをSSL化し、HTTPSでのセキュアなアクセスに変更していきます。
SSL Insecure Content Fixer 適用
WordPress管理者サイトの左ペインよりプラグイン > 新規プラグインを追加
を選択し「SSL Insecure Content Fixer」を検索し、インストールします。
インストールが完了したら有効化します。
左ペインより設定 > SSL Insecure Content
を選択し、HTTPS の検出方法にて「HTTP_X_FORWARDED_PROTO」を選択して保存します。
ACMの作成
AWSマネジメントコンソールより以下のように検索しACMを作成していきます。
ACM > 証明書をリクエスト > パブリック証明書をリクエスト
- 完全修飾ドメイン名 :*.[ドメイン名]
- 他はデフォルトのままでOK
リクエストが作成されたら証明書IDRoute53でレコードを作成 > レコードを作成
とし、ステータスが発行済みになればOK
ALBリスナーの作成
AWSマネジメントコンソールより以下のように検索しALBリスナーを作成していきます。
EC2 > ロードバランサー > リスナーとルール > リスナーの追加
- プロトコル :HTTPS
- ターゲットグループ :作成したターゲットグループ
- 証明書 :作成したACM
- 他はデフォルトでOK
HTTPをHTTPSへリダイレクト設定
ロードバランサーの画面から以下のように選択し、リダイレクト設定をします。
HTTP:80を選択してリスナーの管理 > リスナーの編集
- アクションのルーティング :URLにリダイレクト
- ポート :443
- 他はデフォルト
アクセスして確認
改めてブラウザからアクセスし画面左上が「保護されていない通信」から「SSL化」のマークに代わっていればOKです。この時HTTPでアクセスしてもHTTPSにリダイレクトされているかというところまで確認しましょう。
まとめ
本記事では1つのAZのみを使用したシングル構成での構築としました。シングル構成は運用が楽だったり低コストといったメリットがあります。後編の記事ではシングル構成から冗長化構成としていますのでよろしければそちらもご覧ください。
Discussion