AWS初心者は必ず読むべき！必見！AWSの基本③Webサーバー構築(EC2作成)　

# この記事でやること
パブリックサブネットの中にWebサーバーを設置します。

# 注意
時期によって画面などが変わったりするのでご了承ください。

# この記事を読む前に

https://qiita.com/Hashimoto-Noriaki/items/13fa761f25026bb462b8

# EC2とは
AWSのクラウド上の***仮想サーバー***のことです。
***インスタンスはEC2からたてられたサーバー***です。
時間または秒単位の従量課金制で、サーバーの追加、削除、マシンスペック変更も数分でできます。
OSより上のレイヤーは自由に設定できるみたい柔軟なサービスです。

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

## AMI(Amazon Machine Image)とは
**インスタンス起動に必要な情報が入った、OSでサーバーのテンプレ的な存在***です。
自前のカスタムAMIが作成でき、***カスタムAMIから何台でもEC2インスタンスが作成可能***です。

## インスタンスタイプ
***サーバーのスペックを定義***したものです。
インスタンスタイプによってCPUなどが異なり、料金も異なってきます。アクセス数などによってインスタンスタイプが選択できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/ed312954-bbd5-c4af-af34-246eae410f77.png)

> 引用　https://biz.nuro.jp/column/aws-mama-022/


### ストレージ
***データの保存場所***です。
```EBS```と```インスタンスストア```があります。比較は下の記事からお願いします。
EBSの方が料金が発生するが、耐久性は強い。***こっちの方が使うことが多い***。
インスタンスストアは一時的なストレージで、追加料金はないが、大事なデータを置いてはいけない。

⚫︎EBSの記事

https://qiita.com/miyuki_samitani/items/20a1d74657668578180b


⚫︎インスタンスストア

https://qiita.com/miyuki_samitani/items/d5a38ef26f172311ade1


⚫︎両者の記事

https://aws.amazon.com/jp/premiumsupport/knowledge-center/instance-store-vs-ebs/

https://qiita.com/masato930/items/42a4f8c56aa3851120f9


# EC2設置
EC2の構築に当たって以下の手順で構築していきます。

①EC2インスタンスの設置 (順番は時期により変わる)
・AMIの選択
・インスタンスタイプの選択
・インスタンス詳細の設定
・ストレージ追加
・タグの追加
・セキュリティグループの設定
・SSHキーペアの設定
など

②Apacheをインストール

③ファイアウォールを設定

## ①EC2インスタンスの設置
EC2を検索してEC2の画面にいきます。

![スクリーンショット 2022-09-06 15.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/50291a64-e2b9-e9de-523d-0e2c2c9e31b1.png)

インスタンスを選択してインスタンスの画面にいきます。インスタンスの作成を押して作成していきます。(下の画像は起動)

![スクリーンショット 2022-09-06 22.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/210a1b1e-9e47-a3a6-1626-9efe9cba8886.png)


### 名前とタグ追加
名前とタグを追加します。
あと***インスタンス数は１***でいいと思います。

![スクリーンショット 2022-09-06 22.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/e94baca7-0f8c-5f32-caca-26b442a0fe07.png)



### AMIの選択
無料枠のAmazon Linux2でいいと思います。

![スクリーンショット 2022-09-06 22.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/3e152fab-7dd6-2f24-0e57-d19ef5f46055.png)

![スクリーンショット 2022-09-06 22.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/24cd54f8-5c6a-509f-df5c-c50fcbc2b7a7.png)


### インスタンスタイプ
t2.microの無料枠を使います。

![スクリーンショット 2022-09-06 22.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/9f3367db-5a60-715b-9922-af62ce5d5686.png)


### ネットワークの設定
ネットワークの設定です。

![スクリーンショット 2022-09-06 22.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/c6d7dbab-0d67-a68a-666f-62be4b7d3372.png)




### セキュリティグループの設定

![スクリーンショット 2022-09-06 22.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/6fd06b83-9133-fdf6-5332-e4d48fb82e2d.png)

自分のIPが無難ですが、ネット環境が変わることで、IPが変わったりするみたいです。

![スクリーンショット 2022-09-06 22.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/ad01127c-19b1-f9d8-1711-de09b16452c9.png)

例えばRailsでアプリを作った時は、カスタム(TCP)などにしてポートを3000にしておくといいいみたいです。
![スクリーンショット 2022-09-06 22.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/59c81502-55bd-2cd4-fb40-7e38ccaaf614.png)



### ストレージの設定
特に変えなくても大丈夫そうです。

![スクリーンショット 2022-09-06 22.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/b9111206-861e-8a67-9da3-da75bdf0d48d.png)


一通り設定ができたら***インスタンスを起動***します。

### キーペアの作成
新しいキーペアを作成します。
***キーペアがないとインスタンスにログインができません***。

![スクリーンショット 2022-09-06 22.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/a0d4b055-0ec6-19c7-ceec-0b29312eda1c.png)

***キーペアを作成してダウンロードされます***。画像にはないですが***キーペア***作成を押します。
***鍵は公開しないように気をつけてください***。

