AWSインフラ構築【デプロイ】/ 初めてのAWS忘備録②

前回の続き→[AWSアカウント作成/ 初めてのAWS忘備録①](https://qiita.com/mmaumtjgj/items/1db37045baa2059a7152)

クラウドにアプリをデプロイする環境を作成していく。
まずはクラウド上に自分の作業スペースを作り、外部とのネットワークの設定を作る。
これからの作業はrootアカウントではなく、IAMユーザアカウントで進める。

## リージョンの選択
クラウドサーバーを構築する、地域(リージョン)を指定する。
AWSは全世界で利用されており、各地域でホスティングされている。
画面右上のアカウント名の隣のプルダウンから「東京」を選択。

>**ホスティング**
サーバーを借りること、ここではサーバーを利用されている(借りられている)という意味

## タグの命名
**タグとは**
AWS リソースを識別および整理するためのメタデータとして使用される単語やフレーズ。
タグはキーと 1 つのオプションの値で構成されてる。

例えば EC2 が10台起動しているとし、どのEC2が自分のプロジェクトのものなのか一覧できると便利。そうしたい際に以下のようなタグ付けを行う。

| Key| Value |
|:-:|:-:|
|   Name| sample-vpc  |
|  Project |  project-1 |

---

初期段階で各リージョンごとでデフォルトのVPCなどが設定されているので、今回はそちらを利用する。
コンソール画面の検索窓から「VPC」を検索し進む。

・VPC
・サブネット（3つ）
・インターネットゲートウェイ
・ルートテーブル

上記それぞれNameタグが空になっているので、把握できるよう命名する。（例：subnet-1a など）

今回は下記のように命名。
```
#VPC
sample-vpc

#サブネット
subnet-1a
subnet-1c
subnet-1d
※アベイラビリティゾーンごとで命名

#インターネットゲートウェイ
sample-igw

#ルートテーブル
sample-rt
```

## ルートテーブルをサブネットに紐付け
デフォルトで設定されているルートテーブル(sample-rt)をプライベートサブネット（subnet-1a, subnet-1c）と紐づける。

紐付けたいルートテーブルを選択し、「サブネットの関連付けを編集」から下記の2つのサブネットで紐付ける。

## セキュリティグループの作成
VPC内の通信の許可/拒否の設定をするためにセキュリティグループを設定する。
今回はアプリケーションサーバーとデータベースの通信設定を作成していく。

コンソール画面の検索窓から「VPC」を検索し、左メニューの「セキュリティグループ」を選択。右上「セキュリティグループを作成」をクリック。
下記の設定でアプリサーバー接続用・データベース接続用の2つ作成する。

#### アプリサーバー接続用
```
#基本的な詳細
セキュリティグループ名：web-sg
説明：web-sg
VPC：sumple-vpc

#インバウンドルール(2つ)
1つ目
タイプ：HTTP
リソースタイプ(画面によってはタイプ)：Anywhere-IPv4

2つ目
タイプ：ssh
リソースタイプ(画面によってはタイプ)：Anywhere-IPv4

#アウトバウンドルール：そのまま

#タグ：なしでok
※今回はクラウドサービスでアプリを動かすこと目的なので、HTTPのみの設定になっている
```

#### データベース接続用
```
#基本的な詳細
セキュリティグループ名：db-sg
説明：db-sg
VPC：sample-vpc

#インバウンドルール
タイプ：MYSQL/Aurora
ソース：カスタム web-sg(先ほど作成したセキュリティグループ)

#アウトバウンドルール：そのまま

#タグ：なしでok
```
データベースはアプリサーバーからのアクセスのみ許可したいので、インバウンドルールはweb-sgのグループIDを指定。

## アプリを動かすサーバーを作成
コンソール画面の検索から「EC2」を検索してEC2の画面へ進み、左メニュー内の「インスタンス」を選択。
右上の「インスタンスを起動」をクリックし、下記に従い設定する。

```
#Amazonマシンイメージ(AMI)
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(64ビット x86)

#インスタンスタイプの選択
t2.micro

#インスタンスの詳細の設定
インスタンス数：1
ネットワーク：sample-vpc
サブネット：subnet-1a

#ストレージの追加：デフォルト

#タグの追加
キー：Name
値：sample-web

#セキュリティグループの設定
セキュリティグループの割り当て：既存
セキュリティグループID：web-sg
```
最後に「起動」をクリックすると、キーペアの作成が出る。こちらはEC2にログインする際に必要なので忘れないようにしておく。

## EC2にログイン
EC2へログインするために、ダウンロードしたキーペアを移動させる。
ダウンロードした``xxxxx.pem``を``~/.ssh``に移動させる。
```
% mv ~/Downloads/xxxxx.pem ~/.ssh/xxxxx.pem
```
移動完了後は、キーへのアクセス権限を設定する。キーがある階層に移動し、下記のコマンドを打つ。
```
$ chmod 400 xxxx.pem
```

最後にsshログインのコマンドを取得する。
EC2のコンソール画面で作成したインスタンスを選択し、「接続」をクリック。
「SSHクライアント」タブをクリックすると、接続のコマンドが出るので、ターミナルからそのコマンドを入力。

ターミナルで下記のようになればOK

```
[ec2-user@... ~]$
```

## ElasticIP紐づける
先ほど作成したEC2は停止して再度起動すると、パブリックIPが変わり、毎回sshログイン時は不便になるので、固定のIPを紐付ける。

EC2のダッシュボードの左メニューから「Elastic IP」に進み、右上の「Elastic IPアドレスの割り当て」から下記の設定で作成する。

```
ネットワークボーダーグループ：ap-northeast-1a
パブリックIPのアドレスプール：AmazonのIPv4アドレスプール
```

作成後、右上の「アクション」から「ElasticIPアドレスの関連付け」に進み、先ほど作成したEC2インスタンスに紐付け設定。
作成したEC2の概要内にElasticIPアドレスが表示されていればOK。

## EC2の接続時間を伸ばす
私は上記の設定を行った後、EC2のSSHがすぐ切れたので、EC2側の設定変更で接続がすぐ切れないように変更した。

```
[ec2-user@... ~]$ sudo vi /etc/ssh/sshd_config
```

デフォルトではこうなっている。
```
#ClientAliveInterval 0
#ClientAliveCountMax 3
```

2時間は接続を保ちたいので、以下のように変更
```
ClientAliveInterval 60　#クライアントが生きているかチェックを60秒毎に行う
ClientAliveCountMax 120 #クライアントが生きているかチェックを最大120回カウントする
```
1分毎にチェックして、120回までは接続を解除しないことになる。
再起動すればこれで2時間接続出来るようになる。

## DBサブネットグループの作成
コンソール画面の検索窓から「RDS」を検索し進む。
まずはDB用のサブネットグループを作成。左メニューの「サブネットグループ」を選択し、右上「DBサブネットグループを作成」をクリック。
下記の設定で作成。

```
#サブネットグループの詳細
名前：subnetgroup
説明：subnetgroup
VPC：sample-vpc

#サブネットの追加
アベイラビリティゾーン：ap-northeast-1a, ap-northeast-1c
サブネット：subnet-1a, subnet-1c
```

## RDSインスタンスの作成
コンソール画面の検索窓から「RDS」を検索し進む。
左メニューの「データベース」を選択し、右上「データベースを作成」をクリック。
下記の設定で作成。

```
#データベースの作成方法：標準作成

#エンジンのオプション
エンジンのタイプ：MYSQL
エディション：MySQL Community
バージョン：5.7.xx(最新版)

#テンプレート：無料利用枠

#設定
DBインスタンス識別子：デフォルト(database-1)
マスターユーザー名：デフォルト(admin)
マスターパスワード：任意のもの ※ここでのユーザ名、パスワードは後ほどアプリ側に設定するので、控えておく。
DBインスタンスクラス：デフォルト
ストレージ：すべてデフォルト
可用性と耐久性：デフォルト

#接続
VPC：runteq-vpc
サブネットグループ：runteq-subnetgroup
パブリックアクセス：なし
VPCセキュリティグループ：既存の選択 db-sg
アベイラビリティゾーン：ap-northeast-1a
データベースポート：3306

#データベース認証：パスワード認証

#追加設定
最初のデータベース名：sample_db
その他はそのままでok
```

## 参考記事
[AWS EC2のSSHがすぐ切れる時の対処方法](https://qiita.com/qualitia_cdev/items/b7138b1280e693585267)