【第1回】AWS EC2とDocker ComposeでWordPressを構築する

#Amazon Web Services #Docker #EC2 #Wordpress #クラウド #コンテナ
個人開発

今回は初投稿として全3回の連載で、「AWSとDockerを使って、独自ドメイン・HTTPS対応のWordPressブログを構築する手順」を解説していきます。

ブログを始めるだけなら一般的なレンタルサーバーが簡単ですが、あえてAWSを使って一から構築することで、サーバー構築・ネットワーク・コンテナ技術・セキュリティ設計といった、実務で使える「インフラエンジニアの基礎スキル」をハンズオン形式で学べます。

連載の第1回目となる本記事では、すべての土台となるAWS EC2の立ち上げから、Docker Composeを使ったWordPressとデータベースの起動までをステップバイステップで行います。

AWSのアカウントさえあれば、初心者の方でもこの記事の手順通りに実装するだけで、インターネット上に自分だけのWebサイトを立ち上げることができます。

1. 今回使用する主要技術の概要

  • AWS (EC2 / VPC) 世界最大のクラウドサービスです。今回はAWS上に仮想ネットワーク(VPC)を作り、その中に「EC2」という仮想サーバーを立ち上げてWebサイトの土台にします
  • Docker / Docker Compose EC2サーバーの中に「コンテナ」という独立した箱を作り、WordPress本体やデータベース(MySQL)を動かします。コマンド一発で環境を作ったり壊したりできる、現代のインフラ構築には欠かせない技術です。
  • HTTPSプロトコル(Nginx + Let’s Encrypt) ブログを商用レベルにするため、通信を暗号化します。今回は「Nginx」という受付サーバーをDocker上に配置し、「Let’s Encrypt」を使って無料で自動的にSSL証明書を更新する仕組みを作ります。
  • 生成AIチャットボット(Amazon Bedrockを使用) ブログの読者の質問に答えるAIチャットボットを実装します。生成AI Claude Sonet 4.6を、AWS LambdaとAPI Gatewayを経由して呼び出します。さらにクラウド破産を防ぐため、AWS WAFというファイアウォールを設置して安全に公開します。

2. AWSコンポネント構成図

今回は、AWS上に以下のようなセキュアで高度なアーキテクチャを構築しました。

具体的には以下のようになります。

【インターネット(読者)】
       │
       ├── (1) ブログへのアクセス (HTTPS/443)
       │      ▼
       │  [ AWS Cloud ]
       │      │
       │      └── [ EC2 ]
       │             │
       │             ├── Nginx (リバースプロキシ/SSL暗号化)
       │             ├── WordPress
       │             └── MySQL
       │
       └── (2) AIチャットボットへの質問
              ▼
          [ AWS WAF ] (連続アクセス・スパム攻撃を遮断)
              ▼
          [ Amazon API Gateway ] 
              ▼
          [ AWS Lambda ] (Python)
              ▼
          [ Amazon Bedrock ] (生成AI: Claudeが回答を作成)

1つの画面の裏側で、「Webサイトを表示するインフラの流れ」「AIが質問に答えるサーバーレスの流れ」の2つが連携する構成になっています。

つぎにこのアーキテクチャにおける、「EC2インスタンスの立ち上げ」を行っていきます。

3. AWS EC2インスタンスの立ち上げ

今回は、AWSの「無料利用枠」の対象となるスペックを選んで構築するため、初めての方でもコストを気にせず進めることができます。

3.1. EC2ダッシュボードからの起動

まずはAWSマネジメントコンソールにログインし、画面上部の検索バーで「EC2」と検索してダッシュボードを開きます。 左メニューの「インスタンス」から、オレンジ色の「インスタンスを起動」ボタンをクリックして設定画面に入ります。

  • 「名前」の欄に 「WordPress-Server 」などの分かりやすい名前を入力します。

3.2. OSとインスタンスサイズの選択

