はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- あると良いEC2 インスタンスを一度起動したことがある(起動の流れがわかっていると、今回は「ユーザーデータ」の部分に集中できます)
- あると良い「Web サーバー」「ポート 80」「HTTP」という言葉をなんとなく聞いたことがある
- あると良いシェルスクリプト(
#!/bin/bashで始まる数行)を見たことがある(中身は本文で説明します)
※ このハンズオンは すべてコンソールだけで完結します。ユーザーデータのスクリプトは入力欄に貼り付けるだけで、自分でコマンドを打つ必要はありません。最後にサーバーへ ssh で入って中身を確かめる手順は 任意です。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
Web サーバーを 1 台用意したいとき、ふつうはサーバーを起動し、ログインして、ソフト(Apache など)をインストールし、起動して……という作業を順番に手で行います。1 台ならまだしも、同じ構成を何台も作るとなると、毎回まったく同じ手作業を繰り返すことになり、抜け漏れも起きやすくなります。
そこで役立つのが、EC2 の ユーザーデータです。インスタンスを起動するときにスクリプトを渡しておくと、AWS 側が 初回起動のタイミングで自動的にそのスクリプトを実行してくれます。つまり「起動したらすでに Web サーバーが動いている」という状態を、最初から作っておけるわけです。
サーバーにログインしないのに、どうやって Web サーバーを動かすの?
ログインの代わりに、起動時に走らせたい作業を あらかじめスクリプトとして渡しておくのがユーザーデータです。サーバーは起動の途中でそのスクリプトを自分で実行するので、人が手で入って作業する必要がありません。
なぜ「初回だけ」なの?
ユーザーデータは そのインスタンスが初めて起動したとき 1 回だけ実行されるのが既定の動きです。再起動のたびに毎回インストールが走ると無駄なので、「最初のセットアップに使う」と考えるとしっくりきます。
ユーザーデータ付きで EC2 を起動し、サーバーにログインせずに、ブラウザでそのサーバーのパブリック IP アドレスにアクセスすると、自分で用意した Web ページが表示される状態にする。
つくる構成
パブリックサブネットの中に EC2 を 1 台置き、パブリック IP アドレスを付けます。ブラウザからは、セキュリティグループで許可した HTTP(ポート 80)を通ってサーバーへアクセスします。サーバー上の Apache は、起動時にユーザーデータが自動でインストール・起動しています。
※ 図はデフォルト VPC を使う場合の例です。自分で作ったパブリックサブネットでも構いません。
ユーザーデータが起動時にやってくれること(自動)
- インスタンスが 初回起動し、OS(Amazon Linux 2023)が立ち上がる
- 起動の途中で、渡しておいた ユーザーデータのスクリプトが自動実行される
- Apache(
httpd)を インストールする - Apache を 起動し、次回以降も自動で立ち上がるよう 有効化する
- 表示用の Web ページ(index.html)を配置する → ブラウザでアクセス可能になる
要件
以下の要件を満たす EC2 インスタンスを起動し、ブラウザで表示を確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | EC2 インスタンスを 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 ページが表示されることを確認する。 |
構築の進め方
下のステップは「どの順で進めると迷いにくいか」の道しるべです。今回の山場は ステップ 5 のユーザーデータです。各ステップで「なぜそうするのか」を意識しながら進めましょう。
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインします。画面右上のリージョン名をクリックして、「アジアパシフィック(東京)ap-northeast-1」になっていることを確認してください。
リージョンを最初に決める理由EC2 インスタンスは、作成したリージョンにしか表示されません。途中で「作ったはずのものが見つからない」を防ぐため、最初にそろえておきましょう。
-
「インスタンスを起動」を開き、名前と AMI を選ぶ
画面上部の検索バーに
EC2と入力して EC2 コンソールを開き、「インスタンス」→「インスタンスを起動」を押します。名前にweb-serverと入力し、AMI(もとになる OS イメージ)で Amazon Linux 2023(最新版・無料利用枠の対象と表示されるもの)を選びます。AMI のバージョンを意識するこのハンズオンのユーザーデータは、Amazon Linux 2023 で動く書き方(
dnfコマンド)にしています。古い世代の AMI ではパッケージ管理コマンドが異なる場合があるため、最新の Amazon Linux 2023 を選んでおくと迷いません。 -
インスタンスタイプとキーペアを選ぶ
インスタンスタイプは、無料利用枠の対象と表示されるもの(例:
t2.microまたはt3.micro)を選びます。キーペアは、ブラウザでの表示確認だけなら「キーペアなしで続行」でも構いません。あとでsshで中を確かめたい場合は、キーペアを 1 つ作成(または既存のものを選択)しておきます。キーペアは必須ではない今回のゴールは「ブラウザで表示されること」なので、サーバーにログインしなくても達成できます。ログインして中を確認したい人向けに、キーペアは任意で用意する、という位置づけです。
-
ネットワークとセキュリティグループを設定する
「ネットワーク設定」で次のようにします。デフォルト VPC を使う場合は、ほとんど初期値のままで条件を満たせます。
サブネット パブリックサブネット(指定しなければデフォルト VPC のものが使われます) パブリック IP の自動割り当て 有効 セキュリティグループ 新規作成。「HTTP(ポート 80)」を許可し、ソースは 0.0.0.0/0(Anywhere)にする。
※ SSH で確認したい場合のみ、「SSH(22)」をソース「マイ IP」で追加なぜ HTTP は誰でも可で、SSH はマイ IP に絞るの?HTTP(80)は「Web サイトを誰でも見られるようにする入口」なので、広く開けるのが目的どおりです。一方 SSH(22)は「サーバーの中に入るための入口」なので、自分以外に開ける必要はありません。入口は、その役割に必要な範囲だけ開けると考えると整理できます。
-
「高度な詳細」を開き、ユーザーデータを貼り付ける
設定画面のいちばん下にある「高度な詳細」を展開し、「ユーザーデータ」の入力欄に、次のスクリプトを貼り付けます。これが「起動時に自動で走る作業」の中身です。
#!/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は「これはシェルスクリプトです」という宣言で、必ず先頭に入れるのがポイントです。 -
内容を確認して起動する
右側の「概要」で、台数が 1、AMI が Amazon Linux 2023、タイプが無料利用枠であることを確認し、「インスタンスを起動」を押します。「インスタンス」一覧に戻り、状態が 「実行中(Running)」、そしてステータスチェックが完了になるまで待ちます。
表示できるまで少し待つ「実行中」になってからも、ユーザーデータが Apache をインストール・起動し終えるまで 1〜2 分ほどかかります。すぐにブラウザで開いて表示されなくても、少し待ってから再読み込みしてみましょう。
-
パブリック IP を確認し、ブラウザでアクセスする
一覧で
web-serverを選び、詳細画面の「パブリック IPv4 アドレス」を確認します(例:203.0.113.25)。ブラウザのアドレス欄にhttp://203.0.113.25のように入力してアクセスすると、ユーザーデータで配置したページ(例:「Hello from EC2!」)が表示されます。必ず http:// で開く今回は HTTP(暗号化なし)の構成です。
https://で開こうとすると、ポート 443 を許可していないためつながりません。http://で開くこと、また詳細画面の「パブリック IPv4 アドレス」の 「オープンアドレス」リンクから開くと確実です。 -
(任意)SSH で入って Apache の状態を確かめる
キーペアを用意した人は、
sshで接続してサーバーの中を確認できます。systemctl status httpdで Apache がactive (running)になっていれば、ユーザーデータが正しく動いた証拠です。$ ssh -i my-key.pem ec2-user@203.0.113.25 # Apache が動いているか確認する $ systemctl status httpd # active (running) と表示されれば成功
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「http でアクセスしても、読み込み中のまま/タイムアウトになる」
通信が「届いていない」ときの典型です。①セキュリティグループのインバウンドにポート 80(HTTP)の許可があるか(SSH の 22 だけ開けて HTTP を忘れていないか)、②アクセス先がパブリック IP アドレスで、http://(https:// ではない)で開いているか、③インスタンスが「実行中」で、起動から数分が経っているか(ユーザーデータの完了前は表示されません)を順に見直してみましょう。
「サーバーは起動したのに、Apache が動いていない/ページが空」
スクリプトが意図どおり走らなかった可能性があります。①ユーザーデータの 1 行目が #!/bin/bash になっているか(これが無いとスクリプトとして扱われません)、②起動後にユーザーデータを書き換えていないか(ユーザーデータは初回起動時に 1 回だけ実行されるため、あとから直しても自動では反映されません)を確認しましょう。直したい場合は、新しく起動し直すのが確実です。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザを開いて、次を順に確かめましょう。
- 画面右上のリージョン表示が 「東京 / ap-northeast-1」になっている。
- 「インスタンス」一覧に
web-serverがあり、インスタンスの状態が 「実行中(Running)」、ステータスチェックが完了になっている。 - そのインスタンスの詳細に「パブリック IPv4 アドレス」が表示されている。
- セキュリティグループのインバウンドルールに、ポート 80(HTTP)・ソース
0.0.0.0/0の行がある。 - ブラウザで
http://<パブリック IP>を開くと、ユーザーデータで配置したページが表示される。 - (任意)SSH 接続後、
systemctl status httpdがactive (running)になっている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- 同じセキュリティグループでも、HTTP(80)は
0.0.0.0/0(誰でも可)にし、SSH(22)は「マイ IP」に絞りました。この開け方の違いは、それぞれの入口の「役割」とどう関係しているでしょうか。ヒント
HTTP は「世界中の人に Web サイトを見てもらう」ための入口、SSH は「自分がサーバーの中に入って作業する」ための入口です。それぞれ「誰に開いている必要があるか」を考えると、絞る/開けるの判断がつきます。 - ユーザーデータは「初回起動時に 1 回だけ」実行されます。起動後にスクリプトを書き換えても自動では反映されないとき、新しい内容を反映させるにはどんな方法が考えられるでしょうか。
ヒント
「もう一度初回起動の状態を作る」と考えると糸口が見えます。たとえば新しいインスタンスを起動し直す方法のほか、すでに動いているサーバーに入って手で同じ作業をする方法もあります。それぞれの手間と確実さを比べてみましょう。 - もし同じ Web サーバーを 10 台用意するとしたら、「1 台ずつログインして手で Apache を入れる」やり方と、「ユーザーデータで自動化する」やり方では、どんな差が出るでしょうか。台数が増えるほど効いてくる違いを考えてみましょう。
ヒント
手作業は台数に比例して時間がかかり、台ごとに設定のばらつき(入れ忘れ・打ち間違い)も生まれやすくなります。自動化は「同じ手順をそのまま何台にも適用できる」点が強みです。再現性・速さ・ミスの起きにくさといった観点で比べてみましょう。
後片づけ
作ったものを片づけるところまでが一連の流れです。EC2 インスタンスは起動している間ずっと料金が発生する(無料利用枠を超えた場合)ため、使い終わったら必ず片づけましょう。
- インスタンスを終了する:EC2 コンソールの「インスタンス」で
web-serverを選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選ぶ。状態が「終了済み(Terminated)」になれば、このサーバーの料金は止まります。 - セキュリティグループを削除する(任意):このハンズオン用に新しく作ったセキュリティグループは、インスタンスを終了したあとに削除できます(他で使っていないことを確認してから)。
- キーペアを削除する(任意):確認用にキーペアを作った場合、もう使わないなら左メニュー「キーペア」から削除できます。手元の
.pemファイルも不要なら消してかまいません。
残しておくなら「停止」、片づけるなら「終了」
「停止(Stop)」はあとで再開できますが、インスタンスに付いているディスク(EBS ボリューム)は残り、そのぶんの料金は発生し続けます。学習を終えてもう使わないなら、「終了(Terminate)」でサーバーごと消すのが確実です。デフォルト VPC やデフォルトのサブネットは消さないようにしましょう。
コストに関する注意: EC2 インスタンスは起動している間、課金されます。ただし新規アカウントには無料利用枠があり、t2.micro または t3.micro などの対象インスタンスを月あたり一定時間(一般的に 750 時間/月・12 か月間)まで無料で使えます。対象タイプを 1 台だけ動かす今回の範囲なら、無料利用枠に収まることが多いですが、消し忘れると枠を超えて課金されるので注意してください。インスタンスに付くディスク(EBS ボリューム)にも料金がかかります。今回は Elastic IP を使っていないため、終了すれば残りません。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。使い終えたら、上の「後片づけ」で必ずインスタンスを終了しておきましょう。