AWSのEC2を使って、Nodeサーバーを構築してみようpart4

こんにちは！今回はpart4ということで、サーバーにNode.jsアプリケーションをデプロイします。

# はじめに
▼開発環境
* Windows PC
* Windows Powershell
* VS code
* node v21.7.3

# Nodeアプリケーションをローカル環境に作成
expressを使用してnodeアプリケーションを作成していきます。
※nodeをインストールできていない人は、[こちら](https://miyashimo-studio.jp/blog/detail/179)を参考にしてください。

#### ①プロジェクトディレクトリに必要なパッケージをインストール

```bash
npm init -y
```
```bash
npm install express
```

#### ②コードを用意する
今回はexpressを使用してnodeアプリケーションを作成しています。ポート番号は3000番を指定しています。
```javascript:server.js
const express = require('express');
const app = express();
//通常はenvファイルに記載する
const port = 3000

// サーバーの起動
app.listen(port, () => {
      console.log(`Server is running on port ${port}`);
});

app.get('/', (req, res) => {
      res.send('Hello World!');
});
```

#### ③サーバーを起動する
起動後、`Server is running on port 3000`と表示されれば正常に起動できています。
```bash
node server.js
```

#### ④`http://localhost:3000`にブラウザからアクセスする
`Hello world!`と画面に表示されていればOKです！

![スクリーンショット 2024-11-18 134535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/6ca6cba9-8aad-343b-32b1-2fd6554376f6.png)

# EC2へのデプロイ
ローカル環境に作成したnodeアプリケーションをEC2へデプロイします。


### ステップ1: フォルダをEC2に転送する
デプロイするプロジェクトの構成は以下の通りです：

node_server/
├── node_modules/    # このフォルダは転送不要
├── package-lock.json
├── package.json
└── server.js

※ `node_modules` フォルダは転送せず、EC2上で `npm install` を実行して依存パッケージをインストールします。

#### ①プロジェクトのディレクトリ直下に`exclude.txt`を作成する
(exclude.txtの中身)
```
node_modules
```
#### ②一時フォルダを作成してコピーする
(例: プロジェクトディレクトリの位置：C:\Users\user\Programming\node_server)
プロジェクトのディレクトリまで移動し下記コマンドを実行する。

```
PS C:\Users\user\Programming\node_server> xcopy "C:\Users\user\Programming\node_server" "C:\Users\user\Programming\temp_deploy" /E /I /H /exclude:exclude.txt
```

#### ③一時フォルダから`SCP`を実行
```scp
scp -i "秘密鍵のパス" -r "C:\Users\user\Programming\temp_deploy" ec2-user@パブリックIP:/home/ec2-user/
```

#### ④EC2へログインし、デプロイしたフォルダを確認
以前作成したEC2へログインをします。ログイン方法は[こちら](https://qiita.com/moeka-k0729/items/d2c323c90fcbd5e70515#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%89%8B%E9%A0%86)をご覧ください！

`ls`コマンドを入力し、下記のように`temp_deploy`が表示されます。
`cd`コマンドで`temp_deploy`フォルダに移動し、再度`ls`コマンドを入力してください。
下記画像と同じファイルが表示されます。

![スクリーンショット 2024-11-18 212618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/aebbdfe9-4c78-9bfe-085f-c84f03b9db88.png)

デプロイできてることが確認出来たら、パッケージのインストールを行います。
`temp_deploy`フォルダに移動し、コマンドを実行する。実行後、`ls`コマンドで確認すると、`node_modules`フォルダが確認できます。
```bash
npm install
```

#### ⑤Nginx設定ファイルの編集
`nano`コマンドでNginx設定ファイルを編集する。
```
[ec2-user@ip-172-31-44-164 temp_deploy]$ sudo nano /etc/nginx/conf.d/default.conf
```
設定ファイルが開けたら下記の設定を追加する。
この設定は、80番ポート(HTTP)でリクエストを受け付け、すべてのリクエストを3001番ポート(nodeアプリケーションが起動してるサーバー)へプロキシ転送をしています。


```nginx:conf
server {
    listen 80;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

設置ファイル編集後にNginxの再起動を行います。
```bash
sudo systemctl restart nginx
```

#### ⑥Nodeサーバーを立ち上げる
最後に、Nodeサーバーを起動させます。
コマンド実行後、`Server is running on port 3000`と表示されます。

```node
node server.js
```

サイトにもアクセスしてみましょう。作成したインスタンスのIPアドレスをブラウザの検索バーに入力します。
`Hello Wolrd!`と画面に表示されれば正常にNodeサーバーが起動できています。



# トラブルシューティング
#### ▼ "require is not defined in ES module scope"エラーの場合
package.jsonから "type": "module" を削除するか、importを使用します。
```javascript:server.js
import express from 'express';
```

#### ▼ ポートが使用中の場合
使用中のプロセスを確認し、必要に応じて終了します。
```bash
sudo lsof -i :3000
```

#### ▼ パーミッションエラーの場合
```bash
sudo chown -R ec2-user:ec2-user /path/to/directory
```

# おわりに
以上で`AWSのEC2を使って、Nodeサーバーを構築してみよう`は終わりになります。
最後までご覧いただきありがとうございました！
次回は、SSL/TLS証明書の導入を行っていきたいと思います。