EC2を使いパブリックサブネットの中にwebサーバーを構築する ~備忘録~

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、基礎的なネットワークが構築済みの環境でEC2を利用したwebサーバーの構築方法についてアウトプットしたので、備忘録としてまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##EC2の概要とEC2に関連するキーワード
まず初めに、EC2を扱う上で必要となる用語等をまとめておきたいと思います。
###・EC2とは
EC2とは、**AWSクラウド上の仮想サーバー構築サービス**のことで、スケーラブルなコンピューティングキャパシティーを提供します。
EC2を利用することで、LinuxやWindowsなどのOSを乗せた仮想サーバーをクラウド上に簡単に作ることができます。

>
・Amazon EC2の使用により、ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。<br>・Amazon EC2を使用すると、多少を問わず、必要なだけの仮想サーバーを起動できます。<br>・また、セキュリティとネットワーキングを設定して、ストレージを管理できます。<br>・Amazon EC2の使用により、要件の変更や需要の増加に対応してスケールアップまたはスケールダウンできるため、トラフィック予測を軽減できます。
``引用:``[Amazon EC2とは](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)

※コンピューティングキャパシティーとは: 一定時間内でどれだけのジョブを処理出来るか、つまりどの程度のスループットを達成するかということ 

``特徴``
ざっくりとした特徴は下記のような感じだと思っています。

・サーバーの追加や削除、スペックの変更などが簡単にできる
・OSより上のレイヤーを自由に設定可能

###・インスタンスとは
インスタンスとは、**EC2上で作成した仮想サーバーのこと**を表します。
つまり、EC2では仮想サーバのことを**インスタンスという単位**で扱います。

また、インスタンスには様々な種類や性能があるため、ユーザーが求める形での利用が可能です。

###・AMIとは
Amazon Machine Image(AMI)とは、 仮想サーバーを立てるためのテンプレートのようなものであり、インスタンス起動に必要な情報が入った**OSのImage**です。
AMIをもとに、EC2インスタンスを作成するので初めにOS等をインストールする必要がありません。

>
Amazon マシンイメージ(AMI)は、ソフトウェア構成 (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど)を記録したテンプレートです。<br>AMIから、クラウドで仮想サーバーとして実行されるAMIのコピーであるインスタンスを起動します。<br>**[AMIのイメージ図]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/d0e51e90-cf2e-58e1-f04d-58ab8c25d331.png)
``引用:``[AWS Documentation インスタンスとAMI](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html)

###・インスタンスタイプとは
インスタンスタイプとは、サーバーのスペックを定義したものであり、インスタンス上で実行するアプリケーションやソフトウェアの要件に基づいて選択します。

