AWSコンソールでEC2 + Apacheウェブサーバーを構築する手順【EC2ハンズオン / CloudFormation版との比較付き】

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

「EC2インスタンスを立ち上げてWebサーバーを動かしたい」——AWSを学ぶうえで避けて通れない基本中の基本です。

この記事では、AWSコンソール(GUI)のみを使って、Apacheウェブサーバーが動作するEC2インスタンスをゼロから手動で構築するハンズオンを紹介します。

インターネット
  ↓ HTTP(ポート80)    ← ブラウザでアクセス
  ↓ SSH(ポート22)     ← ターミナルで接続
セキュリティグループ(ファイアウォール)
  ↓ 自分のIPのみ通過させる
EC2インスタンス(t2.micro / Amazon Linux 2023)
  ├── Apache httpd(UserDataで自動インストール)
  │     └── /var/www/html/index.html を返す
  └── IAMロール(Session Manager接続用)

このハンズオンで体験できること:

  • EC2インスタンスの基本操作(起動・設定・終了)
  • セキュリティグループによるポートアクセス制御(SSH:22 / HTTP:80)
  • UserData を使った初回起動時の Apache 自動インストール
  • IAMロールによる EC2 への権限付与の仕組み

このハンズオンの特徴:

  • キーペア・IAMロール・セキュリティグループ・EC2インスタンスを画面操作で1つずつ作成する
  • 手動操作を通じて、各リソースの役割と依存関係を視覚的に理解できる

この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でEC2・Apache・セキュリティグループの連携を視覚的に学び、CloudFormationと何が違うのかを比較したい方向けです。


-->

スポンサーリンク

キーワード解説

用語意味
EC2(Elastic Compute Cloud)AWSの仮想サーバーサービス。今回はここにApacheをインストールする
Apache(httpd)世界で最も広く使われているWebサーバーソフト。ブラウザからのHTTPリクエストを受け取りHTMLを返す
セキュリティグループEC2への通信を制御するファイアウォール。ポートごとにアクセス元IPを制限できる
UserDataEC2の初回起動時のみ自動実行されるシェルスクリプト。今回はApacheのインストールに使う
IAMロールEC2にAWSサービスを利用する権限を付与する仕組み。今回はSession Manager接続に使う
キーペアSSHでEC2に接続するための鍵ペア(公開鍵+秘密鍵)

スポンサーリンク

使用するAWSサービス

サービス役割料金
EC2Apacheが動作するWebサーバー本体(t2.micro)月750時間まで無料枠あり
セキュリティグループSSH/HTTPのアクセス制御無料
IAMEC2へのSession Manager接続権限無料
EBSEC2にアタッチされるストレージ(デフォルト8GB)月30GBまで無料枠あり

注意: 無料枠はAWSアカウント開設から12ヶ月間です。期間終了後はEC2インスタンス稼働時間に課金されます。ハンズオン後は必ずリソースを削除してください。


構築するリソース

リソース役割
キーペアSSHでEC2に接続するための認証鍵
IAMロールEC2にSession Manager接続の権限を付与
セキュリティグループSSH(22)・HTTP(80)のアクセス制御
EC2インスタンスApacheが動作するWebサーバー本体

全体の作業順序

依存関係があるため、必ずこの順番で作成します。

⓪ 自分のIPアドレスを確認する(重要)
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ EC2インスタンスを起動する
  (セキュリティグループ・UserDataも同時に設定)
      ↓
④ 動作確認(Web・SSH)
      ↓
⑤ リソースを削除する

【重要】⓪ 自分のIPアドレスを確認する

セキュリティグループで自分のIPだけを許可するために、正確なIPアドレスを事前に確認します。

注意: curl https://checkip.amazonaws.com で表示されるIPと、EC2への実際の接続元IPが一致しない場合があります(ISPやプロキシの経路の違いによる)。最も確実な方法はルーター管理画面での確認です。

方法A: ルーター管理画面で確認(推奨)

  1. ブラウザで以下のURLにアクセスします(ルーターによって異なります)
    http://192.168.0.1  または  http://192.168.1.1
  2. 「ネットワークマップ」または「インターネット」項目を開く
  3. **「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます

方法B: コマンドで確認

curl https://checkip.amazonaws.com