上での設定が終わり***インスタンスが作成されました。***


ステータスチェックは最初は初期化していますになっていても少し時間が経てば
「2/2チェックに合格しました」になります。

![スクリーンショット 2022-09-06 22.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/5644c5ab-4bfa-0cc2-92d5-cff93e54ac94.png)

インスタンスをチェックした状態で```接続```を押すとインスタンスの接続画面にいきます。
そこに***SSHクライアント***を選んで***３と4のコマンドをMacでターミナルで入力***すると
***SSH接続***できます。

```
% cd Downloads 
Downloads % chmod 400 AWS-infra-ec2.pem
Downloads % ssh -i "AWS-infra-ec2.pem" ec2-user@ec2-3-112-210-194.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-3-112-210-194.ap-northeast-1.compute.amazonaws.com (3.112.210.194)' can't be established.
ECDSA key fingerprint is SHA256:zKZNzQu4BiF1jVGo+l/GElkMWwdQYf0dRBVQUpIi55c.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-3-112-210-194.ap-northeast-1.compute.amazonaws.com,3.112.210.194' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
3 package(s) needed for security, out of 8 available
Run "sudo yum update" to apply all updates.
```
⚫︎注意
***パブリック IPv4 アドレス(ここでは3-112-210-194)は再起動するごとに変わります。***

今現在セキュリティグループを確認するとSSHで***ポート22***になっていてSSH接続できる状態です。
![スクリーンショット 2022-09-07 12.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/4092cf55-66cb-bcca-9a74-791d483b3d1a.png)


## SSH
SSHとは通信内容が暗号化された遠隔ログインシステムのことで、
サーバーと自分の目の前のパソコンをセキュアに繋ぐサービスです。
EC2にログインする時に使います。


### 公開鍵認証
サーバーに作成者本人だけがログインできるようにするのが公開鍵認証です。
EC2ではSSHログイン時に公開鍵認証をします。
秘密鍵や公開鍵を使って認証します。公開鍵はサーバーが持っていて秘密鍵を持っているユーザーだけがログインできます。
公開鍵暗号を使い公開鍵認証していきます。


# ②Apacheをインストール
##  SSHでEC2インスタンスに接続
今回はMacのやり方でやります。
***Apacheをインストール***するためにまずは***SSHでログイン***できるようにします。
まずは***ターミナルを立ち上げます***。
上のやり方で****インスタンスを起動し、SSH接続***をします。


## ポート番号
***どのプログラムがリクエストを受けるかを決めているのがポート番号***です。
プログラムのアドレスみたいな存在です。

代表的なプログラムが使うポート番号は決められていますが、動的に決まる番号もあるみたいです。

***ポート番号確認するコマンド***です。
```
% sudo lsof -i -n -P
```

##### 補足
```-i```は***ネットワークソケットファイルを表示するオプション***
```-n```は***IPアドレスをホスト名に変換しないオプション***
```-P```は***ポート番号をサービス名に変換しないオプション***

コマンド実行後に出てくる、
***LISTENは他のコードから待ち受けているコード***、***ESTABLISHEDは相手との通信中***です。


## Apacheをインストール開始
まずは上みたいにインスタンスを起動してSSH接続をします。
***yumでアップデート***します。yumはLinuxのパッケージ管理ツールです。
***sudoはルート権限で実行する***という意味です。
```
[ec2-user@ip-10-0-7-161 ~]$ sudo yum update -y
#省略
完了しました!
```
***-yはYesオプション***です。
では***Apacheをインストール***していきます。
```
[ec2-user@ip-10-0-7-161 ~]$ sudo yum -y install httpd
#省略
完了しました!
```
Apacheを起動していきます。
```
[ec2-user@ip-10-0-7-161 ~]$ sudo systemctl start httpd.service #httpd.serviceがApache
ec2-user@ip-10-0-7-161 ~]$ sudo systemctl status httpd.service #起動確認
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2022-09-07 06:18:36 UTC; 1min 43s ago
     Docs: man:httpd.service(8)
#省略
[ec2-user@ip-10-0-7-161 ~]$ ps -axu #プロセス確認
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.5 123664  5472 ?        Ss   06:05   0:01 /usr/lib/system
root         2  0.0  0.0      0     0 ?        S    06:05   0:00 [kthreadd]
#省略
apache    6275  0.0  0.6 304736  6404 ?        Sl   06:18   0:00 /usr/sbin/httpd
apache    6276  0.0  0.6 304736  6404 ?        Sl   06:18   0:00 /usr/sbin/httpd
root      6324  0.0  0.0      0     0 ?        I    06:20   0:00 [kworker/0:0-cg
ec2-user  6336  0.0  0.3 162320  3804 pts/0    R+   06:23   0:00 ps -axu
[ec2-user@ip-10-0-7-161 ~]$ ps -aux | grep httpd #httpdに絞り込み
#省略
ec2-user  6339  0.0  0.0 119448   924 pts/0    S+   06:24   0:00 grep --color=auto httpd
[ec2-user@ip-10-0-7-161 ~]$ 
```