次に、サーバーの中身(OSとスペック)を決めていきます。

  • アプリケーションおよび OS イメージ (Amazon マシンイメージ – AMI): 「Amazon Linux 2023 AMI」を選択します。Amazon LinuxはAWSがクラウド向けに最適化して提供している軽量なOSで、動作が速くセキュリティも高いため、インフラ構築の定番です。
  • インスタンスタイプ: 「t2.micro」(または t3.micro)を選択します。個人ブログの立ち上げであれば、メモリ1GBのこのサイズで十分に動作します。

3.3. キーペアの作成とダウンロード

サーバーに安全にログインするための「キーペア」を作成します。

  • キーペア : 「新しいキーペアの作成」をクリックし、「my-aws-key」 などの名前をつけて作成します。 作成すると、ご自身のPCに 「.pem」 という拡張子のファイルがダウンロードされます。このファイルは二度とダウンロードできないので無くさないように大切に保管してください。

3.4. ネットワークとセキュリティグループの設定

ここがサーバー構築において最も重要です。外部からサーバーにアクセスできるように設定をします。 「ネットワーク設定」タブの「編集」をクリックして、以下の設定を行ってください。

  • VPC/サブネット: デフォルトの設定を選択します
  • パブリック IP の自動割り当て: 「有効化」にします。(インターネット上の住所が割り当て、インターネットからのアクセスを可能にします)
  • ファイアウォール : 「セキュリティグループを作成する」を選び、以下の2つのインバウンドルールを設定します。

1つ目:タイプ SSH / ソース Anywhere-IPv4 (0.0.0.0/0)

 2つ目:タイプ HTTP/ ソース Anywhere-IPv4 (0.0.0.0/0)

💡 【解説】なぜ2つのポートを開けるのか?

  • SSH(ポート22番)は、管理者がサーバー内からコマンドを叩くための「管理者用の勝手口」です。
  • HTTP(ポート80番)は、世界中のユーザーがブラウザからブログを見に来るための「一般客用の正面玄関」です。これを設定しないと、WordPressを立ち上げても誰も画面を見ることができません。

最後に、画面右下の「インスタンスを起動」をクリックします。 「成功」画面が出た後、インスタンス一覧に戻り、状態が「実行中」になっていることを確認します。

4. EC2へのSSH接続とDockerのインストール

EC2インスタンスが無事に立ち上がったら、次はサーバー内から、Webサイトを動かすためのエンジンである「Docker」をインストールしていきます。 今回はAWSのブラウザ上で動くターミナル「AWS CloudShell」を使ったssh接続を行います。

4.1. CloudShellからEC2へSSH接続する

AWSマネジメントコンソールの画面左下にある「CloudShell」のアイコン(>_ のようなマーク)をクリックして開きます。

【1. 鍵ファイルのアップロード】 EC2を作成した時にダウンロードした鍵ファイル「.pem」をCloudShellに持ち込みます。 CloudShellの右上にある「アクション」をクリックし、「ファイルのアップロード」から .pem ファイルを選択してアップロードします。

【2. 鍵の権限変更と接続】 アップロードが完了したら、以下のコマンドを順番に実行します。(※ <パブリックIPアドレス> の部分は、先ほど作成したEC2のIPアドレスに書き換えてください)。

# 鍵ファイルの権限を「自分だけが読める」ように厳しく変更する
chmod 400 my-aws-key.pem

# SSHコマンドでEC2インスタンスの中に接続する
ssh -i "my-aws-key.pem" ec2-user@<パブリックIPアドレス>

実行後、「Are you sure you want to continue connecting?」 と聞かれたら yes と入力してEnterを押します。 画面の左端が [ec2-user@ip-172-31... ~]$ のような表示に変われば、ssh接続完了です。

4.2. OSの最新化とDockerのインストール

EC2の中に入ったら、まずはサーバーのシステムを最新の状態にし、コンテナの核となる「Docker」本体をインストールします。

# OS(パッケージ)を最新の状態にする
sudo dnf update -y

# Dockerをインストールし、起動する
sudo dnf install docker -y
sudo systemctl start docker

