[AWS]Webサーバーの構築方法

**2020年1月19日現在の内容です。**

## 用語説明
### EC2(Elastic Compute Cloud)
AWSクラウド上の仮想サーバー　
インスタンス：EC2から立てられたサーバーのこと

**特徴**

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

**作成手順**

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

### AMI(Amazon Machine Image)
インスタンス起動に必要な情報が入ったOSのイメージ
サーバーのテンプレートのようなもの

**特徴**

- AWSやサードパーティがAMIを提供
- 自前のカスタムAMIも作成可能
- カスタムAMIから何台でもEC2インスタンスを起動可能

### インスタンスタイプ
サーバーのスペックを定義したもの

**概要**

- インスタンスタイプにより、CPU、メモリ、ストレージ、ネットワーク帯域が異なる
- インスタンスタイプにより料金が異なる（スペックが高いほど料金も高い）
- アクセス数などに応じて必要なスペックのあるインスタンスタイプを選択する

### ストレージ
サーバーに紐付けるデータの保存場所
EC2のストレージは2種類存在する

#### EBS(Elastic Block Store)
- 高い可用性と耐久性を持つストレージ
- 他のインスタンスに付け替え可能
- EC2インスタンスをSTOP(一時停止)/Terminate(永久破棄)してもEBSは保持可能
- Snapshot(増分バックアップ)を取得しS3に保存可能
- EBSの費用が別途発生
- OSやDBなどの永続性と耐久性が必要なデータの格納に使用

#### インスタンスストア
- インスタンス専用の一時的なストレージ
- 他のインスタンスに付け替えることができない
- EC2インスタンスをSTOP/Terminateするとクリアされる
- 追加費用は発生しない（無料）
- 一時ファイルやキャッシュなど失われても問題がないデータの格納に使用

一般的にはEBSの利用が多い

### SSH
サーバーと自分のパソコン（クライアント）をセキュアにつなぐサービスのこと
（通信内容が暗号化された遠隔ログインシステム）

**EC2にログインするときはSSHを使用する**

### 公開鍵認証
- サーバーへのログイン時に認証を行う仕組み
- ユーザー名とパスワードを使用した認証と比べ、よりセキュリティが高い
- 公開鍵暗号（秘密鍵と公開鍵）を用いて認証を行う
- 公開鍵はサーバーが保有。秘密鍵を持っているユーザーだけログイン可能

公開鍵：南京錠のイメージ
秘密鍵：鍵のイメージ

EC2ではSSHログイン時に公開鍵認証を行っている

### ポート番号
プログラムのアドレス
同一コンピューター内で通信を行うプログラムを識別するときに利用される

- SSHサーバー：ポート番号22
- HTTPサーバー：ポート番号80
- SMTPサーバー：ポート番号25

ポート番号を決める方法は2種類ある

**標準で決められている番号**

- 代表的なプログラムが使うポート番号はあらかじめ決められている（ウェルノウンポート番号）
    - SSH：22 
    - SMTP：25
    - HTTP：80
    - HTTPS：443
- ウェルノウンポート番号は0〜1023のいずれかの整数値
- 接続元（クライアント）が接続先のポート番号を省略した場合、ウェルノウンポート番号が使用される


**動的に決まる番号**

- サーバーはポート番号が決まっている必要があるが、クライアントはポート番号が決まってなくても良い
- クライアントのポート番号はOSが他のポート番号と重複しないように、ランダムに決める
- 動的に割り当てる番号は49142〜65535のいずれかの整数値

### ファイアウォール
ネットワークを不正アクセスから守るために、「通して良い通信だけを通して、それ以外は通さない」機能の総称

AWSでは、セキュリティグループがファイアウォールの役割を担っている

### Elastic IPアドレス

- インターネット経由でアクセスで可能な固定グローバルIPアドレスを取得でき、インスタンスに付与できるサービス
- インスタンスを削除するまで付与したIPアドレスを使用できる
- Elastic IPアドレスはEC2インスタンスに関連付けられていて、インスタンスが起動中であれば無料で利用できる**（インスタンスが使用されていなかった場合、課金される）**

## 構築手順
1. EC2インスタンスを設置する
2. Apacheをインストールする
    1. SSHでサーバーにログイン
    2. Apacheをインストール
3. ファイアウォールを設定する

<img width="763" alt="スクリーンショット 2020-01-18 14.17.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/33b2e293-56cd-4c89-df29-02c922e456d0.png">


## EC2インスタンスの作成
EC2インスタンスをパブリックサブネットに設置する

