← ハンズオン一覧に戻る

AWS Hands-on / Compute

起動と同時に Web サーバーが動くサーバーを作る

EC2 を起動するときに「ユーザーデータ」へ数行のスクリプトを書いておくだけで、起動した瞬間から Web サーバー(Apache)が動いているサーバーを作れます。サーバーにログインして手で何かを入れることなく、ブラウザでアクセスすると自分のページが表示される——その状態を体験します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜50 分 すべてコンソールで完結(接続確認は任意)
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • あると良いEC2 インスタンスを一度起動したことがある(起動の流れがわかっていると、今回は「ユーザーデータ」の部分に集中できます)
  • あると良い「Web サーバー」「ポート 80」「HTTP」という言葉をなんとなく聞いたことがある
  • あると良いシェルスクリプト(#!/bin/bash で始まる数行)を見たことがある(中身は本文で説明します)

※ このハンズオンは すべてコンソールだけで完結します。ユーザーデータのスクリプトは入力欄に貼り付けるだけで、自分でコマンドを打つ必要はありません。最後にサーバーへ ssh で入って中身を確かめる手順は 任意です。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

Web サーバーを 1 台用意したいとき、ふつうはサーバーを起動し、ログインして、ソフト(Apache など)をインストールし、起動して……という作業を順番に手で行います。1 台ならまだしも、同じ構成を何台も作るとなると、毎回まったく同じ手作業を繰り返すことになり、抜け漏れも起きやすくなります。

そこで役立つのが、EC2 の ユーザーデータです。インスタンスを起動するときにスクリプトを渡しておくと、AWS 側が 初回起動のタイミングで自動的にそのスクリプトを実行してくれます。つまり「起動したらすでに Web サーバーが動いている」という状態を、最初から作っておけるわけです。

サーバーにログインしないのに、どうやって Web サーバーを動かすの?

ログインの代わりに、起動時に走らせたい作業を あらかじめスクリプトとして渡しておくのがユーザーデータです。サーバーは起動の途中でそのスクリプトを自分で実行するので、人が手で入って作業する必要がありません。

なぜ「初回だけ」なの?

ユーザーデータは そのインスタンスが初めて起動したとき 1 回だけ実行されるのが既定の動きです。再起動のたびに毎回インストールが走ると無駄なので、「最初のセットアップに使う」と考えるとしっくりきます。

Goal

ユーザーデータ付きで EC2 を起動し、サーバーにログインせずに、ブラウザでそのサーバーのパブリック IP アドレスにアクセスすると、自分で用意した Web ページが表示される状態にする。

04 — Architecture

つくる構成

パブリックサブネットの中に EC2 を 1 台置き、パブリック IP アドレスを付けます。ブラウザからは、セキュリティグループで許可した HTTP(ポート 80)を通ってサーバーへアクセスします。サーバー上の Apache は、起動時にユーザーデータが自動でインストール・起動しています。

あなたのブラウザ
aws AWS Cloud
Region : ap-northeast-1(東京)
VPC(デフォルト VPC でも可)
インターネットゲートウェイ(インターネットへの出入口)
パブリックサブネット(インターネットに出られる区画)
EC2 インスタンス
Amazon Linux 2023 / 無料利用枠タイプ
Apache(httpd)が起動時に自動で稼働 パブリック IP : 起動時に付与 セキュリティグループ:HTTP(80)を許可
ブラウザでページが表示されるかは「パブリック IP があるか」「セキュリティグループで HTTP(80)を許可しているか」「ユーザーデータで Apache が起動しているか」で決まります。
※ 図はデフォルト VPC を使う場合の例です。自分で作ったパブリックサブネットでも構いません。

ユーザーデータが起動時にやってくれること(自動)

  1. インスタンスが 初回起動し、OS(Amazon Linux 2023)が立ち上がる
  2. 起動の途中で、渡しておいた ユーザーデータのスクリプトが自動実行される
  3. Apache(httpd)を インストールする
  4. Apache を 起動し、次回以降も自動で立ち上がるよう 有効化する
  5. 表示用の Web ページ(index.html)を配置する → ブラウザでアクセス可能になる
05 — Requirements

要件

以下の要件を満たす EC2 インスタンスを起動し、ブラウザで表示を確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2EC2 インスタンスを 1 台起動する。AMI は Amazon Linux 2023(最新版でよい)、インスタンスタイプは無料利用枠の対象(例:t2.micro または t3.micro)とする。名前タグは web-server(例)。
3インスタンスはパブリックサブネットに置き、パブリック IP アドレスが割り当てられるようにする(最初からある「デフォルト VPC」を使うと、この条件は自動的に満たせます)。
4ユーザーデータにスクリプトを設定し、起動時に Apache(httpd)をインストール・起動・自動起動の有効化まで行い、簡単な Web ページ(index.html)を配置する。
5セキュリティグループで HTTP(ポート 80)を許可する。Web サイトは誰でも見られるようにしたいので、ソースは 0.0.0.0/0(どこからでも)でよい。(SSH で中を確認したい場合のみ、ポート 22 を「マイ IP」に絞って追加する)
6ブラウザで http://<パブリック IP アドレス> にアクセスし、用意した Web ページが表示されることを確認する。
06 — Steps

構築の進め方

下のステップは「どの順で進めると迷いにくいか」の道しるべです。今回の山場は ステップ 5 のユーザーデータです。各ステップで「なぜそうするのか」を意識しながら進めましょう。

  1. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインします。画面右上のリージョン名をクリックして、「アジアパシフィック(東京)ap-northeast-1」になっていることを確認してください。

    リージョンを最初に決める理由

    EC2 インスタンスは、作成したリージョンにしか表示されません。途中で「作ったはずのものが見つからない」を防ぐため、最初にそろえておきましょう。

  2. 「インスタンスを起動」を開き、名前と AMI を選ぶ

    画面上部の検索バーに EC2 と入力して EC2 コンソールを開き、「インスタンス」→「インスタンスを起動」を押します。名前web-server と入力し、AMI(もとになる OS イメージ)Amazon Linux 2023(最新版・無料利用枠の対象と表示されるもの)を選びます。

    AMI のバージョンを意識する

    このハンズオンのユーザーデータは、Amazon Linux 2023 で動く書き方(dnf コマンド)にしています。古い世代の AMI ではパッケージ管理コマンドが異なる場合があるため、最新の Amazon Linux 2023 を選んでおくと迷いません。

  3. インスタンスタイプとキーペアを選ぶ

    インスタンスタイプは、無料利用枠の対象と表示されるもの(例:t2.micro または t3.micro)を選びます。キーペアは、ブラウザでの表示確認だけなら「キーペアなしで続行」でも構いません。あとで ssh で中を確かめたい場合は、キーペアを 1 つ作成(または既存のものを選択)しておきます。

    キーペアは必須ではない

    今回のゴールは「ブラウザで表示されること」なので、サーバーにログインしなくても達成できます。ログインして中を確認したい人向けに、キーペアは任意で用意する、という位置づけです。

  4. ネットワークとセキュリティグループを設定する

    「ネットワーク設定」で次のようにします。デフォルト VPC を使う場合は、ほとんど初期値のままで条件を満たせます。

    サブネットパブリックサブネット(指定しなければデフォルト VPC のものが使われます)
    パブリック IP の自動割り当て有効
    セキュリティグループ新規作成。「HTTP(ポート 80)」を許可し、ソースは 0.0.0.0/0(Anywhere)にする。
    ※ SSH で確認したい場合のみ、「SSH(22)」をソース「マイ IP」で追加
    なぜ HTTP は誰でも可で、SSH はマイ IP に絞るの?

    HTTP(80)は「Web サイトを誰でも見られるようにする入口」なので、広く開けるのが目的どおりです。一方 SSH(22)は「サーバーの中に入るための入口」なので、自分以外に開ける必要はありません。入口は、その役割に必要な範囲だけ開けると考えると整理できます。

  5. 「高度な詳細」を開き、ユーザーデータを貼り付ける

    設定画面のいちばん下にある「高度な詳細」を展開し、「ユーザーデータ」の入力欄に、次のスクリプトを貼り付けます。これが「起動時に自動で走る作業」の中身です。

    ユーザーデータ(このまま貼り付け)
    #!/bin/bash
    # Apache(httpd)をインストールする
    dnf install -y httpd
    # Apache を起動し、次回以降の起動でも自動で立ち上がるようにする
    systemctl enable --now httpd
    # 表示用のページを用意する($(hostname -f) はサーバー自身の名前に置き換わる)
    echo "<h1>Hello from EC2!</h1><p>server: $(hostname -f)</p>" > /var/www/html/index.html
    どうして sudo を付けないの?

    ユーザーデータは 管理者(root)権限で実行されるため、sudo を付けなくてもインストールや起動ができます。1 行目の #!/bin/bash は「これはシェルスクリプトです」という宣言で、必ず先頭に入れるのがポイントです。

  6. 内容を確認して起動する

    右側の「概要」で、台数が 1、AMI が Amazon Linux 2023、タイプが無料利用枠であることを確認し、「インスタンスを起動」を押します。「インスタンス」一覧に戻り、状態が 「実行中(Running)」、そしてステータスチェックが完了になるまで待ちます。

    表示できるまで少し待つ

    「実行中」になってからも、ユーザーデータが Apache をインストール・起動し終えるまで 1〜2 分ほどかかります。すぐにブラウザで開いて表示されなくても、少し待ってから再読み込みしてみましょう。

  7. パブリック IP を確認し、ブラウザでアクセスする

    一覧で web-server を選び、詳細画面の「パブリック IPv4 アドレス」を確認します(例:203.0.113.25)。ブラウザのアドレス欄に http://203.0.113.25 のように入力してアクセスすると、ユーザーデータで配置したページ(例:「Hello from EC2!」)が表示されます。

    必ず http:// で開く

    今回は HTTP(暗号化なし)の構成です。https:// で開こうとすると、ポート 443 を許可していないためつながりません。http:// で開くこと、また詳細画面の「パブリック IPv4 アドレス」の 「オープンアドレス」リンクから開くと確実です。

  8. (任意)SSH で入って Apache の状態を確かめる

    キーペアを用意した人は、ssh で接続してサーバーの中を確認できます。systemctl status httpd で Apache が active (running) になっていれば、ユーザーデータが正しく動いた証拠です。

    terminal — あなたのパソコン(任意)
    $ ssh -i my-key.pem ec2-user@203.0.113.25
    
    # Apache が動いているか確認する
    $ systemctl status httpd
    # active (running) と表示されれば成功
07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — ブラウザでページが表示されない/つながらない

「http でアクセスしても、読み込み中のまま/タイムアウトになる」

通信が「届いていない」ときの典型です。①セキュリティグループのインバウンドにポート 80(HTTP)の許可があるか(SSH の 22 だけ開けて HTTP を忘れていないか)、②アクセス先がパブリック IP アドレスで、http://https:// ではない)で開いているか③インスタンスが「実行中」で、起動から数分が経っているか(ユーザーデータの完了前は表示されません)を順に見直してみましょう。

Pitfall 02 — ユーザーデータが効いていないように見える

「サーバーは起動したのに、Apache が動いていない/ページが空」

スクリプトが意図どおり走らなかった可能性があります。①ユーザーデータの 1 行目が #!/bin/bash になっているか(これが無いとスクリプトとして扱われません)、②起動後にユーザーデータを書き換えていないか(ユーザーデータは初回起動時に 1 回だけ実行されるため、あとから直しても自動では反映されません)を確認しましょう。直したい場合は、新しく起動し直すのが確実です。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザを開いて、次を順に確かめましょう。

  • 画面右上のリージョン表示が 「東京 / ap-northeast-1」になっている。
  • 「インスタンス」一覧に web-server があり、インスタンスの状態「実行中(Running)」、ステータスチェックが完了になっている。
  • そのインスタンスの詳細に「パブリック IPv4 アドレス」が表示されている。
  • セキュリティグループのインバウンドルールに、ポート 80(HTTP)・ソース 0.0.0.0/0 の行がある。
  • ブラウザで http://<パブリック IP> を開くと、ユーザーデータで配置したページが表示される
  • (任意)SSH 接続後、systemctl status httpdactive (running) になっている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. 同じセキュリティグループでも、HTTP(80)は 0.0.0.0/0(誰でも可)にし、SSH(22)は「マイ IP」に絞りました。この開け方の違いは、それぞれの入口の「役割」とどう関係しているでしょうか。
    ヒント
    HTTP は「世界中の人に Web サイトを見てもらう」ための入口、SSH は「自分がサーバーの中に入って作業する」ための入口です。それぞれ「誰に開いている必要があるか」を考えると、絞る/開けるの判断がつきます。
  2. ユーザーデータは「初回起動時に 1 回だけ」実行されます。起動後にスクリプトを書き換えても自動では反映されないとき、新しい内容を反映させるにはどんな方法が考えられるでしょうか。
    ヒント
    「もう一度初回起動の状態を作る」と考えると糸口が見えます。たとえば新しいインスタンスを起動し直す方法のほか、すでに動いているサーバーに入って手で同じ作業をする方法もあります。それぞれの手間と確実さを比べてみましょう。
  3. もし同じ Web サーバーを 10 台用意するとしたら、「1 台ずつログインして手で Apache を入れる」やり方と、「ユーザーデータで自動化する」やり方では、どんな差が出るでしょうか。台数が増えるほど効いてくる違いを考えてみましょう。
    ヒント
    手作業は台数に比例して時間がかかり、台ごとに設定のばらつき(入れ忘れ・打ち間違い)も生まれやすくなります。自動化は「同じ手順をそのまま何台にも適用できる」点が強みです。再現性・速さ・ミスの起きにくさといった観点で比べてみましょう。
10 — Clean up

後片づけ

作ったものを片づけるところまでが一連の流れです。EC2 インスタンスは起動している間ずっと料金が発生する(無料利用枠を超えた場合)ため、使い終わったら必ず片づけましょう。

  1. インスタンスを終了する:EC2 コンソールの「インスタンス」で web-server を選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選ぶ。状態が「終了済み(Terminated)」になれば、このサーバーの料金は止まります。
  2. セキュリティグループを削除する(任意):このハンズオン用に新しく作ったセキュリティグループは、インスタンスを終了したあとに削除できます(他で使っていないことを確認してから)。
  3. キーペアを削除する(任意):確認用にキーペアを作った場合、もう使わないなら左メニュー「キーペア」から削除できます。手元の .pem ファイルも不要なら消してかまいません。
Caution — 「停止」だけでは料金が完全には止まらない

残しておくなら「停止」、片づけるなら「終了」

「停止(Stop)」はあとで再開できますが、インスタンスに付いているディスク(EBS ボリューム)は残り、そのぶんの料金は発生し続けます。学習を終えてもう使わないなら、「終了(Terminate)」でサーバーごと消すのが確実です。デフォルト VPC やデフォルトのサブネットは消さないようにしましょう。

コストに関する注意: EC2 インスタンスは起動している間、課金されます。ただし新規アカウントには無料利用枠があり、t2.micro または t3.micro などの対象インスタンスを月あたり一定時間(一般的に 750 時間/月・12 か月間)まで無料で使えます。対象タイプを 1 台だけ動かす今回の範囲なら、無料利用枠に収まることが多いですが、消し忘れると枠を超えて課金されるので注意してください。インスタンスに付くディスク(EBS ボリューム)にも料金がかかります。今回は Elastic IP を使っていないため、終了すれば残りません。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。使い終えたら、上の「後片づけ」で必ずインスタンスを終了しておきましょう。