# サーバー再起動時にも自動でDockerが起動するように設定する
sudo systemctl enable docker

次に、毎回 sudoと打たなくてもDockerを操作できるように、ユーザーの権限を変更します。

# ec2-userをdockerグループに追加する
sudo usermod -aG docker ec2-user

⚠️ 【重要】設定の反映 上記の権限変更をシステムに認識させるため、一度 exit と入力してEC2からログアウトし、再度 ssh -i ... のコマンドを打って入り直してください。これを忘れると次の手順でエラーになります。

4.3. Docker Composeのインストール

最後に、複数のコンテナ(WordPressとデータベース)を同時に連携させて動かすためのツール、「Docker Compose」をインストールします。

# Docker Composeの実行ファイルをインターネットからダウンロードする
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# ダウンロードしたファイルに実行権限を付与する
sudo chmod +x /usr/local/bin/docker-compose

これでEC2インスタンスが、いつでもDockerコンテナを動かせる状態になりました。

5. docker-compose.ymlの作成とコンテナ起動

Dockerの準備が整ったら、WordPressを動かします。 Dockerでは、「どのようなサーバーを、どう連携させて動かすか」をすべてコードで定義します。これを「Infrastructure as Code(IaC)」と呼びます。

今回は「WordPress」と記事データを保存するデータベースである「MySQL」の2つのコンテナを連動させるための設計図(docker-compose.yml)を作成します。

5.1. 作業用ディレクトリと設計図の作成

EC2の中で、今回作業するための専用フォルダを作り、nano というテキストエディタで設定ファイルを開きます。

# 作業用フォルダを作って移動する
mkdir my-wordpress
cd my-wordpress

# nanoエディタで新しいファイルを作成して開く
nano docker-compose.yml

5.2. docker-compose.ymlの記述

真っ黒なエディタ画面が開いたら、以下のコードをコピーして貼り付けてください。

(※今回は初期構築テストのため、パスワード等はサンプルを入れています。後ほど本番運用する際に変更してください)

yamlCopyversion: '3'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: somesecurepassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpresspassword
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpresspassword
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

💡 【解説】エディタ内の記述内容に関して

  • image: Docker Hubから、公式の mysql:8.0 と wordpress:latestをダウンロードする指示です。
  • ports: "80:80": インターネットからのHTTP通信(80番ポート)を、WordPressコンテナの80番に繋ぐ設定です。
  • volumes: コンテナを再起動してもブログのデータが消えないように、EC2本体の安全な場所にデータを保存する設定です。

貼り付けが終わったら、キーボードで Ctrl + O → Enter → Ctrl + X の順に押して元の画面に戻ります。

5.3. コンテナの起動

以下のコマンドを実行して、設計図通りにコンテナを起動させます。

# バックグラウンドでコンテナを起動する
docker-compose up -d

画面に Pulling db... のような文字が流れ、必要なデータが自動でダウンロードされます。 数分待って、Started という緑色の文字が出れば起動は完了です。また、 docker-compose ps コマンドで、2つのコンテナの「State」が 起動中になっていることを確認できます。

5.4. IPアドレスによるアクセス確認

自分のWebサイトがインターネット上に起動されたかを確認します。

  1. AWSコンソール画面に戻り、今回作成したEC2インスタンスを選択します。
  2. 画面下部の詳細タブにある 「パブリック IPv4 アドレス」 の数字(例:13.111.22.33)をコピーします。
  3. ご自身のパソコンのブラウザのURL欄に、コピーした数字をそのまま貼り付けてEnterを押します。

画面に WordPressのロゴ と、「言語の選択画面」 が表示されたら完了です。

お疲れ様です。今回はAWS上に自分専用のWordPress環境を立ち上げました。

しかし、今の状態はIPアドレスを直接打ち込まなければならず、通信も暗号化されていないためブラウザに「保護されていません」と警告が出てしまいます。

▼ 次のステップ(第二回)では、IPアドレスを固定し、独自ドメインの設定と無料の自動HTTPS化を行います

コメント

  1. より:

    初コメ