サービス　→　EC2を検索
<img width="1680" alt="スクリーンショット 2020-01-17 19.49.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/bfaa1ae1-0353-332d-5b2c-3fc0d7f4f2bf.png">

「インスタンス」をクリック
<img width="1680" alt="スクリーンショット 2020-01-17 19.55.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2358a8ba-6bc0-31a1-51eb-b8337c31eec8.png">

「インスタンスの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-17 19.58.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/670b493d-e7d8-3555-83e3-3a4f5a73d8ae.png">

「Amazon Linux 2」を選択
（特に理由がなければAmazon Linux 2で問題ない）
<img width="1680" alt="スクリーンショット 2020-01-17 20.04.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/d64728a5-14c4-1511-5395-cefd17d5448d.png">

「t2.micro」を選択し、「次のステップ」をクリック
（t2.microはパフォーマンスが低いが動作検証では十分足りる）
<img width="1680" alt="スクリーンショット 2020-01-17 20.09.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7135594e-3d36-18d4-d601-c6c922c55d5e.png">

以下の通り設定し、「次のステップ」をクリック

- 「スポットインスタンスのリクエスト」を選択すると低料金で利用できるが、インスタンスが中断する可能性がある
- 「ネットワーク」は作成したVPC
- 「サブネット」はパブリックサブネット
- インターネットに接続する場合「自動割り当てパブリック IP」を有効にする
- 「配置グループ」を選択すると複数のEC2インスタンス間の通信を高速する
- 「キャパシティーの予約」を開くにするとアベイラビリティゾーンのリソースを事前に確保してEC2インスタンスを常に起動できる状態にできる（追加料金が発生）
- 「IAMロール」はEC2インスタンスが他のAWSサービスと連携するときの権限を設定
- 一般的に本番環境では「削除保護の有効化」を設定する
- 「テナンシー」ではハードウェアを専有するか共有するかを選択する（専有すると追加料金が発生）
- 「Elastic Inference」は機械学習でGPUを使用する際にコスト効率を良くするためのもの
- 「T2/T3 無制限」はバースト（サーバーにアクセスが集中した際CPUをフル稼働させる状態）を無制限にできる（追加料金が発生）
<img width="1680" alt="スクリーンショット 2020-01-18 12.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/4cd01179-f2c4-c074-6e47-e4bcdec4f9ce.png">


ネットワークインターフェースでプライベートIPを設定する
＊パブリックサブネットの範囲内で設定する
<img width="1680" alt="スクリーンショット 2020-01-18 12.05.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a236ae35-cb45-709d-76d2-0280eb7e7605.png">

以下の通り設定し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 12.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a98301b2-9976-f648-e085-00334a759cfb.png">

任意のタグを追加・設定し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 12.19.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/47a1455f-4d13-3d64-17bc-f78adb2967d1.png">

以下の通り設定し、「確認と作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 13.10.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c8d888c8-0480-f55b-f80b-dc513c837185.png">


設定内容を確認し、問題なければ「起動」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 13.21.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/d0e7f27b-9dea-ff58-d62a-9037f2b9db13.png">

新しいキーペアを作成し、ダウンロードする
＊**キーペアのダウンロードはこれ以降できないので、必ずダウンロードしておく**
ダウンロードが完了したら「インスタンスの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 13.28.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b426ac4f-18dd-eb96-6ba1-bb21fc98edd1.png">

「インスタンスの表示」をクリック
<img width="1680" alt="スクリーンショット 2020-01-18 13.30.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/937f035e-bb02-886b-b0ac-87d63bce5099.png">

インスタンスが作成されていることを確認
（一定時間経過後「インスタンスの状態」が「runnning」,「ステータスチェック」が「2/2のチェックに合格しました」となる）
<img width="1680" alt="スクリーンショット 2020-01-18 13.36.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a19ed5fa-c8f3-a626-666b-d2447dbae0bc.png">

## SSHでEC2インスタンスに接続
**＊MACの手順**

ターミナルを起動し、ダウンロードした秘密鍵（pemファイル）の権限を変更する
`chmod 600 test-ssh-key.pem`

作成したEC2インスタンスのパブリックIPアドレスをコピーする
<img width="1680" alt="スクリーンショット 2020-01-18 15.26.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/55bd0b3d-2330-1666-06e8-ea68e0023e84.png">

sshコマンドでログインする
`ssh -i test-ssh-key.pem ec2-user@54.64.153.51`
↑秘密鍵（test-ssh-key.pem）を用いてユーザー名（ec2-user）でIPアドレス（54.64.153.51）に接続する
（初回ログインの場合「Are you sure you want to continue connecting (yes/no)?」と聞かれるので「yes」を選択）

