サイトアイコン 協栄情報ブログ

ECS/FargateでWordPress構築ハンズオン

こんにちは、西海です。
最近またECS周りを勉強したいなと思っていたのですが、何をすればいいか悩んでいました。
いろいろ考えたのですが、やっぱり基本的な構成で作りやすいものといえばWordPressですね。
というわけで、ECS/Fargateを使用してWordPressを構築しました。

目的

ECS/FargateでWordPressを構築し、システム構築の基本を勉強する。

構成・条件

今回の構成は画像の通りとなります。
やってみたいなと思い盛り込んだ点としては、以下の通りです。
・パブリックサブネットにALBとNatGatewayを配置。
・プライベートサブネットはECS用に2つ、RDS用に2つ用意。
・ACMで証明書を用意し、インターネットからALBまでの通信はHTTPS化する。
 →ドメインは社内検証環境に存在していたものを使用。
・画像やWordPress用のプラグインなどはEFSに保存する。
・データベースのパスワードはSecret managerを使用して管理・参照する。

構築リソース

今回構築したリソースは以下です。

サービス 用途 備考
VPC ネットワーク基盤 10.0.0.0/16
Subnet ネットワーク分割 Public×2、Private×4
Internet Gateway インターネット接続
NAT Gateway プライベートサブネットからの外向き通信
ALB ロードバランサー HTTPS終端
ECS Fargate WordPressコンテナ bitnami/wordpress使用
RDS MySQL データベース db.t3.micro(無料枠)
EFS 永続化ストレージ wp-content等の永続化
ACM SSL/TLS証明書 HTTPS用
Secrets Manager パスワード管理 RDSパスワードの安全な管理
Route 53 DNS ドメイン設定

構築手順

AWSマネジメントコンソールを使用した構築手順となります。
リージョンは任意ですが、私は東京リージョン(ap-northeast-1)を使用しました。

VPC関連の作成

「VPCなど」を選択し、必要なリソースを一括で作成します。

項目 設定値
作成するリソース VPCなど
名前タグ 任意の名前
IPv4 CIDRブロック 10.0.0.0/16
IPv6 CIDRブロック なし
テナンシー デフォルト
アベイラビリティゾーン (AZ) の数 2
パブリックサブネットの数 2
プライベートサブネットの数 4
パブリックサブネット1のCIDRブロック 10.0.1.0/24
パブリックサブネット2のCIDRブロック 10.0.2.0/24
プライベートサブネット1のCIDRブロック 10.0.11.0/24
プライベートサブネット2のCIDRブロック 10.0.12.0/24
プライベートサブネット3のCIDRブロック 10.0.21.0/24
プライベートサブネット4のCIDRブロック 10.0.22.0/24
NAT ゲートウェイ Zonal
NAT ゲートウェイ 1AZ内

以下のようにリソースが作成されていればOKです。

セキュリティグループの作成

各リソースに必要なSGを作成します。
アウトバウンドの値はデフォルト(0.0.0.0/0)で統一します。

ALB用セキュリティグループ

インバウンドルール

タイプ ポート ソース 説明
HTTPS 443 0.0.0.0/0 Allow HTTPS from Internet
HTTP 80 0.0.0.0/0 Allow HTTP for redirect

ECS用セキュリティグループ

インバウンドルール

タイプ ポート ソース 説明
カスタムTCP 8080 ALB用SG Allow from ALB

RDS用セキュリティグループ

インバウンドルール

タイプ ポート ソース 説明
MySQL/Aurora 3306 ECS用SG Allow from ECS

ソースにECS用SGを指定していますが、こうすることでECSタスクのIPが変更になってもアクセスが許可されます。

EFS用セキュリティグループ

インバウンドルール

タイプ ポート ソース 説明
NFS 2049 ECS用SG Allow NFS from ECS

RDS関連の構築

WordPressのデータを保存するためのMySQLデータベースを構築します。
それに伴い、サブネットグループ作成します。
パラメータグループはデフォルトのものを使用するため、個別には作成しません。

DBサブネットグループの作成

