Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得】セクション4: 【EC2】Webサーバーを構築しようで知らなかったことをざっくりまとめてみた

目次

概要

ネットワークの中にWebサーバーを構築しようと思います。 AWSのEC2を使ってEC2インスタンス(仮想サーバー)をネットワーク上に作成します。その後、EC2インスタンスSSHでログインしてApache(Webサーバーのソフトウェア)をインストールします。Apacheをインストールすることで、サーバーがWebサーバーとして機能するようになります。

EC2(Elastic Compute Cloud)とは

EC2とは、AWS上に仮想サーバーを作るためのサービスです。 EC2で作成した仮想サーバーをEC2インスタンスと呼びます。

EC2インスタンスの3つの特徴

  1. 数分で起動し、1時間または秒単位の従量課金
  2. サーバーの追加・削除、マシンスペック変更も数分で可能
  3. OSより上のレイヤについては自由に設定できる

EC2インスタンスを作成するときに、AMIの選択、インスタンスタイプの選択、ストレージの追加をする必要があるので、AMI、インスタンスタイプ、ストレージを以下で説明します。

AMI(Amazon Machine Image)とは

AMI(アミ)とは、 EC2インスタンスを起動するために必要な情報が入った、OSのイメージ です。AMIを元にEC2インスタンスを作成します。

ざっくりいうと、AMIはサーバーのテンプレートのようなものです。AMIにはOSのデータが入っていて、それをもとにEC2インスタンスを作成します。OSを独自にカスタマイズしてEC2インスタンスを作成したい場合、カスタムAMIを作ります。

インスタンスタイプとは

インスタンスタイプとは、 サーバーのスペックを定義したもの です。 EC2インスタンスを作成するとき、インスタンスタイプを決める必要があります。インスタンスタイプにより料金が異なります。アクセス数に応じて必要なスペックのインスタンスタイプを選択した方が良いでしょう。

また、インスタンスタイプは以下のように表記されます。

例) m5.xlarge

それぞれの文字の意味を以下にまとめます。

文字 呼ばれ方 意味
m インスタンスファミリー どういう特徴を持ったインスタンスかを表しています(CPUを最適化したもの、メモリを最適化したもの等々)。
5 インスタンス世代 数値が大きくなるほど、同じインスタンスファミリーでも世代が進んでいます。世代が新しい方が高性能でコストパフォーマンスも高いです。
xlarge インスタンスサイズ CPU、メモリ、ネットワークのキャパシティによってインスタンスサイズが分類されています。

ストレージとは

ストレージとは、 サーバーにくっつけるデータの保存場所のことです。 EC2には2種類のストレージが存在します。

  1. EBS(Elastic Block Store)
    EBSとは、 高い可用性と耐久性を持つEC2インスタンスとは独立したストレージのことです。 EBSはEC2インスタンスとは独立して存在しているので、他のインスタンスに付け替え可能です。また、独立しているので、EC2インスタンスをStop/TerminateにしてもEBSはデータを保持できます。Snapshotを取得してS3に保存することもできます。EBSはEC2とは別に料金が発生するので、データを永続して保持したい場合に使用します。多くの場合にEBSを使用します。

  2. インスタンスストア
    インスタンスストアとは、 あるインスタンス専用の一時的なストレージのことです。 個別のインスタンス専用のストレージなので、他のインスタンスに紐づけることはできません。また、EC2インスタンスをStop/Terminateにすると、データは全てクリアになります。ただ、EBSとは異なり無料で使用できます。失われてはいけないデータはインスタンスストアには置いてはいけず、キャッシュなどのデータを置く場合に使用します。

パブリックサブネットにEC2インスタンスを設置してみる

設置手順

手順1:
IAMユーザー用のマネジメントコンソールからEC2の設定画面を開きます。その後、左側のメニューの「インスタンス」をクリックします。インスタンスを作成したいので、画面内の「インスタンスを起動」をクリックします。 Image from Gyazo

手順2:
EC2インスタンスの名前を入力した後に、AMIを選択します。今回は「Amazon Linux」にしました。 Image from Gyazo

(※)Amazon Linuxとは、AWSによってメンテナンスされているLinuxです。AWSの各サービスと連携するためのツールやライブラリが最初から入っています。