控えておく情報: 自分のIPアドレス(例: 203.0.113.1


① キーペアの作成

キーペアはSSHでEC2に接続するための鍵です。EC2起動時に指定する必要があるため、最初に作成します。

AWSコンソール → EC2 → ネットワーク&セキュリティ → キーペア → 「キーペアを作成」

設定項目
名前my-ec2-apache-key
キーペアのタイプRSA
プライベートキーファイル形式.pem

「キーペアを作成」をクリックすると、自動的に my-ec2-apache-key.pem がダウンロードされます。

ダウンロードしたキーペアを保存する

ダウンロードされた my-ec2-apache-key.pem を以下の場所に移動します。

C:\Users\ユーザー名\.ssh\my-ec2-apache-key.pem

注意: .pem ファイルは再ダウンロードできません。紛失した場合は新しいキーペアを作成する必要があります。


② IAMロールの作成

Session Manager(ブラウザからEC2に接続できるAWS機能)を使えるようにするためのIAMロールを作成します。

なぜIAMロールが必要か: EC2がAWSのサービス(Session Manager)を利用するには、そのEC2自身に「このサービスを使う権限」を付与する必要があります。この権限の設定がIAMロールです。

AWSコンソール → IAM → ロール → 「ロールを作成」

ステップ1: エンティティタイプとユースケースの選択

設定項目
信頼されたエンティティタイプAWSのサービス
ユースケースEC2

「次へ」をクリック。

ステップ2: 許可ポリシーのアタッチ

検索ボックスに AmazonSSMManagedInstanceCore と入力してチェックを入れます。

「次へ」をクリック。

ステップ3: ロール名の設定

設定項目
ロール名my-ec2-apache-role

「ロールを作成」をクリック。


③ EC2インスタンスの起動

キーペアとIAMロールを作成したあと、EC2インスタンスを起動します。
セキュリティグループとUserData(Apache自動インストール)も同時に設定します。

AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」

3-1. 基本設定

設定項目
名前my-ec2-apache-instance
アプリケーションおよびOSイメージAmazon Linux 2023 AMI(デフォルトで選択済み)
インスタンスタイプt2.micro(無料枠対象)
キーペアmy-ec2-apache-key

3-2. セキュリティグループの設定

「ネットワーク設定」→「セキュリティグループを作成する」を選択します。

セキュリティグループ名と説明を設定:

設定項目
セキュリティグループ名my-ec2-apache-sg
説明EC2 Apache hands-on SG

「インバウンドセキュリティグループのルールを追加」ボタンで以下の2ルールを追加します。

ルール1: SSH接続の許可

設定項目
タイプSSH
ソースタイプカスタム
ソース203.0.113.1/32(⓪で確認した自分のIP + /32)

ルール2: HTTPアクセスの許可

設定項目
タイプHTTP
ソースタイプカスタム
ソース203.0.113.1/32(⓪で確認した自分のIP + /32)

/32 とは: 「このIPアドレス1つだけ」という意味のCIDR表記です。0.0.0.0/0 は全世界に開放することになりセキュリティリスクが高いため、必ず自分のIPのみに制限します。

3-3. IAMロールの設定

「高度な詳細」を開く → 「IAM インスタンスプロファイル」→ my-ec2-apache-role を選択します。

3-4. UserDataの設定(Apacheの自動インストール)

「高度な詳細」の一番下にある「ユーザーデータ」に以下を貼り付けます。

#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from Amazon Linux 2023!</h1>" > /var/www/html/index.html
echo "<p>Instance ID: $(ec2-metadata --instance-id | cut -d ' ' -f 2)</p>" >> /var/www/html/index.html
echo "<p>Availability Zone: $(ec2-metadata --availability-zone | cut -d ' ' -f 2)</p>" >> /var/www/html/index.html

各コマンドの説明:

コマンド意味
yum update -yOSのパッケージを最新化する
yum install -y httpdApache(httpd)をインストールする
systemctl start httpdApacheを起動する
systemctl enable httpdOS起動時にApacheが自動起動するよう設定する
echo "..." > /var/www/html/index.htmlApacheが返すテスト用HTMLを作成する

UserDataとは: インスタンスの初回起動時のみ自動実行されるシェルスクリプトです。この仕組みを使うことで、EC2起動と同時にApacheのインストールまで自動化できます。

3-5. インスタンスを起動する

「インスタンスを起動」ボタンをクリック。

起動完了まで約2〜3分待ちます。インスタンスの「状態」が「実行中」になったことを確認します。

控えておく情報: インスタンスのパブリックIPアドレス

インスタンス一覧 → 作成したインスタンスをクリック → 「パブリック IPv4 アドレス」を確認してメモします。


④ 動作確認

Webブラウザで確認

ブラウザで以下のURLにアクセスします。

http://(パブリックIPアドレス)

以下のように表示されれば成功です。

Hello from Amazon Linux 2023!
Instance ID: i-0123456789abcdef0
Availability Zone: ap-northeast-1a

表示されない場合: UserDataのApacheインストールが完了するまで2〜3分かかります。少し待ってからリロードしてください。

SSHで接続して確認

ローカルPCのターミナル(VSCode CMD)で実行します。

ssh -i C:\Users\ユーザー名\.ssh\my-ec2-apache-key.pem ec2-user@(パブリックIPアドレス)

初回接続時に以下の確認が出ます。yes を入力します。

Are you sure you want to continue connecting (yes/no)? yes

接続成功するとAmazon Linux 2023のプロンプトが表示されます。以下で動作確認をします。

sudo systemctl status httpd

# Apacheが返しているHTMLファイルを確認
cat /var/www/html/index.html

# ApacheのドキュメントルートをApacheの設定ファイルで確認
cat /etc/httpd/conf/httpd.conf | grep DocumentRoot

# EC2から切断
exit

Apacheのディレクトリ構成:

パス役割
/var/www/html/Webコンテンツの置き場所(ドキュメントルート)
/etc/httpd/conf/httpd.confApacheのメイン設定ファイル
/var/log/httpd/access_logApacheアクセスログ
/var/log/httpd/error_logApacheエラーログ

【接続できない場合】IPアドレスが異なる可能性

curl で確認したIPを設定したが接続できない場合、実際の接続元IPが異なる可能性があります。

一時的に全開放して真のIPを確認する方法:

コンソール → EC2 → セキュリティグループ → my-ec2-apache-sg → 「インバウンドルールを編集」

SSHのルールを一時的に 0.0.0.0/0 に変更してSSH接続し、以下を実行します。

echo $SSH_CLIENT
# 出力例: 203.0.113.1 17508 22
# 先頭の値が真の接続元IP

このIPをメモしてSSH接続を切断し、セキュリティグループのSSHルールを 真のIP/32 に戻します。


⑤ リソースの削除

課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。

1. EC2インスタンスを終了する

EC2 → インスタンス → my-ec2-apache-instance を選択 → 「インスタンスの状態」→「インスタンスを終了」

確認ダイアログで「終了」をクリック。状態が「終了済み」になるまで待ちます(2〜5分)。

「停止」と「終了」の違い: 「停止」は一時停止(EBSストレージ課金は続く)。「終了」は完全削除(課金停止)。学習後は「終了」を選びます。

2. セキュリティグループを削除する

EC2 → セキュリティグループ → my-ec2-apache-sg を選択 → 「アクション」→「セキュリティグループを削除」

インスタンス終了が完了している必要があります。「使用中」エラーが出る場合はインスタンスが「終了済み」状態になるまで待ってください。

3. IAMロールを削除する

IAM → ロール → my-ec2-apache-role を選択 → 「削除」→ ロール名を入力して確認

4. キーペアを削除する(任意)

他のEC2でも使い回す場合は残してよいです。不要な場合は削除します。

EC2 → キーペア → my-ec2-apache-key を選択 → 「アクション」→「削除」→ 確認テキストを入力

ローカルの .pem ファイルも手動で削除します。

C:\Users\ユーザー名\.ssh\my-ec2-apache-key.pem

CloudFormation版との比較

コンソール版を体験したら、次は同じ構成を CloudFormation(コード)で再現してみましょう。何が自動化されるのかがよくわかります。

作業コンソール(手動)CloudFormation
IAMロール作成画面でポチポチ(5クリック以上)template.yaml に定義済み
セキュリティグループ作成画面でポチポチtemplate.yaml に定義済み
EC2起動(UserData含む)画面でポチポチtemplate.yaml に定義済み
デプロイ全体複数画面を行き来(15〜20分)コマンド1本(5分)
削除リソースを個別に依存関係順で手動削除delete-stack 1本
再現性低い(手動ミスのリスクがある)高い(同じ環境を何度でも再現可能)
バージョン管理不可Gitで管理可能

コンソール版で実感できたポイント:

  • キーペア・IAMロール・セキュリティグループ・EC2の依存関係が視覚的に理解できる
  • セキュリティグループのインバウンドルールを手動設定することで、ポートとCIDRの意味が身につく
  • UserData の仕組みを実際に設定することで、EC2の初期化フローが理解できる

CloudFormation版でも試してみる: AWS CloudFormationでEC2 + ApacheウェブサーバーをIaC化しよう


トラブルシューティング

症状原因対処
Webページが表示されない(起動直後)UserDataのApacheインストールが未完了2〜3分待ってからリロード
SSH接続タイムアウトセキュリティグループのIP設定誤り⓪のIP確認方法で真のIPを再確認
SSHエラー「WARNING: UNPROTECTED PRIVATE KEY FILE!」.pemファイルの権限が広すぎる(Linux/Mac)chmod 400 ~/.ssh/my-ec2-apache-key.pem を実行
セキュリティグループが削除できないEC2インスタンスがまだ使用中インスタンス「終了済み」状態になってから再試行
Apacheは起動しているのにページが見えないセキュリティグループのHTTP(80)設定ミスSGのインバウンドルールでHTTP:80が追加されているか確認

まとめ

今回のハンズオンで体験できたこと:

確認項目内容
キーペア作成SSH接続に必要な鍵ペアをコンソールで作成し、.pemファイルをローカルに保存
IAMロール作成AmazonSSMManagedInstanceCoreポリシーをEC2にアタッチして接続権限を付与
セキュリティグループSSH(22)/HTTP(80)を自分のIPのみに制限してEC2を保護
UserDataによる自動化Apacheのインストールと起動を初回起動時のスクリプトで自動化
Webサーバー確認ブラウザとSSHの両方でApache動作を確認
リソース削除依存関係順に4つのリソースを手動で削除

手動操作でひとつひとつ作ると、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は CloudFormation版 で同じ構成をコードで再現してみてください。


関連記事

-->

コメント