はじめに
「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を制限できる |
| UserData | EC2の初回起動時のみ自動実行されるシェルスクリプト。今回はApacheのインストールに使う |
| IAMロール | EC2にAWSサービスを利用する権限を付与する仕組み。今回はSession Manager接続に使う |
| キーペア | SSHでEC2に接続するための鍵ペア(公開鍵+秘密鍵) |
使用するAWSサービス
| サービス | 役割 | 料金 |
|---|---|---|
| EC2 | Apacheが動作するWebサーバー本体(t2.micro) | 月750時間まで無料枠あり |
| セキュリティグループ | SSH/HTTPのアクセス制御 | 無料 |
| IAM | EC2へのSession Manager接続権限 | 無料 |
| EBS | EC2にアタッチされるストレージ(デフォルト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: ルーター管理画面で確認(推奨)
- ブラウザで以下のURLにアクセスします(ルーターによって異なります)
http://192.168.0.1 または http://192.168.1.1 - 「ネットワークマップ」または「インターネット」項目を開く
- **「インターネット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 -y | OSのパッケージを最新化する |
yum install -y httpd | Apache(httpd)をインストールする |
systemctl start httpd | Apacheを起動する |
systemctl enable httpd | OS起動時にApacheが自動起動するよう設定する |
echo "..." > /var/www/html/index.html | Apacheが返すテスト用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から切断
exitApacheのディレクトリ構成:
| パス | 役割 |
|---|---|
/var/www/html/ | Webコンテンツの置き場所(ドキュメントルート) |
/etc/httpd/conf/httpd.conf | Apacheのメイン設定ファイル |
/var/log/httpd/access_log | Apacheアクセスログ |
/var/log/httpd/error_log | Apacheエラーログ |
【接続できない場合】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.pemCloudFormation版との比較
コンソール版を体験したら、次は同じ構成を 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版 で同じ構成をコードで再現してみてください。
関連記事
-->
コメント