Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】🚀 Deploying a Full-Stack App (Next.js + Express + MongoDB) on a Single AWS EC2 Instance

2025年10月04日に「Dev.to」が公開したITニュース「🚀 Deploying a Full-Stack App (Next.js + Express + MongoDB) on a Single AWS EC2 Instance」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Next.js、Express、MongoDBのフルスタックアプリを、AWS EC2インスタンス1台にデプロイする手順を解説する。Nginx、PM2、Let's Encryptを使い、小規模プロジェクト向けに本番運用可能な環境を効率的に構築する方法を紹介する。

ITニュース解説

システムエンジニアを目指す初心者が、自分の開発したWebアプリケーションを実際にインターネット上に公開する方法について解説する。ここでは、Webサイトの見た目を作るNext.js、サーバー側の処理を担当するExpress.js、データを保存するMongoDBという3つの技術を組み合わせた「フルスタックアプリケーション」を、AWSというクラウドサービスの「EC2インスタンス」という仮想サーバー1台にデプロイする具体的な手順を追う。この方法では、NginxというWebサーバーソフトウェア、PM2というNode.jsのプロセス管理ツール、そして無料でSSL証明書を提供するLet's Encryptというサービスを使って、小規模から中規模のアプリケーションを本番環境で動かせるようにする。

まず、このデプロイ方法の全体像を理解しよう。AWS EC2インスタンスは、インターネット上にある仮想的なコンピューターで、この1台のコンピューターの中に、ユーザーが見る部分(フロントエンド)、データ処理を行う部分(バックエンド)、データを保存する部分(データベース)をすべて詰め込むことになる。フロントエンドはdashboard.projectname.comのようなURLで、バックエンドはapi.projectname.comのような別のURLでアクセスできるように設定する。

この構成を実現するために、いくつかの重要なツールが使われる。Nginxは「リバースプロキシ」として機能する。これは、ユーザーからのアクセスを最初に受け止め、そのリクエストがフロントエンド向けなのかバックエンド向けなのかを判断し、適切なアプリケーションに振り分ける「交通整理役」のようなものだ。また、Webサイトの通信を暗号化するSSL(HTTPS)の処理も担当し、セキュリティを確保する役割も持つ。PM2はNode.jsで書かれたアプリケーション(Next.jsとExpress.js)を常に起動させておくためのツールだ。もしアプリケーションがクラッシュしても自動的に再起動させたり、複数のアプリケーションプロセスを効率的に管理したりできる。Let's EncryptはWebサイトのHTTPS化に必要なSSL証明書を無料で発行してくれるサービスで、Certbotというツールを使って簡単に導入できる。MongoDBはデータベースだが、本番環境では「MongoDB Atlas」というクラウドサービスを利用するのが一般的で、バックアップやスケーリング(規模の拡大)が容易になるため推奨される。もし一時的にEC2インスタンス内にMongoDBを構築することも可能だが、その場合はセキュリティとバックアップに十分な注意が必要だ。

デプロイを開始する前に、いくつかの準備が必要となる。AWSのアカウントと、EC2インスタンスを利用するための権限、そしてWebサイトに使うドメイン名(例: projectname.com)が必要だ。ドメインは、EC2インスタンスに割り当てられる固定のIPアドレス(Elastic IP)に紐付ける設定をDNSで行う必要がある。また、MongoDBへの接続情報(URI)、Let's Encryptの登録に必要なメールアドレス、EC2インスタンスに安全に接続するためのSSHキー、そしてアプリケーションが動作するために必要な秘密情報(パスワードやAPIキーなどの環境変数)も用意しておく。

