こんにちは、西海です。
最近また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サイトを構築

