EC2でWordPressを立てる(NitroEnclaves+LAMPスタック)

概要

WordPressを利用したテックブログ(本サイト)をAWS上で構築しました。

EC2でコンピューティング最適化インスタンスの最新世代を選択するだけで、WordPressでよく利用されるパフォーマンス関連のプラグインを導入せずとも、高いWebパフォーマンス (GoogleのPageSpeed Insightsスコア) を叩きだせています。

AWSではACMで無料の証明書を利用できますが、以前はその証明書を利用できるのはALB/CloudFrontなどのマネージドサービス上のみでした。Nitro Enclavesを利用することで、ACMで発行した証明書をEC2で利用できます。

CDN(CloudFront), ロードバランサ(ALB), DBaaS(RDS/Aurora)を利用したリッチな構成も可能ですが、コストを抑えたシンプルな構成にしてみました。

きっかけ

既存のブログサービスはサーバのことを気にせず簡単に利用できる一方で、UIのちょっとした部分をカスタマイズできないのが不満でした(特にモバイルにも最適化されているサイトでは、本文の横幅が短く設定されていて、表の情報量を大きくすると各フィールドが狭くなり見づらいなど)。

ブログサイトを自作すれば、UIは自由にカスタマイズできるのが魅力でした。

また、ブログサイト自体の構築/運用に興味があったのと(アーキテクチャ設計, パフォーマンス改善, バックアップなど)、アクセス分析にも興味がありました。

業務でAWSを扱っているので、AWSのアーキテクチャ/運用の仕組みを新規で設計したい!という気持ちもありました。

構成

  • EC2 (c7g.large, NitroEnclaves要件に適合するインスタンスタイプ)
  • サーバへのSSH: Session Managerでセキュリティ向上
  • ACM + Nitoro Enclaves (SSL) + LAMPスタック (Amazon Linux + Apache + MySQL(MariaDB/RPM)) + PHP + WordPress)
    • ACMを利用することでAmazonがCAの無料の証明書を利用可能, Nitro EnclavesはNGINX/Apache対応だが、WordPressのセキュリティプラグインSite GuardがApache前提のため、WebサーバにApacheを採用
  • SES (問い合わせフォームのメール, WordPressの各種通知)
  • AWS Backup (バックアップ)

構築

ACM

AmazonがCAの無料の証明書を発行

証明書をNitro Enclavesの仕組みでApacheに組み込む

EC2

Nitro Enclaves対応のインスタンスタイプを選択する (Intel/AMD系プロセッサでは4vCPU以上, Gravitonプロセッサでは2vCPU以上など制限があるのでリファレンスを要確認)

What is AWS Nitro Enclaves? - AWS

おすすめはコンピューティング最適化インスタンスで、コストパフォーマンスの観点から、c7g.large (AWS Graviton 2コア, メモリ4GB)

LAMPスタックでは大きなメモリサイズは必要とせず、パフォーマンス向上にはCPUのシングルスレッド性能の高さが重要と判断

AWS Gravitonは2023年登場の、「Graviton3」 AWSが開発する Armプロセッサーを搭載した 最新世代のEC2インスタンスであり高パフォーマンスが期待できる

Session ManagerでSSH

セキュリティグループでSSHを空ける必要がなくセキュリティが高い

Apacheインストール

yum install httpd -y
yum install mod_php -y
yum install mod_ssl -y

MySQLインストール

yum install -y mariadb-server

PHPインストール

# 最新を確認

amazon-linux-extras | grep php

# 最新のphpを指定する (公式ドキュメントでは、WordPressはphp7.4が必要書いてあるが、php8系対応済みの記載があるので、8系の最新を採用)

amazon-linux-extras install php8.2
yum install php-xml -y
yum install -y php-gd php-mbstring

Nitro Enclavesの設定

以下リファレンスを実施

大事な点は、Nitro Enclavesに割り当てるCPU数をデフォルトの2から、c7g.large(2コア) に合わせて、1に変更すること (1コア以上をNitro Enclavesに割り当てる必要があり、2コアインスタンスではデフォルトの2コア割り当てではエラーになってしまうため、1コアをNitro Enclavesに割り当てる設定をする)

設定の流れの要旨としては、インスタンスプロファイルでACMの証明書へのアクセス権を割り当て、Apache起動時にACMの証明書を参照できるようにすること。

SES

SES構築後、WordPressのContactt Form 7(メール問い合わせプラグイン), WP Mail SMTP(メール通知プラグイン)でSESを送信サーバに設定する

AWS Backup

日次バックアップを組み、一定期間でローテーションさせる。EC2内でファイル/MySQLダンプのバックアップなどを合わせて組むことも可能

WordPressの設定(システム部分)

  • サイトURLを設定(以降このURLにリダイレクトされるようになる。Webサーバの設定と合わせて重要な設定)
  • Contact Form7 (問い合わせフォームプラグイン), WP Mail SMTP(メール通知プラグイン) を導入し、SESと連携する

構築結果

パフォーマンス

WordPressで利用の多いパフォーマンス向上系のプラグインを一切インストールしない状態で、GoogleのPageSpeed Insightsで85点と高い値を記録。

採用したEC2インスタンスタイプ (c7g.large (コンピューティング最適化インスタンス/AWS Graviton G2コア4GBメモリ)) が高性能で、かつAWSのNWが高速であるのが理由と考えている

メンテナンス性

サーバのCPU/IO性能が高い (ストレージ(GP3: IOPS:3000, 125MB/tps)) & AWSのNWが高速な恩恵で、記事の保存やWordPressのプラグインの更新が瞬時に終わり快適です。

また、AWS基盤の信頼性が高いので、バックアップの安心感があります。

UI/UX

本文の横幅を広げることで、特にパラメータ比較などの情報量の多い表を扱うときに視認性が高くなりました。表に大量の数字をのせるときの視認性を考慮して、フォントもこだわりました(最終的にkosugi-maruです)。ヘッダー/フッター/サイドバーなども省略orシンプルにし、自分的には見やすいと思えるサイトになりました。

アクセス分析

Google Analyticsで、既存のテックブログでは扱えなかった、サイトへの流入経路 (Google検索ワード) などを確認でき、サイト運営/マーケティング的な要素の勉強になります。

今後の展望

アーキテクチャ改善, 工夫など

  • リザーブドインスタンス or Savings Plan利用によるコスト削減
  • cloud watch alerm/metrics/metrics filter等々での監視の充実
  • CDN(Cloud Front/Global Accelerator) + WAFでのNW最適化/DDOS Standard実装, L7防御
  • アクセスログのQuickSight可視化/分析

WordPressで対応可能か調査必要な観点

  • スケールアウト/オートスケーリング構成可否
  • 静的ファイル(css/js)のS3構成
  • コンテナ化