>
Amazon EC2 は、さまざまなユースケースに最適化したインスタンスタイプを幅広く取り揃えています。インスタンスタイプを構成する**CPU、メモリ、ストレージ、ネットワークキャパシティー**の組み合わせはそれぞれのタイプごとに異なり、アプリケーションのリソースとして適切なインスタンスタイプを柔軟に選択できます。
``引用:``[Amazon EC2 インスタンスタイプ](https://aws.amazon.com/jp/ec2/instance-types/)

<br>
``・種類``
インスタンスの種類は、大きく5種類に分かれます。

**汎用インスタンス**
汎用インスタンスは、バランスの取れたコンピューティング、メモリ、ネットワークのリソースを提供し、多様なワークロードに最適化されています。

**メモリ最適化インスタンス**
メモリ最適化インスタンスは、メモリ内の大きいデータセットを処理するワークロードに対して高速なパフォーマンスを実現するように設計されています。

**コンピューティング最適化インスタンス**
コンピューティング最適化インスタンスは、高パフォーマンスプロセッサの恩恵を受けるコンピューティング集約型アプリケーションに最適とされています。

**高速コンピューティングインスタンス**
高速コンピューティングインスタンスでは、ハードウェアアクセラレーター (コプロセッサ) を使用して、浮動小数点計算、グラフィックス処理、データパターン照合などの機能を、CPU で実行中のソフトウェアよりも効率的に実行します。

**ストレージ最適化インスタンス**
ストレージ最適化インスタンスは、ローカルストレージの大規模データセットに対する高いシーケンシャル読み取りおよび書き込みアクセスを必要とするワークロード用に設計されています。
<br>
``・インスタンスタイプの表記``
インスタンスタイプとは、インスタンスファミリー、インスタンス世代、インスタンスサイズから成り立っています。
下の図で、少し詳しくまとめておきます。
![スクリーンショット 2021-08-15 17.54.04 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/a1a1b18a-e6fc-2b5b-93cb-b60fc6f52ade.png)


###・ストレージとは
ストレージとは、EC2をベースとして作成した仮想サーバーのデータを保存する場所です。
EC2では、２種類のストレージを提供しています。

**・EBS**
EBSとは、コストパフォーマンスが高く高可用性および高耐久性を備えたストレージです。
>
Amazon Elastic Block Store (EBS) は、Amazon Elastic Compute Cloud (EC2) と共に使用するために設計された、スループットとトランザクションの両方が集中するどんな規模のワークロードにも対応できる、使いやすい高性能なブロックストレージサービスです。<br>Amazon EBS には、リレーショナルデータベースや非リレーショナルデータベース、エンタープライズアプリケーション、コンテナ化されたアプリケーション、ビッグデータ分析エンジン、ファイルシステム、メディアワークフローなど多種多様なワークロードが幅広くデプロイされています。

``・特徴``
・幅広いワークロードで優れたパフォーマンスを発揮する

・高可用性および高耐久性を持つ

・コストパフォーマンスが高い

・使いやすく安全であり、他のインスタンスに付け替えることができる

・**EC2インスタンスを停止、休止等した状態でもデータを保持できる**(OSやDBなどの永続的なデータの保管に適している)

・実質的にストレージ制限のない環境を提供する

・別途費用が発生する
<br>

**・インスタンスストア**
インスタンスストアは、``インスタンス用のブロックレベルの一時ストレージ``を提供します。

>
インスタンスストアは、ブロックデバイスとして表示される 1 つ以上のインスタンスストアボリュームで構成されます。インスタンスストアのサイズと、利用可能なデバイスの数は、インスタンスタイプによって異なります。
``引用:``[Amazon EC2 インスタンスストア](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html)

``・特徴``
・頻繁に変更される情報 (バッファ、キャッシュ、スクラッチデータ、その他の一時コンテンツなど)の一時ストレージに最適

・追加費用なし(無料)

・関連付けられたインスタンスの運用中のみ存続が維持される
-> **基盤となるディスクドライブで障害の発生、インスタンスの停止、休止、終了時はデータが失われる**(一時ファイル、キャッシュなどの失われても良いデータに適している)

##実践 webサーバーを構築
**・土台となるネットワーク環境**

下記の図のような構成となっています。
パブリックサブネットとプライベートサブネットを作成して、パブリックサブネットにはデフォルトルートのターゲットがigwに設定してあるルートテーブルが存在します。
![スクリーンショット 2021-08-11 19.04.39 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/80563f69-78ab-3920-0217-2909601a77ae.png)

手順としては、下記の通りです。
1.パブリックサブネットの中に、EC2インスタンスを作成
2.webサーバー用ソフトウェアをインストール
3.ファイアウォールを設定

今回は、1.パブリックサブネットの中に、EC2インスタンスを作成についてまとめておきたいと思います。
他の2つに関しては、別の記事でまとめておきます。



###1.パブリックサブネットの中に、EC2インスタンスを作成
パブリックサブネットの中にEC2インスタンスを作成していきます。
AWS ドキュメントの言葉を借りて言えば、[インスタンス起動ウィザードを使用したインスタンスの起動]と同じことを行います。

作成手順としては、下記の通りになります。

1.AMIの選択
2.インスタンスタイプの選択
3.インスタンス詳細を設定
4.ストレージの追加
5.タグの追加
6.セキュリティグループの設定
7.SSHキーペアの設定

###1-1.インスタンス作成画面に遷移して、AMIを選択する
サービスからEC2を選択し、メニューバーからインスタンスを選択後、インスタンスを起動ボタンを選択します。
![スクリーンショット 2021-08-16 19.15.07 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/e7a794fb-fa41-3d19-a35c-30ff5f9250b1.png)

その後、遷移後の画面でAMIの一覧が表示されるので、クイックスタートタグの中にあるAMIや自分でカスタムしたマイAMIを選択します。
今回は、**Amazon Linux 2 AMI (HVM), SSD Volume Type(AWSに管理されてるLinux)**を選択します。
![スクリーンショット 2021-08-16 19.22.59 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/5eb2d1ce-efa3-9fa4-a586-bb72fa4e8c31.png)

###1-2.インスタンスタイプを選択する
今回は無料枠分の**t2.micro**を選択します。(ユースケースに合わせて選択してください)
選択後、インスタンス詳細設定画面に遷移します。
![スクリーンショット 2021-08-16 19.34.26 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/6835d13e-1fd9-d3a0-0892-b171378654f6.png)

###1-3.インスタンスの詳細を設定する
入力項目は下記の通りです。

``インスタンス数:``
作成するインスタンス数を選択します。

``購入のオプション:``
安価に利用できるスポットインスタンスにするかを決めます。
スポットインスタンスをリクエストして、支払い可能なインスタンス時間当たりの最高価格が指定できるオプションであり、常時起動のインスタンスを作成する場合はオプションを選択しません。

``ネットワーク:``
どのVPCの中にインスタンスを作成するかを選択します。

``サブネット:``
どのサブネットの中にインスタンスを作成するかを選択します。

``自動割り当てパブリックIP:``
インターネット経由でアクセス可能なグローバルIPアドレスを付与するかを決めます。(パブリックサブネットはインターネットと接続するので、有効を選択します)
有効にすることで、インターネットと接続する際に、このIPアドレスがAWS側の入り口となりVPC内のネットワークにアクセス可能となります。

``配置グループ:``
複数のEC2インスタンス間の通信を高速化します。
プレイスメントグループにインスタンスを起動すると、**冗長性とネットワーキングスループットが高まる利点を得られます。**
既存のグループを選択するか、新しいグループを作成します。

``キャパシティーの予約:``
AWSでは、アベイラビリティーゾーンごとにリソースの上限が決まっており、上限を超えるとインスタンスが起動不可になります。
**キャパシティーの予約をすることで、事前にリソースを確保でき、EC2インスタンスを立ち上げる際に物理コンピュータのリソース上限の超過でエラーとなるケースを回避することができます。**

**~補足~**
・リソースの上限とは
EC2インスタンスは物理コンピュータ上で稼働しており、EC2インスタンスを稼働させると物理コンピュータが不足し、それ以上追加でEC2インスタンスを稼働させることができなくなることを指します。

・料金の発生
EC2インスタンスの実行の有無に問わず、料金が発生します。

``ドメイン結合ディレクトリ:``
ドメイン結合により、AWS Directory Service で定義したディレクトリにインスタンスを結合することができ、それにより Windows および Linux インスタンスのネットワーク全体でシングルサインオンと一元管理が可能になります。
ドメインを結合するには、必要なアクセス許可のある IAM ロールが必要です。アクティブまたは障害のあるディレクトリのみがリストに表示されます。

``IAMロール:``
EC2インスタンスが他のAWSサービスと連携する際の権限を設定します。

``シャットダウン動作:``
EC2インスタンスをシャットダウンした際に、すぐに起動できるように停止状態で置いておくか削除するかを選択します。

``停止-休止動作:``
休止動作はインスタンスを停止し、インスタンスのRAMにある情報をルートボリュームに保存します。インスタンス起動後は休止を有効にすることは不可能です。
「停止動作に休止動作を追加する」を有効化すると、後からインスタンスタイプの変更が不可能となります。
従って、**スケールアップ/ダウンを自由に変更したい場合は、EC2を作る際に選択しないよう(チェックを入れない）にします。**

**~注意点~**
・インスタンスの起動直後、すぐに休止することはできず、インスタンスの起動後にすぐ休止しようとすると、エラーが発生します。

・休止しているインスタンスがstopping状態からstoppedに移行するのに時間がかかり過ぎ、メモリの状態が起動後に復元されない場合は、休止が正しく設定されていない可能性があります。

``終了保護の有効化:``
有効化することで、EC2コンソールやAWS CLIからの操作ミスによるEC2インスタンスの削除を防ぐことが可能になります。
終了保護を無効にしない限り、APIやAWS Management Consoleを使用してこのインスタンスを終了できなくなります。

``モニタリング:``
通常の監視間隔を変更する際に選択します。(追加料金が発生)

``テナンシー:``
ハードウェアを専有するか、共有ハードウェアを利用するかを選択します。
利用の目的にあわせて、完全専有の物理サーバーでインスタンスを実行することもできます。(追加料金が発生)

``Elastic Inference:``
機械学習でGPUを使用する際に、コストパフォーマンスを高めます。
機械学習を利用しない場合は選択しません。

``クレジット仕様:``
追加料金を支払うことで、バーストモードを無制限に利用できるようになります。
>
クレジット仕様で無制限を選択すると、いつでも必要な分だけ、アプリケーションがベースラインを超えてバースト可能になります。インスタンスの平均 CPU 使用率がベースライン以下の場合は、すべての使用量が時間別インスタンス料金内で自動的にカバーされます。それ以外の場合、ベースラインを上回る使用量はすべて請求されます。
``引用:``[AWS ステップ 3:インスタンスの詳細の設定 (作成途中の画面の為リンク先URLなし)]()
<br>unlimited として設定したバーストパフォーマンスインスタンスは、必要に応じた期間にわたり、高い CPU 使用率を保持できます。24 時間ごとのインスタンスの平均 CPU 使用率またはインスタンスの存続期間のいずれか短い方の時間で、インスタンスの平均 CPU 使用率がベースライン以下になった場合、1 時間ごとのインスタンス価格は自動的にすべての CPU 使用率スパイクをカバーします。
<br>汎用のワークロードではほとんどの場合、unlimitedとして設定されたインスタンスは追加料金なしで十分なパフォーマンスを提供します。長時間にわたって高い CPU 使用率でインスタンスを実行する場合には、vCPU 時間ごとに均一追加料金が発生します。
``引用:``[バーストパフォーマンスインスタンスの Unlimited モード](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode.html?icmpid=docs_ec2_console)

``ネットワークインターフェイス:``
インスタンスに、パブリックIPアドレス以外にもプライベートIPアドレスを付与することができます。
プライマリIP欄に、IPアドレスを入力します。入力する際は、パブリックサブネットのIPアドレス範囲内に収まっていることを確認します。



``高度な詳細設定``
高度な詳細設定は、基本的にデフォルトのままです。
使用条件に応じて変更してください。

**Enclave:**
インスタンス内で機密性の高いデータを保護および処理します。

**アクセス可能なメタデータ：**
インスタンスメタデータへのアクセスを無効にします。メタデータにアクセスできる必要はないので、「有効」にします。

**メタデータのバージョン：**
メタデータのバージョンです。メタデータを活用せず、V2がトークンを必要とするため（別途設定が必要なため）、「V1およびV2」を選択します。

**メタデータトークンレスポンスのホップ制限：**
メタデータトークンが移動できるネットワークホップの数です。

**ユーザーデータ：**
インスタンスを設定するユーザーデータを設定できます。

下のような画面内で入力していきます。

![スクリーンショット 2021-08-17 18.14.18（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/fd971f8f-a05e-a181-3025-36706fb88a20.png)


###1-4.ストレージを追加する
ボリュームタイプがルートになっているものは、OSが入っているストレージになります。

追加でボリュームを設定しない場合、ボリュームタイプ[ルート]の設定を行います。

**・設定項目**

``ボリュームタイプ:``
追加時は、EBSかインスタンスストアを選択でき、ルートの場合はAMIの選択時に決まっており、今回のAMIの場合はEBSが選択されています。

``デバイス:``
OSから見えるデバイス名を設定します。
タイプがEBSかインスタンスストアの場合は各自で設定可能であり、ルートの場合は初期値が予め決まっています。

``スナップショット:``
ストレージの中身となる、スナップショットを指定します。
EBSのみ選択可能で、ルートの場合はデフォルトで設定されています。

``サイズ:``
ボリュームのサイズのことを指します。
各自、適切なサイズを選択します。

``ボリュームタイプ:``
ルートかEBSの場合に選択可能です。
汎用SSDは、コストとパフォーマンスのバランスが良く、利用率が高いボリュームタイプです。
プロビジョンドIOPS SSDは、DBなどの高いIOが必要な場合に選択します。
マグネティックは、低いIOでも問題ない場合に選択します。

``IOPS:``
IOPSは、プロビジョンドIOPS SSDの場合に設定でき、パフォーマンスを指定します。

``スループット:``
スループットとは、一秒間のデータ転送速度であり、ボリュームタイプによって設定できます。
(汎用SSDの場合は設定不可)

``終了時に削除:``
インスタンスを削除した場合に、EBSも削除するかを設定します。

``暗号化:``
EBSボリュームの暗号化を設定します。

![スクリーンショット 2021-08-17 16.40.10 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/d98b0802-008e-b74d-05d2-d846a90d227e.png)


###1-5.インスタンスに付与するタグを追加
ここでは、下記のようにインスタンスの名前を追加しておきます。
![スクリーンショット 2021-08-17 16.41.21 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/59869e70-f4ec-c2ab-adfa-857ee55fd0c4.png)


###1-6.セキュリティグループの設定
インスタンスへのセキュリティを設定します。
新しいセキュリティーグループを作成するを選択して、セキュリティグループ名を入力します。

警告文では、デフォルトのセキュリティグループ設定では、SSHでどこからでも接続できるように設定されており、危険であることを表示しています。
本来であれば、サーバーにログインして操作する時に使用するSSHをより安全に使用できるように考慮してIPを設定します。プライベートIPアドレスに制限して、他の場所からはSSHを使用してアクセスできないようにします(今回は作成テストのため気にせず作成します)

![スクリーンショット 2021-08-17 17.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/5d453ccb-410e-5c76-4157-14f7b6884e33.png)

###1-7.インスタンス作成の確認を行い、作成を実行する
作成確認画面では、今までに入力した項目を確認できるので間違いがないか確認をして、起動ボタンをクリックします。

![スクリーンショット 2021-08-17 16.53.14 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/6bf64424-4081-b4d3-d4c8-af11a2df9c50.png)

###1-8.SSHキーペアの設定

起動ボタンをクリックすると、下のようにキーペアの作成画面が現れます。
ここで、EC2インスタンスにログインするための鍵を作成します。
キーペア名を入力後、キーペアのダウンロードをクリックすると鍵を取得できるので安全な場所に保存します。
一度作成すると、ファイルを再度ダウンロードできないので注意してください。

この時ダウンロードされる``.pemファイル``は、**秘密鍵**として扱い、公開認証鍵システムの際に利用します。

キーペアの作成後、インスタンスの作成をクリックしてください。
![スクリーンショット 2021-08-17 16.54.25 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/b5e4fa25-44b9-d587-ae26-37dbcb82bfa6.png)

###1-9.作成したインスタンスを確認する
インスタンスの作成をクリック後、下のような画面に遷移します。

![スクリーンショット 2021-08-17 16.58.55 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/d3613d3c-7cad-34b8-95c8-d6e451e8e083.png)

次に、インスタンスを表示をクリックして内容を確認します。
下記のように、**インスタンスの状態が実行中、ステータスチェックが2/2チェックに合格しました**と表示されていればインスタンスの作成は成功しています。
![スクリーンショット 2021-08-17 17.02.24 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/522305b6-47d7-c8fa-5900-29beec44d4e6.png)


##参考文献
[Amazon EC2とは](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)
[インスタンス起動ウィザードを使用したインスタンスの起動](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/launching-instance.html#step-7-review-instance-launch)
[AWS 初心者向け資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-level-100/)
[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)