【AWS】EC2でExpressアプリケーションを動かす

# はじめに
趣味でAWSを触ってみようと思いその時調べたことを一通りまとめておこうと思います

# 環境
### AWS側

| 種類 | バージョン |
|:--:|:--:|
| Linux/UNIX | Amazon Linux 2 AMI |
| Git | 2.23.3 |
| nvm | 0.37.2 |
| Node | 14.15.5 |
- nvm(Node Version Manager)　・・・　Nodeのバージョンを手軽に変更できるもの

### ローカル
| 種類 | バージョン |
|:--:|:--:|
| Windows | Pro |
| Tera Term | 4.97 |

# インスタンスの作成
今回はAmazon Linux 2を選択します
![ap-northeast-1.console.aws.amazon.com_ec2_v2_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/86954f63-f7db-c585-4710-85bd2037c9ca.png)
デフォルトのまま「確認と作成」へ
![ap-northeast-1.console.aws.amazon.com_ec2_v2_home_region=ap-northeast-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/5ac61ce6-77d8-27a5-400a-84ff9252dec4.png)
確認へ行くとセキュリティを強化してくださいと出ているので、`セキュリティグループの編集`を選択して変更します
![ap-northeast-1.console.aws.amazon.com_ec2_v2_home_region=ap-northeast-1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/b7b19952-eff9-5b1d-fceb-4c52595fceda.png)
SSHでアクセスできるIPを自宅からだけに設定します
ソースのプルダウンから`マイIP`を選択して`確認と作成`を選択
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/21b87e5f-ecb5-469d-e6c8-563eb01f5c27.png)

セキュリティグループに先ほど設定した自分のIPが表示されているば大丈夫です
そのまま起動でインスタンスを起動
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/609aabb5-0640-a8f1-70e2-663c10fc7ad7.png)

# EC2に接続
インスタンス一覧から先ほど作成したものを選択します
インスタンスの状態が`実行中`になっていれば詳細の`パブリックIpv4アドレス`に接続先アドレスが出てきます
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/99181b5b-0d4a-c05b-db49-7828a8efd5c5.png)
Tera Term（など）に先ほどのIPアドレスを入れて接続して下記のように表示されれば接続成功です

```

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

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$
```

# タイムゾーンの変更
タイムゾーンが初期設定だとUTCになっているので日本時間に変更する必要があります

### clockファイルの変更
```
$ sudo vim /etc/sysconfig/clock

ZONE="UTC"
UTC=true
↓
ZONE="Japan"
UTC=true
```
※`i`を押してインサートモードにして`UTC`の部分を`Japan`に変更
完了したら`Esc`を押し、`:wq`で保存して終了

### シンボリックリンクをはる
```
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
```
ここまで完了したらシステムを再起動させてください
再起動後下記のようになっていれば完了

```
$ date
Thu Feb 11 15:30:00 JST 2021
```

# Gitのインストール
nvmをインストールするためにインストールします

```
$ sudo yum install git
```

# nvmのインストール

```
$ cd ~/
$ git clone https://github.com/nvm-sh/nvm.git .nvm
$ cd ~/.nvm
$ git checkout v0.37.2
$ . ./nvm.sh
```

.bash_profileを編集

```bash
$ cd ~/
$ sudo vim .bash_profile
```

.bash_profile　・・・　ログイン時に１回実行されるファイル
下記のように`#nvm`以降を追加

```
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

# nvm ここから下記を追加
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
```

追加し保存して終了したら下記コマンドでインストールするNodeのバージョン一覧を表示

```
$ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        ~~~~~~~
       v14.15.3   (LTS: Fermium)
       v14.15.4   (LTS: Fermium)
->     v14.15.5   (Latest LTS: Fermium)
        v15.0.0
        v15.0.1
```

現在v14.15.5がLTSなので14.15.5をインストール

```
nvm install 14.15.5
```

インストールが完了したら確認

```
$ node -v
v14.15.5
```

# Express Generatorのインストール

Expressアプリケーションの雛形を簡単に生成できるものになります

```
$ npm install -g express-generator
```

インストールが成功したら下記コマンドでアプリを作成

```
$ express -e app_name(アプリ名)
$ cd app_name(アプリ名)
$ npm install
```

必要パッケージのインストールが終了したら下記コマンドで起動

```
$ npm start
> app_name(アプリ名)@0.0.0 start /home/ec2-user/app_name(アプリ名)
> node ./bin/www
```

# インバウンドルールの変更
現在SSHポート(22)しか空いていないのでNodeアプリケーションで使用しているポート(3000)を許可する必要があります
インスタンス一覧のセキュリティからセキュリティグループを選択して3000のTCPを追加してください
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/38ef180d-cfb7-1d76-b6aa-870f61934298.png)

# アクセス
インスタンス一覧のパブリックIPv4アドレスに`:3000`を追加してブラウザでアクセスして下記のような画面が出れば成功
![2021-02-11 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310163/db9ff8ec-89bb-b7be-3d0e-420847bca88d.png)

# 最後に
これで一通りアプリケーションにアクセスできるはずです

次は独自ドメイン+SSLでアクセスできるまでを書きたいなと思います