RDSダッシュボードを開き、左メニューから「サブネットグループ」を選択します。
「DB サブネットグループを作成」をクリックし、以下の設定で作成します。

項目 設定値
名前 任意の名前
説明 任意の値
VPC 作成したVPCを選択
アベイラビリティーゾーン VPC作成時に選択したAZ
サブネット RDS用のプライベートサブネットを選択

作成後、詳細画面に以下のように表示されていればOKです。

RDSインスタンスの作成

今回は無料枠を使用して作成します。

エンジンのオプション

項目 設定値
エンジンタイプ MySQL
エンジンバージョン MySQL 8.0.x(最新の8.0系)

テンプレート

「無料利用枠」を選択します。

設定

項目 設定値
DBインスタンス識別子 任意の名前
マスターユーザー名 admin
マスターユーザーアクセス方法 AWS Secrets Manager で管理

マスターパスワードをSecret Managerで自動作成・管理します。

インスタンスの設定

項目 設定値
DBインスタンスクラス db.t3.micro

接続

項目 設定値
VPC 作成したVPCを選択
DBサブネットグループ 作成したDBサブネットグループを選択
パブリックアクセス なし
VPCセキュリティグループ RDS用のSGを選択

追加設定

項目 設定値
最初のデータベース名 wordpress
自動バックアップを有効にする 無効化
マイナーバージョン自動アップグレードの有効化 無効

この「最初のデータベース名」は空欄のままだとデータベースが作成されず、WordPressからの接続時にエラーとなります。そのため、必ず設定してください。
作成後、ステータスが「利用可能」になるまで5〜10分ほど待ちます。

EFSの構築

WordPressのファイル(テーマ、プラグイン、アップロードファイル等)を永続化するためのEFSを構築します。

EFSファイルシステムの作成

作成時、「カスタマイズ」を選択します。

全般設定

項目 設定値
名前 任意の名前
ファイルシステムのタイプ リージョン
自動バックアップ 無効(コスト削減のため)
低頻度アクセス (IA) への移行 なし
アーカイブへの移行 なし
暗号化 有効

パフォーマンス設定

項目 設定値
スループットモード バースト
パフォーマンスモード 汎用 (推奨)

ネットワーク設定

項目 設定値
VPC 作成したVPCを選択

マウントターゲットは以下の2つを設定します。

アベイラビリティゾーン サブネット セキュリティグループ
VPC作成時に選択したAZ ECS配置用のプライベートサブネット EFS用SG
VPC作成時に選択したAZ ECS配置用のプライベートサブネット EFS用SG

アクセスポイントの作成

作成されたEFSファイルシステムを選択し、「アクセスポイント」タブから「アクセスポイントを作成」をクリックします。

項目 設定値
名前 任意の名前
ルートディレクトリパス /wordpress
POSIXユーザー – ユーザーID 1001
POSIXユーザー – グループID 1001
ルートディレクトリ作成権限 – オーナーユーザーID 1001
ルートディレクトリ作成権限 – オーナーグループID 1001
ルートディレクトリ作成権限 – アクセス許可 0755

ユーザーIDとグループIDに1001を指定しているのは、bitnami/wordpressコンテナのデフォルトユーザーが1001であるためです。

ACM証明書の発行

ALBでHTTPS通信を終端するためのSSL証明書を発行します。

証明書のリクエスト

AWS Certificate Manager(ACM)の「証明書をリクエストから、「パブリック証明書をリクエスト」を選択します。

項目 設定値
完全修飾ドメイン名 自身で用意したドメインを含む任意の名前
検証方法 DNS検証

証明書のドメイン名とアクセスするURLは必ず一致させてください。例えば、証明書をwww.example.comで発行した場合、https://www.example.comでアクセスする必要があります。異なるドメインでアクセスすると、ブラウザに「保護されていない通信」と警告が表示されます。

DNS検証

証明書が作成されると、ステータスが「検証保留中」になります。証明書を選択して詳細を表示し、「ドメイン」セクションで「Route 53でレコードを作成」をクリックします。

