はじめに
AWSを学び始めたばかりの方向けに、EC2でWebサーバーを立て、RDSでデータベースを構築し、ALBを使ってHTTPS化するまでの一連の手順をまとめました。この記事の手順通りに進めれば、実践的でセキュアなWebサーバーの基礎が完成します。
完成図
ユーザーからのリクエストは、Route 53 → ALB(HTTPS) → EC2(HTTP) → RDS の順に流れます。EC2インスタンスはALBの背後に隠れ、直接インターネットに公開されない安全な構成です。
[ユーザー] ---> [Route 53] ---> [ALB (HTTPS)] ---> [EC2 (HTTP)] ---> [RDS]
↑
[ACM SSL証明書]
1. EC2インスタンスの起動 (Webサーバー)
まずはアプリケーションを動かすための仮想サーバーを立ち上げます。
・ AMI: Amazon Linux 2023
・ インスタンスタイプ: t2.micro (無料利用枠)
・ キーペア: 新規作成し、.pemファイルを厳重に保管します。
・ セキュリティグループ: 新規作成し、以下を設定します。名前は ec2-sg としておきます。
・タイプ: SSH
・ソース: マイIP
2. サーバー環境の構築 (Apache & Python)
EC2にSSHで接続し、Webサーバー(Apache)と、指定のバージョンのPythonをインストールします。
2-1. Apacheのインストール
# パッケージのアップデート
sudo dnf update -y
# Apacheのインストールと起動設定
sudo dnf install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
2-2. Python 3.13.5のインストール (ソースからコンパイル)
# 開発ツールのインストール
sudo dnf groupinstall "Development Tools" -y
sudo dnf install bzip2-devel gdbm-devel libffi-devel libuuid-devel ncurses-devel openssl-devel readline-devel sqlite-devel tk-devel xz-devel zlib-devel -y
# Pythonソースコードのダウンロードと展開
cd /usr/local/src
sudo wget https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tgz
sudo tar -xvf Python-3.13.5.tgz
# コンパイルとインストール
cd Python-3.13.5
sudo ./configure --enable-optimizations
sudo make -j $(nproc)
# `install`ではなく`altinstall`を使い、システムのpythonを上書きしないようにする
sudo make altinstall
# バージョンを確認
python3.13 --version
# => Python 3.13.5
3. RDSデータベースの作成 (PostgreSQL)
データベースは管理が簡単なRDSを利用します。
AWSのRDSコンソールで「データベースの作成」をクリックします。
以下の設定で作成します。
・ エンジンのオプション: PostgreSQL
・ テンプレート: 無料利用枠
・ 設定: DBインスタンス識別子、マスターユーザー名、マスターパスワードを設定し、 パスワードは必ず控えておきます。
・ 接続: 「EC2コンピューティングリソースに接続」で、ステップ1で作成したEC2インスタンスを選択します。
パブリックアクセス: なし
4. SSL証明書の取得 (ACM)
HTTPS化に必須のSSL証明書を無料で取得します。
-
AWS Certificate Manager (ACM) のコンソールを開きます。
-
「証明書をリクエスト」をクリックし、「パブリック証明書をリクエスト」を選択します。
-
ドメイン名(例: example.com と *.example.com)を入力します。
-
検証方法で「DNS 検証」を選択します。
-
Route 53でドメインを管理している場合、「Route 53でのレコード作成」ボタンが表示されるのでクリックするだけで検証が完了します。
5. ロードバランサー(ALB)の構築
ACMの証明書を適用し、アクセスの窓口となるロードバランサーを作成します。
5-1. ターゲットグループの作成
-
EC2コンソールの「ターゲットグループ」で「作成」をクリックします。
-
ターゲットタイプは「インスタンス」、プロトコルはHTTP:80に設定します。
-
作成したEC2インスタンスをターゲットとして登録します。
5-2. ロードバランサーの作成
-
EC2コンソールの「ロードバランサー」で「作成」をクリックし、「Application Load Balancer」を選択します。
-
スキームは「インターネット向け」を選択します。
-
ネットワークマッピングで、VPCとアベイラビリティーゾーンを2つ以上選択します。
-
セキュリティグループで「新しいセキュリティグループを作成」し、HTTPとHTTPSのインバウンドを許可します。名前は alb-sg としておきます。
-
リスナーで、HTTPS:443の転送先を先ほど作成したターゲットグループに設定し、「デフォルトのSSL/TLS証明書」でステップ4で作成したACM証明書を選択します。
6. セキュリティグループの最終設定 (最重要)
サーバーを安全に保つため、EC2とALBのセキュリティグループを正しく設定し直します。
① ALBに設定するセキュリティグループ (alb-sg)
インターネットからのHTTP/HTTPSアクセスを全て許可します。
タイプ プロトコル ポート範囲 ソース
HTTPS TCP 443 0.0.0.0/0
HTTP TCP 80 0.0.0.0/0
② EC2インスタンスに設定するセキュリティグループ (ec2-sg)
ALBからのHTTP通信と、自分からのSSH通信のみを許可します。
タイプ プロトコル ポート範囲 ソース
HTTP TCP 80 alb-sg のID
SSH TCP 22 マイIP
7. ドメイン(Route 53)とALBの接続
最後に、ドメインへのアクセスがALBに向かうように設定します。
-
Route 53のホストゾーンで、ドメイン名を選択します。
-
「レコードを作成」をクリックします。
-
以下の設定でAレコードを作成します。
・ レコード名: (空欄)
・ エイリアス: トグルをオンにする
・ トラフィックのルーティング先: 「Application Load BalancerおよびClassic Load Balancerへのエイリアス」を選択し、作成したALBを指定します。 -
同様に、レコード名に www を指定したレコードも作成します。
まとめ
お疲れ様でした!
これで、スケーラブルでセキュアなWebサーバーの基盤が完成しました。今後はこのEC2インスタンス上でWebアプリケーションを開発し、デプロイしていくことになります。