【AWS】【Nest.js】EC2でNest.jsアプリケーションをデプロイする
目次
- この記事のゴール
- 開発環境
- 前提条件
- docker-compose.ymlの作成
- AWSでEC2インスタンスを立てる手順
- EC2インスタンスにEC2 Instance ConnectでSSH接続して設定
この記事のゴール
Nest.jsで開発したプロジェクトをAWS無料枠が適用できるEC2にデプロイし、アクセスできることがゴールです。
DBはPostgresをdocker-composeを活用して作成します。
セキュリティについての設定は省いた実装を行います。
開発環境
Nest.js : v9.3.0
Node.js : v16.20.2
*EC2のAmazon Linux2でNode.js v16を利用するように指示があるため従っています。
前提条件
デプロイができるまでの前提条件です。
- ローカルの開発環境で動作することが確認できていること。
- TypeORMを活用しPostgresデータベースに接続できていること。
- AWSのアカウントを作成していること。
- GitHubでプロジェクトを管理していること。
docker-compose.ymlの作成
version: '3.9'
services:
postgres:
image: postgres:12-alpine
container_name: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
- postgres:/var/lib/postgresql/data
ports:
- 5432:5432
# pgAdminは動作確認用。本来はセキュリティ上ここに書かないほうがいいと思います。
pgadmin:
image: dpage/pgadmin4
restart: always
ports:
- 81:80
environment:
PGADMIN_DEFAULT_EMAIL: test@example.com
PGADMIN_DEFAULT_PASSWORD: password
volumes:
- ./docker/pgadmin:/var/lib/pgadmin
depends_on:
- postgres
user: root
volumes:
postgres:
AWSでEC2インスタンスを立てる手順
VPC関連
-
VPCを作成する。
「VPC」コンソールのメニューバーから「お使いのVPC」を選択し、「VPCを作成」のオレンジ色のボタンをクリック。
適当な名前を付けて、IPv4 CIDRに 192.168.0.0/16 を設定 -
サブネットを作成。
左のメニューバーからサブネットを選択し作成
パブリックサブネット用に192.168.10.0/24
を作成する。 -
インターネットゲートウェイの作成
左のメニューバーから「インターネットゲートウェイ」を選択して作成する。適当な名前を付けるのみ。 -
インターネットゲートウェイをVPCにアタッチ
「アクション」ボタンから「VPCにアタッチ」を選択し1でつくったVPCを関連付ける -
ルートテーブルの作成
左のメニューバーから「ルートテーブル」を選択。
新しく作成する。このとき、VPCは1で作ったものを使用する。 -
ルートテーブルにサブネットを関連付ける
チェックをつけて下のメニューの「サブネットの関連付け」をクリック
パブリックサブネットとして作成したものを設定する。 -
ルートの設定
下のメニューの「ルート」を選択してルートを編集します。
送信先0.0.0.0./0でターゲットを3でつくったインターネットゲートウェイに設定して保存します。
EC2インスタンスの作成
- 「EC2」から「インスタンスを起動」ボタンをクリック
- 名前は適当に設定する
- アプリケーションおよびOSイメージは「Amazon Linux」を選択
- AMIの設定はAmazon Linux2のものを選択する。
- インスタンスタイプは「t2.micro」を選択
- キーペアの部分では「新しいキーペアの作成」をクリックしキーペア名を入力して作成
- ネットワーク設定の「編集」をクリック
- VPCは前の手順で作成したものを選択
- サブネットも前の手順で作成した、パブリックサブネットのものを選択
- パブリック IP の自動割り当ては有効化を選択(インターネットに接続するため)
- セキュリティグループを作成する
- 「セキュリティグループルールを追加」ボタンをクリック
- タイプが「HTTP」でソースに「0.0.0.0/0」を記載する
- タイプが「カスタムTCP」でポートを「3000」、ソースには「0.0.0.0/0」
- (もしpgAdminをDockerで作成しポート81を利用するように設定しているなら)タイプが「カスタムTCP」でポートを「81」、ソースには「0.0.0.0/0」
- タイプが「SSH」でソースに「0.0.0.0/0」を設定
- インスタンスを起動をクリック
- EC2ダッシュボードの左側のメニューから「Elastic IP」を選択
- 「Elastic IP アドレスを割り当てる」をクリックしてElastic IPを取得する。
- 「アクション」をクリックし、「Elastic IPアドレスの関連付け」を行う
EC2インスタンスにEC2 Instance ConnectでSSH接続して設定
-
上記リンクを参考にNode.jsをインストール
sudo yum update # nvmのインストール curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash # nvmの有効化 . ~/.nvm/nvm.sh # Amazon linux2を利用しているためNode.js v16を選択 nvm install 16 # nvmでNode.jsを有効化 nvm use 16 # .bash_profileで毎回有効化させる vi ~/.bash_profile # 最終行にnvm use 16を記載する
-
gitのインストールとGit Clone
# gitのインストール sudo yum install git # sshキーを生成 cd ~/.ssh ssh-keygen # 公開鍵を表示しコピーしてGithubで設定する(省略) sudo cat id_rsa.pub # デプロイ先のディレクトリへ移動 cd /var/www/ # git clone git clone [Githubリポジトリに表示されるリポジトリパス]
-
Dockerのセットアップ
参考:
# dockerのインストール
sudo yum -y install docker
# docker起動
sudo service docker start
# 確認
sudo docker info
# sudoなしでdockerを利用できるように
sudo usermod -a -G docker ec2-user
# 一度EC2 Instance Connectから抜けて入りなおす
# sudoなしでDockerを利用できるか確認
docker info
# docker起動
sudo systemctl start docker
# 動作確認
systemctl status docker
# dockerの自動起動を有効化
sudo systemctl enable docker
# Docker Composeのバイナリファイルを格納するディレクトリを作成
sudo mkdir -p /usr/local/lib/docker/cli-plugins
# 変数VERにDocker Composeのバージョンを代入
VER=2.4.1
# バイナリファイルをダウンロード
# 3行まとめて実行
sudo curl \
-L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m) \
-o /usr/local/lib/docker/cli-plugins/docker-compose
# バイナリファイルに実行権限を付与
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
# /usr/bin/に/usr/local/lib/docker/cli-plugins/docker-composeへのシンボリックリンクを設定
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
-
Nest.jsプロジェクトのセットアップ
# git cloneで作成したプロジェクトのルートでdocker-composeを利用 docker compose up -d # (任意)環境変数を利用しているなら.envを作成して記述 vi .env # ライブラリのインストール npm i # TypeORMでmigrationを実行(pakage.jsonでスクリプト等を用意していればそちらを利用してください。) npm run typeorm migration:run -- -d src/database/data-source.ts # プロジェクトを開始 npm run start
ここまで実行すれば、「http://(パブリックIPアドレス):3000」 でプロジェクトをデプロイできます。
また、Dockerで作成したpgAdminへのアクセスは「「http://(パブリックIPアドレス):81」 でアクセスできます。
まとめ
今回はAWSの無料枠を意識した構成でデプロイしてみました。
個人開発で利用するサービスのバックエンドをとりあえず動かしたい場合に利用できるのではないでしょうか。
セキュリティの面には全く気をつかっていないため実際に利用する際には手を加える必要があります。ご注意ください。
Discussion