Route 53でドメインを管理している場合は、自動的にCNAMEレコードが作成されます。
もし権限不足などで自動作成できない場合、手動でRoute53にCNAMEレコードを登録します。

項目 設定値
レコード名 証明書のCNAME名(ACM詳細画面から確認)
レコードタイプ CNAME
証明書のCNAME値(ACM詳細画面から確認)
TTL 300

レコード作成後、数分から数十分で証明書のステータスが「発行済み」に変わります。

ALBの構築

インターネットからのリクエストを受け付け、ECSタスクに振り分けるApplication Load Balancerを構築します。

ターゲットグループの作成

ECSタスクを登録するためのターゲットグループを作成します。

基本設定

項目 設定値
ターゲットタイプ IPアドレス
ターゲットグループ名 任意の名前
プロトコル : ポート HTTP : 8080
VPC 作成したVPCを選択

ヘルスチェック

項目 設定値
ヘルスチェックプロトコル HTTP
ヘルスチェックパス /
正常のしきい値 2
非正常のしきい値 3
タイムアウト 30秒
間隔 60秒
成功コード 200,301,302

ALBの作成

基本設定

項目 設定値
ロードバランサー名 任意の名前
スキーム インターネット向け
IPアドレスタイプ IPv4

ネットワークマッピング

項目 設定値
VPC 作成したVPCを選択
アベイラビリティーゾーンとサブネット 選択できるAZ: パブリックサブネットを選択

セキュリティグループ

ALB用のSGを選択します。

リスナーとルーティング

項目 設定値
プロトコル HTTPS
ポート 443
デフォルトアクション ターゲットグループに転送: 作成したTGを選択
セキュリティポリシー ELBSecurityPolicy-TLS13-1-2-Res-PQ-2025-09
デフォルトのSSL/TLS証明書 先ほど作成した証明書を選択

HTTPからHTTPSへのリダイレクト設定

作成したALBを選択し、HTTPの通信をHTTPSに転送するリスナーを追加します。

項目 設定値
プロトコル HTTP
ポート 80
デフォルトアクション URLにリダイレクト
リダイレクト先プロトコル HTTPS
リダイレクト先ポート 443
ステータスコード 301 – 完全に移動

これにより、HTTPでアクセスした場合も自動的にHTTPSにリダイレクトされます。

ECSの構築

WordPressコンテナを動かすECS環境を構築します。

ECSクラスターの作成

項目 設定値
クラスター名 任意の名前
インフラストラクチャ Fargate のみ

タスク実行ロールの作成

タスク実行時に必要な権限と、Secret Managerへのアクセス権限、ECSExec用のSSM権限を持ったロールを作成します。

項目 設定値
信頼されたエンティティタイプ AWSのサービス
ユースケース Elastic Container Service
ユースケースの選択 Elastic Container Service Task

許可ポリシー
次のポリシーを追加します。
AmazonECSTaskExecutionRolePolicy
AmazonSSMManagedInstanceCore

ロール名
任意の名前で作成します。

作成後、「許可を追加」から「インラインポリシーを作成」を選択します。
JSONタブで以下のポリシーを入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": "arn:aws:secretsmanager:ap-northeast-1:[アカウントID]:secret:[作成したシークレットの名前]*"
    }
  ]
}

RDS作成時に自動でシークレットが作成されているので、[作成したシークレットの名前]には自動作成されたシークレットの名前を入力します。

タスク定義の作成

タスク定義の設定

項目 設定値
タスク定義ファミリー 任意の名前

インフラストラクチャの要件

項目 設定値
起動タイプ AWS Fargate
オペレーティングシステム/アーキテクチャ Linux/X86_64
CPU 1vCPU
メモリ 3GB
タスクロール 作成したロールを選択
タスク実行ロール 作成したロールを選択

コンテナ – 1

項目 設定値
名前 任意の名前
イメージ URI public.ecr.aws/bitnami/wordpress:latest
コンテナポート 8080
ポート名 任意の名前

環境変数