#### Apacheの自動起動
サーバーを止めたりするとまた起動しなければならないので、自動起動するように設定します。
```
[ec2-user@ip-10-0-7-161 ~]$ sudo systemctl enable httpd.service　#自動機能設定
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[ec2-user@ip-10-0-7-161 ~]$ sudo systemctl is-enabled httpd.service #自動機能設定確認
enabled
```


## AWSのファイアウォール
***ネットワークを不正アクセスから守るために、通していい通信だけ通して、それ以外は通さない機能***です。
***セキュリティグループがAWSでファイアウォールの役割***を担っています。
サーバーへ入ってくる通信```(インバウンド)```のポートは必要なものだけ開けて、
サーバーから出ていく通信```(アウトバウンド)```のポートは基本開いています。


### ファイアウォール設定
ファイアウォールを設定するためには、```セキュリティグループのポート８０番を開けます```。
まずはインスタンスの画面を開きます。インスタンスを選択した後に、
***パブリックIPv4アドレスをコピー***します。

![スクリーンショット 2022-09-07 15.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/d633528f-bdcc-dae9-c2d2-50e4cf4b8767.png)

コピーしたらブラウザのURLの欄に貼り付けます。
すると以下のようなページになりました。Apacheのデフォルトの画面です。
Apacheに接続してレスポンスを返せたことになります。
![スクリーンショット 2022-09-07 15.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/d43de1ee-ccf6-a094-916c-842edda1e640.png)

もう一度インスタンスの画面を見てみましょう。その中でセキュリティグループを見てみます。
![スクリーンショット 2022-09-07 15.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/ca5a7a36-4ad4-9b56-232f-db01a07a73f0.png)

何か追加したい場合はインバウンドの編集から編集します。
SSH以外にもHTTPなどにも接続できる状態です。
![スクリーンショット 2022-09-07 16.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/bf249fba-6436-3050-ab38-1bd8c99770e3.png)


## パブリックIPアドレスを固定するElastic IPアドレス
***パブリックIPは起動、停止する時、別のIPアドレスが割り当てられる***が、
***Elastic IPアドレスを使うとIPアドレスを固定***できます。

### Elastic IPアドレスの注意点
そのIPアドレスはインスタンスを削除するまで使うことができます。
しかし***EC2に関連づけられていて、そのインスタンスが起動中なら無料で、
そうでなければ課金***されます。
***インスタンスを止めた時***はElastic IPアドレスのダッシュボードのアクションから
***アドレスの関連付けの解除***をしておきましょう。


### Elastic IPアドレスをIPアドレスと紐付ける
EC2のダッシュボードに***Elastic IP***があるのでクリックします。
次に***Elastic IPアドレスを割り当てる***をクリックします。

![スクリーンショット 2022-09-07 17.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/10117cb6-5045-c976-17e1-e3731be56185.png)

画像には無いですが、下に***割り当て***があるのでクリックします。
![スクリーンショット 2022-09-07 17.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/3e3a7df3-9adc-1d6d-df99-7eec89315175.png)

Elastic IPアドレスが割り当てできたらアクションからElastic IPアドレスの関連づけをクリックします。
![スクリーンショット 2022-09-07 17.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/00d7c5c9-50fe-4201-e670-a8ab06d33f4b.png)

インスタンスはここでは起動中のインスタンス(aws-infra-ec2)です。
プライベートIPアドレスはaws-infra-ec2のIPアドレスです。
下の画像には無いですが、***関連づける***をクリックします。

![スクリーンショット 2022-09-07 17.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/92bd0e5a-e0b1-7785-f101-7424900ef453.png)

割り当てが完了しました。
![スクリーンショット 2022-09-07 17.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/f9d34f74-1f9c-e3ba-a1ed-2724482a7303.png)

割り当てられたIPアドレス(ここでは54.95.19.84)をブラウザのURLに貼り付けてみると

![スクリーンショット 2022-09-07 17.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/14059bba-be77-4d99-eedc-0eb583bfb5a2.png)

Apacheの画面になったことでWebサーバー送信できているため、紐付けることができました。

# 料金が余計に発生しないために

① Elastic IPアドレスのアクションから***Elastic IPアドレスの解除***します。
インスタンスを止めるなら解除しましょう。
***Elastic IPアドレスの解放***すれば料金の発生の心配はないです。

![スクリーンショット 2022-09-07 17.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/2242e770-2fde-7eda-bff5-bc01777d4887.png)


![スクリーンショット 2022-09-07 18.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/8ea6e342-242a-b47b-01be-90720036d086.png)


② インスタンスの状態からインスタンスを停止します。

![スクリーンショット 2022-09-07 18.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/70ba10d8-6c63-b40c-d64d-b4dbd125fc02.png)




# 資料

https://www.udemy.com/course/aws-and-infra/?aEightID=s00000016735001&AID=190908007224&a8=PlQKLlknX1zBDBaq.wzJncu_p1fqzQucJwA5k1yg05hnX1QlC1QHRJzHrD0GZGuAv56JgVQTvlQKjs00000016735001