実際のデプロイは以下のステップで進める。 まず、EC2インスタンスを起動し、基本的なOSの更新を行う。次に、アプリケーションの動作に必要な「build-essential」(開発ツール群)、「git」(バージョン管理システム)、「curl」(データ転送ツール)、「nginx」、「certbot」(Let's Encryptクライアント)、「ufw」(ファイアウォール)といったソフトウェアをインストールする。

次に、Next.jsやExpress.jsが動くための基盤であるNode.jsと、プロセス管理ツールのPM2をインストールする。これらのツールが準備できたら、アプリケーションのコードを配置するためのディレクトリ(例: /var/www/projectx)を作成し、適切な権限を設定する。

その後、フロントエンドとバックエンドそれぞれのGitリポジトリから、アプリケーションのソースコードを先ほど作成したディレクトリにクローン(コピー)する。コードが配置されたら、各アプリケーションが必要とするライブラリや依存関係をインストールし、Next.jsアプリケーションの場合は、公開用のファイル群を生成する「ビルド」という作業を行う。

アプリケーションの準備ができたら、PM2を使ってアプリケーションを起動し、管理する。PM2の設定ファイルecosystem.config.jsを作成し、フロントエンドとバックエンドそれぞれのアプリケーションの名前、実行するコマンド、そして環境変数を定義する。この設定ファイルを使ってPM2を起動すれば、アプリケーションは安定して動作し、サーバー再起動時にも自動的に立ち上がるようになる。

次に、Nginxの設定を行う。フロントエンドとバックエンドそれぞれのドメイン名(dashboard.projectname.comapi.projectname.com)に対してNginxの設定ファイルを作成し、それぞれのドメインへのアクセスを対応するアプリケーション(PM2が管理するNext.jsとExpress.js)に振り向けるように記述する。この設定には、HTTPでアクセスしてきた場合にHTTPSへ自動的に転送する設定も含まれる。設定が完了したら、Nginxを再ロードして変更を適用する。

そして、Let's EncryptとCertbotを使ってHTTPSを有効にする。Certbotコマンドを実行すると、Nginxの設定を自動的に書き換え、ドメイン名に対応するSSL証明書を取得・設定してくれる。これにより、Webサイトへの通信が暗号化され、安全性が高まる。定期的な証明書の自動更新も設定しておくことで、期限切れを心配する必要がなくなる。

サーバーのセキュリティも重要だ。AWSのセキュリティグループ設定と、EC2インスタンス内のUFW(Uncomplicated Firewall)というファイアウォール設定の両方を行う。セキュリティグループでは、SSH(サーバー管理用)、HTTP(80番ポート)、HTTPS(443番ポート)のアクセスを許可し、MongoDBのポート(27017番)はローカルからのアクセスのみ、または信頼できるIPアドレスからのみ許可するなど、厳しく制限する。UFWでは、OpenSSHとNginx(HTTP/HTTPS)からのアクセスを許可し、それ以外の不要な通信はブロックするように設定する。

MongoDBについては、前述の通り本番環境ではMongoDB Atlasのようなマネージドサービスを強く推奨する。もしEC2インスタンス内で自己ホストする場合は、データベースが外部から直接アクセスされないようにローカルIPアドレスにバインドし、必ず認証を有効にして、定期的なバックアップを自動化する仕組みを構築することが非常に重要だ。

デプロイ作業は手作業でも可能だが、Gitリポジトリへのプッシュをきっかけに自動でデプロイが完了するようなスクリプトを用意すると、運用の手間が大幅に削減される。シェルスクリプトを作成し、Gitの最新コードをプルし、依存関係を再インストールし、PM2でアプリケーションを再起動し、Nginxの設定を再ロードする一連の流れを自動化できる。

デプロイ後も、アプリケーションの監視、バックアップ、メンテナンスが欠かせない。アプリケーションの動作状況をリアルタイムで確認できる監視ツール(CloudWatchなど)を導入し、データベースや設定ファイルの定期的なバックアップ体制を整える。また、PM2のログローテーション機能を使って、アプリケーションが出力するログファイルが肥大化しないように管理することも重要だ。

将来的にアプリケーションが成長し、より多くのユーザーを抱えるようになった場合には、さらなる改善と拡張が必要になる。例えば、MongoDBを専用のクラウドサービスに完全に移行したり、フロントエンドとバックエンドを別々のサーバーインスタンスに分離したりすることで、それぞれの負荷に応じたスケーリングが可能になる。GitHub ActionsなどのCI/CD(継続的インテグレーション・継続的デリバリー)ツールを導入すれば、コードの変更が自動的にテストされ、デプロイされるようになる。さらに、ロードバランサーやオートスケーリンググループを導入することで、アクセス増に対応できる柔軟なインフラを構築できる。セキュリティ面では、AWS WAF(Webアプリケーションファイアウォール)やレート制限の導入、機密情報の管理にはAWS Secrets Managerのような専門サービスを活用すると良いだろう。

最終的に、デプロイが完了したら、Elastic IPが正しく設定されているか、DNSレコードが正しいIPアドレスを指しているか、SSL証明書が有効でHTTPS通信が機能しているか、PM2が自動起動するように設定されているか、ログとバックアップの仕組みが動作しているか、セキュリティルールが適切に設定され、すべての認証情報が安全に管理されているかなどを確認することが重要だ。

このように、Next.jsとExpress.js、MongoDBで構成されたフルスタックアプリケーションを1台のAWS EC2インスタンスにデプロイする方法は、小規模なプロジェクトやプロトタイプには非常に効率的で、PM2、Nginx、Certbotといったツールを組み合わせることで、複雑なKubernetesやECSといった技術を使わずに、本番環境に対応できる堅牢なシステムを構築できる。これは、アプリケーションを世に出すための第一歩として、システムエンジニアを目指す上で貴重な経験となるだろう。アプリケーションが成長した際には、ここで学んだ基本的な知識を基盤として、より高度なクラウドサービスやアーキテクチャへと発展させていくことが可能だ。

関連コンテンツ

関連IT用語

関連ITニュース