手順3:
インスタンスタイプはt2.micro(ティーツーマイクロ)を選択します。t2.microはパフォーマンスが低いですが、無料枠で使えます。その後、インスタンスに安全に接続するためにキーペアを作成します。キーペアとは、EC2インスタンスにログインするための秘密鍵です(ssh-keyになる)。キーペア名を入力して「キーペアを作成」をクリックします。キーペアをダウンロードすると思いますが、このキーペアは再度ダウンロードするのが不可能なので、無くさないようにしましょう。

Image from Gyazo

(※)キーペアはpem(ペム)ファイルです。pemファイルが秘密鍵の役割をします。

手順4:
ネットワーク設定でVPCと、EC2インスタンスを設置したいサブネットを選択します。パブリックIPの自動割り当てでは、インターネット経由でEC2インスタンスにアクセスできるようにするために、EC2インスタンスにパブリックIPアドレスを付けるかどうかを選択します。今回は有効にします。

Image from Gyazo

(※)パブリックIPの自動割り当てでEC2インスタンスに割り当てられるパブリックIPアドレスは、起動のたびにランダムなものが割り当てられる動的なIPアドレスです。

手順5:
セキュリティグループを設定します。セキュリティグループでは、EC2インスタンスのセキュリティを設定します。「セキュリティグループを作成する」を選択して、セキュリティグループ名を入力します。デフォルトのセキュリティグループだとSSHでどこからでもEC2インスタンスにアクセスできるので、SSHができるIPを指定します。しかし、今回は練習なので、0.0.0.0/0のままにしておきます。 次にネットワークインターフェースのプライマリIPアドレスに、パブリックサブネットに指定されているIPアドレス範囲内の任意のIPアドレスを書きます(10.0.10.10を書きました)。

Image from Gyazo

手順6:
ストレージの設定をします。とは言ってもストレージは最初から設定されるので、特にいじるところはありません。デフォルトではEBSがストレージとして指定されています。 Image from Gyazo

手順7:
高度な詳細を設定します。キャパシティーの予約とは、事前にリソースを確保しておくことです。AWSではアベイラビリティゾーンごとにリソースの上限が決まっていて、それを超えるとEC2インスタンスの起動ができなくなります。キャパシティー予約をしておくとそのような問題を回避できます。しかし、EC2インスタンスの実行の有無に関わらず料金が発生します。今回はなしにしました。次に、シャットダウン動作とは、EC2インスタンスをシャットダウンしたときに、起動できるように停止するか、削除するかを指定するオプションです。今回は停止にします。次に、テナンシーの部分でハードウェアを占有するか、共有のハードウェアを利用するかを指定します。今回はハードウェアを占有する必要はないので共有にします。 

手順8:
最後に「インスタンスを起動をクリックします。これで指定したサブネットにEC2インスタンスを設置できました。

Image from Gyazo

サーバーにログインするとは

サーバーにログインするとは、物理的に離れた場所にあるサーバーに、自分のパソコンからログインすることです。SSHでログインします。

SSHとは

SSHとは、 ネットワーク経由で他のコンピュータに接続して、遠隔操作するための仕組み です。通信途中の情報は全て暗号化されます。 SSHでログインされる方のコンピュータはSSHサーバー、SSHでログインする方のコンピュータまたはソフトウェアのことをSSHクライアントと言います。

公開鍵認証

AWSでは、EC2インスタンスの作成者のみがEC2インスタンスにログインできるようになっています。それらは公開鍵認証によって実現されています。EC2ではSSHでEC2インスタンスにログインするときに公開鍵認証が求められます。

公開鍵認証とは、 秘密鍵と公開鍵を利用する認証方法です。公開鍵はサーバーが保有して、秘密鍵を持っているユーザーだけがサーバーにログイン可能になっています。

(※)認証とは、「認められていると証明する」という意味です。

SSHでEC2インスタンスにログインする

ログイン手順

手順1:
サーバーにログインするときに使う秘密鍵(pemファイル)の権限を変えて、秘密鍵をオーナー以外が使えないようにします。

chmod 600 ./blog-test-ec2.pem