項目 設定値
WORDPRESS_DATABASE_HOST 作成したRDSのエンドポイント
WORDPRESS_DATABASE_PORT_NUMBER 3306
WORDPRESS_DATABASE_USER admin
WORDPRESS_DATABASE_NAME wordpress(RDS作成時に設定した名前)
WORDPRESS_USERNAME admin
WORDPRESS_PASSWORD 任意の値
WORDPRESS_ENABLE_HTTPS yes
WORDPRESS_ENABLE_REVERSE_PROXY yes
WORDPRESS_DATABASE_PASSWORD [作成したシークレットのARN]:password::

ストレージ
ボリュームの追加ボタンを押下してから設定します。

項目 設定値
ボリューム名 任意の名前
ボリュームタイプ EFS
ファイルシステム ID 作成したEFSのID
ルートディレクトリ /
アクセスポイント ID 作成したアクセスポイントのID
転送中の暗号化 有効

コンテナマウントポイント
マウントポイントの追加ボタンを押下してから設定します。

項目 設定値
コンテナ コンテナ – 1で設定した名前を選択
ソースボリューム 先ほど設定したボリューム名を選択
コンテナパス /bitnami/wordpress

ECSサービスの作成

作成したクラスター内にWordpress用のサービスを作成します。

サービスの詳細

項目 設定値
タスク定義ファミリー 作成したタスク定義を選択
タスク定義のリビジョン 最新のリビジョンを選択
サービス名 任意の名前

環境

項目 設定値
コンピューティングオプション 起動タイプ
起動タイプ FARGATE
プラットフォームバージョン LATEST
ECS Exec をオンにする 有効

デプロイ設定

項目 設定値
スケジューリング戦略 レプリカ
必要なタスク 1
アベイラビリティーゾーンのリバランスを有効にする 有効

ネットワーキング

項目 設定値
VPC 作成したVPCを選択
サブネット ECS用のサブネットを選択
セキュリティグループ ECS用のSGを選択
パブリックIP 無効

ロードバランシング

項目 設定値
ロードバランシングを使用 有効
VPC 作成したVPCを選択
ロードバランサーの種類 Application Load Balancer
既存のロードバランサーを使用 作成したALBを選択
既存のリスナーを使用 443:HTTPS
既存のターゲットグループを使用 作成したターゲットグループを選択

Route 53設定

ドメインをALBに向けるためのDNSレコードを作成します。
対象のホストゾーンに以下のレコードを追加します。

項目 設定値
レコード名 証明書のレコード名と合わせる
レコードタイプ A
エイリアス オン
トラフィックのルーティング先 Application Load Balancerへのエイリアス
リージョン ap-northeast-1
ロードバランサー 作成したALBを選択

動作確認

構築が完了後、以下の動作確認を行います。

ECSタスクの確認

ECSダッシュボードから作成したクラスターを選択し、「タスク」タブでタスクのステータスがRUNNINGになっていることを確認します。
タスクを選択して「ログ」タブを開き、エラーが出ていないことを確認してください。

ターゲットグループの確認

EC2ダッシュボードの「ターゲットグループ」から作成したターゲットグループを選択し、「ターゲット」タブでヘルスステータスがhealthyになっていることを確認します。

WordPress画面の確認

ブラウザでhttps://[レコード名]にアクセスし、WordPressの画面が表示されることを確認します。
アドレスバーに鍵マークが表示され、HTTPS接続になっていることも確認します。

WordPressの画面が表示されれば、動作確認は完了です。

まとめ

今回、WordPressの構築を通して基本的なAWSサービスの作成方法を学びました。
今回使用したサービスは基本的でいろんな場面で接する機会が多いため、今後も積極的に学んでいきたいです。
今後はこの構成を基本として他サービスの導入やIaCの勉強するつもりです。
そちらについてはまた別の記事にまとめたいと思います。

参考

他の方が投稿した記事もあるので、ぜひご一読ください!
AWS-マルチAZWordPressサイト構築練習(AmazonLinux2023)
【初学者向け】AWS Fargateを利用してWordPressサイトを構築

モバイルバージョンを終了