プログラミング

ReactアプリをAWS EC2にデプロイして公開する方法【Nginx】

この記事は約8分で読めます。

ローカル環境で作成したReactアプリケーションをAWS EC2にデプロイする方法を解説します。

Reactアプリをローカル環境で作成することはできるが、それを本番環境で動かす方法が分からない人の参考になるかと思います。

学習記録も兼ねた記事一覧をこちらの記事にまとめています。

事前準備

ローカル環境でHello Worldを表示するReactアプリも作成済みで、GitHubにプッシュ済みです。AWSのアカウントも開設済みです。

Reactアプリケーションをローカル環境で作成する方法は以下の記事で解説しています。

GitHubへのプッシュの手順は以下の記事で解説しています。

AWSアカウントの開設・セットアップ方法は以下の記事で解説しています。

ReactをEC2にデプロイする全体像

Web3層アーキテクチャに基づいたデプロイの全体像です。

(今回は2層です)

次章以降で詳細を解説します。

EC2とは

Amazon EC2は、簡単に言うと1台のパソコンです。

macOSのFinderやwindowsのExplorerのようなファイルマネージャーを持ち、必要なアプリケーションをインストールして実行できる仮想コンピュータです。

EC2にデプロイするためには、EC2のスペックを選ぶ必要があり、アプリケーションを入れて、外部からアクセスできるようにする必要があります。

Amazon EC2 とは - Amazon Elastic Compute Cloud
AWS クラウドでスケーラブルなコンピューティングキャパシティーを提供する Amazon EC2 を使用すると、ハードウェアの制約を受けずにアプリケーションを開発およびデプロイできます。

EC2インスタンスの作成

それでは、EC2(Reactアプリを動かすパソコン)のスペックを選んで起動する方法を説明します。(ここからは管理者用ユーザーである admin でサインインして行います)

今回はAWSの無料利用枠を使用します。

Amazon EC2 とは - Amazon Elastic Compute Cloud
AWS クラウドでスケーラブルなコンピューティングキャパシティーを提供する Amazon EC2 を使用すると、ハードウェアの制約を受けずにアプリケーションを開発およびデプロイできます。
項目名意味
名前とタグ > 名前helloworld-ap-server(任意)パソコンの名前
アプリケーションおよび OS イメージ (Amazon マシンイメージ) > Amazon マシンイメージ (AMI)Amazon Linux 2023 AMI(デフォルト)パソコンの種類
インスタンスタイプ > インスタンスタイプt2.microパソコンのスペック
キーペア (ログイン) > キーペア名 > 新しいキーペアを作成helloworld(任意)インスタンスに接続するときの認証情報
ネットワーク設定 > 右上編集ボタン > ファイアウォール(セキュリティグループ) > セキュリティグループを作成するhelloworld-ap-sg(任意)
ネットワーク設定 > 右上編集ボタン > インバウンドセキュリティグループのルール > セキュリティグループルール 1タイプ:ssh
ソース:3.112.23.0/29
インスタンスを操作するための接続(ssh)をEC2 Instance Connectのみに制限(AWSコンソール上からのみ接続可)
ネットワーク設定 > 右上編集ボタン > インバウンドセキュリティグループのルール > セキュリティグループルール 2タイプ:HTTP
ソースタイプ:0.0.0.0/0
インスタンスの80番ポート(HTTP)へのアクセスを解放
他の項目はデフォルトのままです。

オレンジ色の「インスタンスを起動」をクリックします。

以下の画面が表示されたら起動成功です。

EC2インスタンスへのSSH接続

EC2インスタンスはAWS上(リモート)で起動しています。

SSH接続することで、リモートにあるパソコンをコマンドラインで操作することができます。

インスタンス一覧から起動したインスタンスIDをクリックします。

アクション > 接続  をクリックします。

デフォルトのまま「接続」をクリックすると、新しいタブが開き、以下のような画面が表示されます。

nginxのセットアップ

ここでは、一般ユーザーが外部からアクセスする際の窓口となるnginxをセットアップします。