手順2:
ブラウザでEC2の設定画面を開き、ログインしたいインスタンスをクリックして、パブリック IPv4 アドレスをコピーします。このパブリックIPアドレスがインターネットに接続されているEC2インスタンスのパブリックIPアドレスになります。このパブリックIPアドレスを用いてSSHを実行します。

Image from Gyazo

(※)人によってこのパブリックIPアドレスは違います。

手順3:
pemファイルと先ほどコピーしたパブリックIPアドレスを使って、以下のコマンドを実行します。このコマンドを実行することでSSHでEC2インスタンスにログインします。

ssh -i ./blog-test-ec2.pem ec2-user@13.113.39.55

ログインに成功すると、以下のような画面になります。 Image from Gyazo

(※)作業が終了したらexitでサーバーとの接続を切っておきます。

ポート番号とは

ポート番号とは、 同一コンピュータ内で通信を行うプログラムを識別するための番号です。

EC2インスタンスApacheをインストールする

Apacheとは

Apacheとは、 HTTPリクエストがあると、それに対してHTTPレスポンスを返すようなWebサーバーのソフトウェアです。

インストール手順

手順1:
SSHでEC2インスタンスにログインします。その後、まずはEC2インスタンスのライブラリをyumでアップデートします。以下のコマンドでアップデートします。yumとはLinuxのパッケージ管理ツールです。yumでパッケージを管理する場合、ライブラリをパッケージとして扱います。

sudo yum update -y

手順2:
以下のコマンドを実行して、EC2インスタンスApacheをインストールします。Apacheの実行ファイル名はhttpdと言います。

sudo yum -y install httpd

手順3:
以下のコマンドを実行して、Apacheを起動させます。 systemctl(システムコントロール)コマンドは、指定したサービス(アプリケーション)を起動、停止、再起動するためのコマンドです。

sudo systemctl start httpd.service

また、以下のコマンドでApacheが起動しているかを確認できます。

sudo systemctl status httpd.service

アクティブになっているので起動しているのが確認できました。

Image from Gyazo

(※)statusのコマンド以外にもプロセスを確認することで、Apacheが起動しているかを確認できます。プロセスとは、サーバー上で実行中のプログラムのことです。

// 全てのプロセスをCPUやメモリ使用率付きで表示します。
ps -axu

手順4:
Apache自動起動するように設定します。今の状態だと、サーバーが停止したり再起動すると、Apacheの起動コマンドをまた実行する必要があります。以下のコマンドを実行することで、Apache自動起動するように設定できます。

sudo systemctl enable httpd.service

以下のコマンドを実行してenabledが出れば、自動起動がちゃんと設定されています。

sudo systemctl is-enabled httpd.service

Image from Gyazo

ファイアウォールとは

ファイアウォールとは、 ネットワークを不正アクセスから守るために、「通して良い通信だけを通して、それ以外は通さない」機能の総称です。 AWSではEC2インスタンスを作成したときに設定したセキュリティグループが、ファイアウォールの役割をになっています。セキュリティグループとは、 EC2の外側にあるファイアウォールのことです。

インバウンドとアウトバンド

インバウンドとは、サーバーに入ってくる通信のことです。アウトバウンドとは、サーバーから出ていく通信のことです。外からサーバーに自由に入られるとセキュリティ上危険なので、インバウンドに関しては必要な通信だけを通すようにして、それ以外は遮断するようにしましょう。アウトバウンドに関しては特に設定することはないです。インバウンドとアウトバンドは、セキュリティグループで編集できます。

現状EC2インスタンスへのアクセスは22番ポート(SSHでやりとりするときに使われるポート)のみ許可されているので、セキュリティグループのインバウンドを編集して、80番ポートも許可するようにします。

80番ポートが許可されていないので、EC2インスタンスにブラウザからリクエストを出したときにWebページが表示されません。

Image from Gyazo

セキュリティグループのインバウンドを編集して、80番ポートを解放する

手順

手順1:
EC2の画面でブラウザからリクエストを出したいインスタンスを選択します。そのインスタンスのセキュリティグループを確認すると、EC2インスタンス作成時に作ったセキュリティグループが適用されています。以下の画像を見ると、blog-test-infra-securityというセキュリティグループがEC2インスタンスに適用されていることが確認できます。

