EC2でWebサーバーを立てるとはどういうことか
はじめに
「EC2でWebサーバーを立てる」というテーマは、AWS学習の初期段階からよく出てきます。でも、「立てる」が具体的に何をすることなのか、曖昧なまま進んでいませんか?
EC2でサーバーを立てるとは、AWS上に仮想的なコンピューターを作ることです。ただ、できあがるのはあくまで空のコンピューター。そこにWebサーバーソフトやアプリケーションを入れて初めて、Webサイトを動かせる「使えるサーバー」になります。
この記事では、EC2インスタンスを起動するとは何をしているのかを整理し、Webサーバーとして使えるようになるまでの流れを順に見ていきます。
EC2は「空っぽのコンピューター」を借りること
EC2インスタンスを起動するまでに、ざっくり以下のことを設定する必要があります。
- CPUを選ぶ
- メモリを選ぶ
- OSを選ぶ
- ディスクを付ける
- ネットワークにつなぐ
AWSの管理画面でポチポチ設定している裏側では、1台の仮想コンピューターを組み立てているわけです。
各設定項目にはEC2特有の用語がついています。対応を整理するとこうなります。
| EC2の用語 | ざっくり意味 |
|---|---|
| AMI | OS入りのテンプレート |
| インスタンスタイプ | CPU・メモリのスペック |
| EBS | ディスク |
| キーペア | ログイン用の鍵 |
| セキュリティグループ | ファイアウォール |
| パブリックIP | 外からアクセスするための住所 |
物理的なコンピューターを買うときにスペックを決めるのと同じことを、クラウド上で設定ベースでやっているイメージです。
EC2を起動しただけでは「使えるサーバー」ではない
ここはけっこう大事なポイントな気がします。
「EC2を起動した=サーバー完成」と思いがちですが、実際はまだ電源を入れただけの状態に近い。たとえばAmazon LinuxやUbuntuのEC2を起動しても、最初はWebサイトは表示されません。
なぜなら、次の状態だからです。
- Webサーバーソフトが入っていない
- アプリケーションも動いていない
- 必要なポートが開いていない
- ドメインも紐づいていない
EC2を起動することは、サーバーの「箱」を用意すること。その箱の中にNginxやApache、なんらかのアプリケーションを入れて初めて、Webサーバーとして使えるようになります。
SSH接続は「サーバーの中に入る」こと
EC2を作ったあと、中に入って操作するにはSSHで接続します。SSH接続をすると手元のPCからクラウド上のEC2にログインして、コマンドで操作できるようになります。
なぜパスワードではなく秘密鍵を使うのか
SSHでは通常、パスワードではなく秘密鍵(キーペア)を使って認証します。パスワードは推測や総当たりで突破されるリスクがありますが、秘密鍵は非常に長い暗号データなので、事実上推測できない、とかなんとか。
EC2作成時にダウンロードする .pem ファイルが秘密鍵です。接続コマンドはこうなる。
ssh -i my-key.pem [email protected]
-i my-key.pemは「この秘密鍵を使って認証する」という意味ec2-userはAmazon Linuxのデフォルトユーザー名203.0.113.10はEC2のパブリックIP
SSHで接続できないときに確認すべきポイントは主に2つあります。セキュリティグループで22番ポート(SSHが使うポート)が開いているか、そして秘密鍵ファイルの権限が適切か(chmod 400されているか)です。
Webサーバーを入れると「ブラウザで見られるサーバー」になる
EC2にWebサーバーソフトをインストールして起動すると、ブラウザからアクセスできるようになります。
仕組みを理解するために、手動でインストールする流れを見てみましょう。
- EC2にSSH接続する
- NginxまたはApacheをインストールする
- サービスを起動する
- セキュリティグループでHTTP(80番ポート)を許可する
- ブラウザからパブリックIPにアクセスする
実運用では、Webサーバーソフトをあらかじめ含めたカスタムAMIを作っておき、それを使ってEC2を起動するケースが多いと思います。毎回SSHで手動インストールするのではなく、「すでにWebサーバーが入った状態」のテンプレートから起動するイメージです。
ここで重要なのは、EC2そのものがWebページを返しているのではないという点です。EC2の中で動いているNginxやApacheが、HTTPリクエストを受け取り、HTMLなどのレスポンスを返している。EC2はあくまで、そのWebサーバーソフトが動く場所を提供しているに過ぎません。
セキュリティグループは「通信のドア」
EC2はネットワークにつながっていますが、何でも自由に出入りできるわけではありません。セキュリティグループで、どの通信を許可するかを決めます。
| ポート | 用途 | 許可する相手 |
|---|---|---|
| 22 | SSH | 自分のIPだけ |
| 80 | HTTP | 全世界(0.0.0.0/0) |
| 443 | HTTPS | 全世界(0.0.0.0/0) |
サーバーを公開するとは、必要な通信だけを外部から受け付けるようにすることでもある。
「Webサイトは全世界に見せたいが、SSHは自分だけがアクセスできるようにする」というのが典型的な設定です。SSHを全世界(0.0.0.0/0)に開けてしまうと、世界中から不正ログインを試みられるリスクがある。AWSの公式ドキュメントでも、SSHのインバウンドルールのソースIPには自分のコンピュータのパブリックIPアドレスなどのみを指定する例が示されています。要するに、自宅や会社の回線のグローバルIPだけを許可しておく、ということです。
パブリックIPは「インターネット上の住所」
ブラウザからEC2にアクセスするには、アクセス先の住所が必要になります。それがパブリックIPやパブリックDNSです。
EC2には2種類のIPアドレスがあります。
- プライベートIP: VPC内で使う住所。同じネットワーク内の通信に使う
- パブリックIP: インターネットからアクセスするための住所
ただし、通常のパブリックIPはEC2を停止・起動すると変わることがあります。これは、AWSがパブリックIPアドレスをプールから動的に割り当てているためで、インスタンスを停止するとIPはプールに返却され、次に起動したときには別のIPが割り当てられる可能性があります。ちなみにElasticIPを使えばIPは固定できます。
ドメイン名でアクセスできるようにしたい場合は、Route 53などのDNSサービスでドメインとIPアドレスを紐づけます。
全体像を整理する
EC2上のWebサーバーがリクエストを受けてレスポンスを返すまでの流れはこうなります。
ユーザーのブラウザ
↓ HTTP / HTTPS
↓ セキュリティグループの設定で許可されたトラフィックだけが届く
EC2インスタンス
↓
Webサーバーソフト(Nginx / Apache)
↓
HTMLやアプリの画面を返す
セキュリティグループはEC2インスタンスに関連付けられた仮想ファイアウォールのことです。従来のファイアウォールは、ネットワーク経路上に置く専用のハードウェア機器か、OS上で動くソフトウェア(Linuxのiptablesなど)として存在していました。いずれも「どこで動いているか」が明確です。セキュリティグループの場合はそういった実体はなく(AWSが管理しているハードウェア機器とかはもちろんあると思いますが)、AWSが「セキュリティグループのルールで許可されたトラフィックだけがインスタンスに届く」ようにしています。
先ほどの手動インストールの例のように、SSHでEC2に入って操作する流れはこうなります。
自分のPC
↓ SSH
EC2インスタンス
↓ コマンド操作
ソフトウェアのインストール・設定
EC2を立てたあとに考えること
EC2を起動してWebサーバーを動かせたら完了、と言いたいところですが、実務ではそこで終わりではありません。運用するうえで考えることはまだあります。
- セキュリティ設定: 不要なポートを閉じる、SSHアクセスを制限する
- HTTPS化: SSL/TLS証明書を導入して通信を暗号化する
- ドメイン設定: IPアドレスではなくドメイン名でアクセスできるようにする
- 監視: サーバーが落ちていないか、リソースが逼迫していないかを把握する
- バックアップ: EBSスナップショットなどでデータを保護する
- 料金管理: 使わないインスタンスを停止する、インスタンスタイプを見直す
これらの話題はそれぞれ深掘りすると長くなりますが、「サーバーを立てた先にはこういうことがある」と知っておくだけでも、全体像の解像度は上がります。
まとめ
EC2でWebサーバーを立てるとは、以下の一連の流れのことです。
- EC2インスタンスを起動して、仮想コンピューターを用意する
- SSHで接続して、中に入れるようにする
- Webサーバーソフトをインストールして、HTTPリクエストを受け取れるようにする
- セキュリティグループで必要なポートを開ける
- パブリックIPを通じて、外部からアクセスできるようにする
「Webサーバーを立てる」という一言の裏には、これだけのステップがあります。各ステップが何をしているのかを意識すると、トラブルが起きたときに原因を切り分けやすくなるし、次のステップ(HTTPS化、ドメイン設定、監視など)にも進みやすくなる。私もまずは1台立てて、それぞれのステップの意味を確かめながら進んでいきたいです。