ここでのnginxはリバースプロキシの役割を果たします。

【リバースプロキシ】
クライアントからのリクエストをAPサーバーに転送し、
サーバーからのレスポンスをクライアントに返す。
つまり、外部アクセスをローカルホストにつなげる役割です。

まず、起動したコンソールでnginxをインストールします。

Zsh
sudo yum update -y        # yumパッケージを最新化
sudo yum install nginx -y # nginxをyumパッケージからインストール

以下のコマンドでバージョンが表示されればインストールできています。

Zsh
nginx -version
# nginx version: nginx/1.24.0

nginxを起動します。

Zsh
sudo systemctl start nginx

この時点でEC2インスタンスの「パブリック IPv4 アドレス」または「パブリック IPv4 DNS」にブラウザからアクセスすると、以下のように表示されます。

まだAPサーバーに接続していないため、nginxのデフォルトページが表示されます。

APサーバーが提供する予定の3000番ポートに接続するため、/etc/nginx/nginx.confに以下を追記します。

Zsh
sudo vi /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
# 〜省略〜
http {
    # 〜省略〜
    server {
        # 〜省略〜
        location / {
            proxy_pass http://localhost:3000;
        }
        # 〜省略〜
    }
}
【ミニコラム:Vi】
Viはコンソール上で使用できるテキストエディタです。
EC2は基本的にコンソールで操作するため(CLI)、EC2を操作する上で必須です。

設定を反映させるためにnginxを再起動します。

Zsh
sudo systemctl restart nginx

すると、先ほどの画面は以下のようになります。

接続先に指定したhttp://localhost:3000にまだアプリケーションを提供していないので「利用できません」(unavailable)と表示されました。

ここまで以下のようになりました。

次の章でReactアプリをhttp://localhost:3000に起動します。

Reactアプリのセットアップ

既にGitにプッシュしてあるReactプロジェクトをクローンして起動します。

Gitについてはこちら

インスタンスにGitをインストールして、リポジトリをクローンします。

Zsh
sudo yum install git -y
git clone https://github.com/<your repository>

Reactを動作させるために node.js / npm をインストールします。(公式のダウンロード方法はこちら)

Zsh
sudo su - root 
curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
yum install nodejs -y

node.jsのバージョン管理マネージャー「nvm」を使います。

nvmのインストール(※ v0.39.7の箇所は最新のリリースに合わせて修正してください)

Zsh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc # 変更された.bashrcを現在のターミナルに読み込む

バージョンを確認します。

Zsh
nvm --version
# 0.39.7

今回は開発環境に合わせてv18.17.0に変更します。

Zsh
nvm install 18.17.0
nvm use 18.17.0
node -v
# v18.17.0

Reactアプリをビルドして起動します。

Zsh
cd react-practice/ # 作業ディレクトリに移動
npm install # package.jsonに記載されたパッケージをインストール
npm run build
npm run start

ブラウザから見てみると以下のように表示されます!

インスタンスの停止

忘れないうちに使わないときはインスタンスを停止しておきます。

まとめ

以上が、ReactアプリをEC2にデプロイして公開する方法でした。

Reactアプリ自体をほとんど空の状態で本番環境へのデプロイをしておくと安心ですね。

参考文献

React/Next.jsアプリケーションを作成し、AWS EC2を使って本番環境にデプロイするまで - Qiita
対象Next.js 等、Node.js で動かすアプリをローカル環境で作成することはできるが、それを本番環境で動かす方法と仕組みがわからない人Heroku や Zeit Now を使うと簡単にリ…
【AWS】EC2についてまとめてみた(EC2+nginx+ReactでのWebアプリ公開ハンズオン付き)
React アプリを AWS EC2 にデプロイ - Qiita
はじめにフロントエンド React + バックエンド Django REST Framework でアプリを作成したが、ローカル環境でしか動かすことができないので、AWS EC2 インスタンス上に…
全力君
nvm(Node Version Mananger)を使って、Linuxに任意のバージョンのNode.jsをインストールする方法を解説します。

コメント