Image from Gyazo

手順2:
セキュリティグループのインバウンドを確認すると、SSHで22番ポートであれば、どんなIPアドレスからもアクセスできると書いてあります。ブラウザからもアクセスできるように、インバウンドを編集して80番ポートを解放します。「インバウンドのルールを編集」、「ルールを追加」をクリックします。次に、タイプにHTTPを選択して、ソースをAnywhere-IPv4を選択します。その後、「ルールを保存」をクリックします。 Image from Gyazo

Image from Gyazo

これでWebサーバーにブラウザからHTTPリクエストを出すと、レスポンスを返せるようになりました。これはApacheのデフォルトのページです。 Image from Gyazo

Elastic IPアドレスでEC2インスタンスIPアドレスを固定する

EC2インスタンスのパブリックIPアドレスは起動停止すると、別のパブリックIPアドレスが割り当てられるようになります。サーバーを運用する場合、IPアドレスが変わると不便なので、パブリックIPアドレスを固定します。AWSではEC2インスタンスのパブリックIPアドレスを固定するために、Elastic IPアドレスを使用します。

Elastic IPアドレスとは

Elastic IPアドレスとは、 インターネット経由でEC2インスタンスにアクセス可能な固定のパブリックIPアドレスを取得できてインスタンスに付与できるサービス です。その付与したインスタンスを削除するまでは、ずっとそのパブリックIPアドレスを使用することができます。

(注)Elastic IPアドレスは、EC2インスタンスに関連づけられていて、そのインスタンスが起動中であれば無料です。逆にそうでない場合は、課金されます。

以下の手順でElastic IPアドレスを起動したEC2インスタンスに紐付けます。

作業手順

手順1:
EC2の設定画面を開く → 「Elastic IP」をクリック → 「Elastic IPアドレスを割り当てる」をクリック します。「割り当て」ボタンをクリックすると、新しいパブリックIPアドレスを確保することができます。 Image from Gyazo

手順2:
確保したパプリックIPアドレスを、EC2インスタンスに割り当てます。確保したパブリックIPアドレスを選択して、「アクション」→「Elastic IP アドレスの関連付け」の順番でクリックします。EC2インスタンスに割り当てるので、リソースタイプはインスタンスを選択します。次に確保したパブリックIPアドレスを紐付けるEC2インスタンスを選択します。プライベート IP アドレスをクリックすると、先ほど選択したEC2インスタンスのプライベートIPアドレスが表示されるので、それを選択します。その後、関連付けをクリックします。

Image from Gyazo

これでEC2インスタンスにElastic IPアドレスで確保したパブリックIPアドレスを関連づけることができました。割り当てられたパブリックIPアドレスでWebサーバーに対してHTTPリクエストを出すと、ちゃんとWebページが表示されました。

Image from Gyazo

作業後

今回は練習なので、作業後はElastic IPアドレスを解放します。Elastic IPアドレスの設定画面を開いて、「アクション」→「Elastic IPアドレスの関連付けを解除」→ 「Elastic IPアドレスの解放」の順番でクリックします。そうすると、Elastic IPアドレスを解放できます。

続いて、EC2インスタンスを停止させます。EC2の設定画面を開いて、「インスタンス」→「停止させたいインスタンスを選択」→「インスタンスの停止」の順番でクリックすると、EC2インスタンスを停止させることができます。

勉強の一区切りで以上のことをやっておくと、思わぬ請求を防ぐことができて安心です。

プライベートサブネットに新しいEC2インスタンスを作成する

プライベートサブネットに新しいEC2インスタンスを作成してみます。プライベートサブネットはインターネットゲートウェイと接続されていないので、プライベートサブネットのEC2インスタンスSSHでログインしようとしても、画面が動かずアクセスできないです。

SSHでEC2インスタンスにログインしようとしても、画面が動かず、タイムアウトになります。

Image from Gyazo

↓ 今回のインフラ構成 Image from Gyazo

参考記事

AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得 | Udemy

SSH

SSHサーバー

chmod

公開鍵認証方式

22番ポート