`exit`でログアウトできる

## Apacheのインストール
パッケージを最新に更新する
`sudo yum update -y`

Apacheのインストール
`sudo yum install httpd -y`

Apacheの起動
`sudo systemctl start httpd.service`

Apacheが起動されていることを確認
`sudo systemctl status httpd.service`
<img width="857" alt="スクリーンショット 2020-01-19 11.13.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/0a55c7d7-0852-f3c6-aec5-371e2602b647.png">

サーバーが停止・再起動したらApacheも停止するので、サーバーが起動したときにApacheも自動で起動するように設定
`sudo systemctl enable httpd.service`

Apacheの自動起動が反映されていることを確認
`sudo systemctl is-enabled httpd.service`
<img width="857" alt="スクリーンショット 2020-01-19 11.28.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/6d33022b-aea7-2a1a-9a3c-9f1ad0e98880.png">

## ファイアウォールの設定
セキュリティグループの80番を開ける

EC2インスタンスのセキュリティグループをクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.09.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/3c05e9df-36fe-ba18-764c-b6510df61072.png">

「インバウンド」をクリックし、SSH(ポート番号22)しか表示されていないことを確認
<img width="1680" alt="スクリーンショット 2020-01-19 14.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b4a437e7-67a4-b36f-2730-c83395f57bbc.png">

「編集」　→　「ルールの追加」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.13.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b831b2b7-7fcc-0ef7-72db-596de781db4c.png">
<img width="1680" alt="スクリーンショット 2020-01-19 14.14.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/574c6b83-2d42-e766-b97e-b109ac6343e9.png">

以下の通り設定し、「保存」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.19.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f177a8bf-ff2f-f016-c72e-ad6a856a1b1d.png">

EC2インスタンスのIPアドレスをブラウザで開き、HTTP通信ができていることを確認
<img width="1680" alt="スクリーンショット 2020-01-19 14.22.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/508fede3-bc80-4636-4a45-3880b294ff29.png">

## Elastic IPアドレスを紐付ける
「Elastic IP」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.36.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/667019ba-cd76-54c7-cf4a-a34e3f0f123f.png">

「Elastic IPアドレスの割り当て」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.38.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/025947f9-eb41-f943-ff0d-6ac7ae8d41ab.png">

「割り当て」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.41.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/780d3fd4-b965-4406-708f-2665fa02fd54.png">

「このElastic IPアドレスを関連付ける」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 14.44.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/66bc2415-698f-7c8d-e23d-77cd969f7e8f.png">

以下の通り設定し、「関連付ける」をクリック

インスタンス：作成したEC2インスタンス
プライベートIPアドレス：EC2インスタンスに設定したプライベートIPアドレス
<img width="1680" alt="スクリーンショット 2020-01-19 14.47.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7c90f6d5-4376-3c3e-e98c-a68bfe584ca9.png">

割り当てたIPアドレスををブラウザで開き、Apacheのページが表示されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-19 14.59.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e118ff93-0940-29cc-a76a-9c428c25f5b4.png">

<img width="1680" alt="スクリーンショット 2020-01-19 15.01.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/df5ef4e2-aaab-15c7-1aa6-a8c5f43c2d78.png">

## おまけ（Webサーバーの片付け方）
### Elastic IPアドレスの開放
Elastic IPアドレスを選択し、「アクション」　→　「Elastic IPアドレスの関連付けの解除」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.17.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e5381923-970a-f40b-b5f0-bf12f7598b04.png">

「関連付け解除」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.28.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b8fb6c1d-ebe0-7f5c-4bee-c671f8458973.png">

「アクション」　→　「Elastic IPアドレスの解放」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.30.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/8879e996-f876-a4c3-45c2-ec939baee108.png">

「解放」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.32.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/0cb6a464-4e21-6c72-6b26-9abfcf2c52a0.png">

### EC2インスタンスの停止
「インスタンス」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.34.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5dfd4912-97ae-fb1e-a24e-bd2e5781f213.png">

「アクション」　→　「インスタンスの状態」　→　「停止」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.36.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/801422a5-abc9-80af-4038-4a3a3822bfad.png">

「停止する」をクリック
<img width="1680" alt="スクリーンショット 2020-01-19 15.38.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/90ce1150-a4c7-7972-7e17-c08fe56ace5b.png">

インスタンスが停止したことを確認
<img width="1680" alt="スクリーンショット 2020-01-19 15.42.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/24a09dda-3f04-0f3b-8978-176fcc785ad2.png">

## 参考
[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)