はじめに
IT業界に入って、「IaaS・PaaS・SaaSの違いが、なんとなくしかわからないなあ。手動かして理解したい」となんとなく思って、Bobに呟いてみました。すると、BobがIaaS・PaaSの違いを体験する手順書を作成してくれました!!
早速体験していこうと思います:)
目標
同じNode.jsアプリケーションを以下の2つの方法でデプロイし、違いを体験します:
- IaaSのみ:AWS EC2でサーバーを構築し、手動で環境をセットアップ
- PaaS:Herokuを使用して自動的にデプロイ
前提条件
- AWSアカウント
- Herokuアカウント(無料)
- Gitがインストールされていること
- Node.jsがインストールされていること(ローカル開発用)
準備:共通のアプリケーションを作成
まず、両方の方法で使用するシンプルなNode.jsアプリケーションを作成します。
プロジェクトの作成
mkdir web-app-comparison
cd web-app-comparison
ボブが作ってくれました!
方法①:IaaSのみを用いてデプロイ
ステップ1: AWS EC2インスタンスの作成
-
AWSマネジメントコンソールにログイン
-
EC2ダッシュボードを開く
- サービス検索で「EC2」を検索
-
インスタンスを起動
- 「インスタンスを起動」ボタンをクリック
-
設定
-
名前:
iaas-web-app - AMI: Amazon Linux 2023 または Ubuntu Server 22.04 LTS
-
インスタンスタイプ:
t2.micro(無料利用枠) -
キーペア: 新規作成(例:
iaas-key)- キーファイル(
.pem)をダウンロードして保存
- キーファイル(
-
ネットワーク設定:
- パブリックIPの自動割り当て:有効化
- セキュリティグループ:新規作成
- SSH(22)を許可
- HTTP(80)を許可
- カスタムTCP(3000)を許可(アプリ用)
-
名前:
-
インスタンスを起動
- 「インスタンスを起動」をクリック
- インスタンスが「実行中」になるまで待つ(1-2分)
ステップ2: SSH接続
# キーファイルの権限を設定(初回のみ)
chmod 400 ~/Downloads/iaas-key.pem
# パブリックIPアドレスを確認(EC2コンソールから)
# SSH接続(Amazon Linuxの場合)
ssh -i ~/Downloads/iaas-key.pem ec2-user@<パブリックIPアドレス>
# Ubuntuの場合
ssh -i ~/Downloads/iaas-key.pem ubuntu@<パブリックIPアドレス>
ステップ3: サーバー環境のセットアップ(手動)
### システムを更新
# OSを最新で安全な状態にする
sudo dnf update -y
### Node.js 18をインストール
# server.jsを実行できるエンジン(ラインタイム)を入れる
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo dnf install -y nodejs
### Node.jsのバージョンを確認
node --version
npm --version
### Gitをインストール(まだの場合)
# 作業道具を入れる。
sudo dnf install -y git
##アプリケーションディレクトリを作成
mkdir -p ~/web-app
cd ~/web-app

インストールが完了し、EC2上にアプリケーション用のweb-appディレクトリが作成されました!
サーバー環境のセットアップのイメージが具体的に体験できて、以下棲み分けできました!
IaaSがやってくれること
- ネットワーク環境のセットアップ
- 物理サーバーのセットアップ・管理
- 物理ストレージのセットアップ・管理
自分でやること
- OSのバージョン管理
- ランタイム(例:Next.js)の選択・インストール
- アプリケーション(例:web-app)の作成・管理
- 作業道具(例:Git)を入れる
ステップ4: アプリケーションのデプロイ
方法Aと方法Bのうちおすすめを聞くと、方法Aが推奨と答えてくれました!
方法Bだと更新のたびに前ファイルを転送、バージョン管理ができない、変更履歴が残らないというデメリットがあります。そこをできるようにできたのがGitなのだと改めて思えました。
方法A: Git経由でデプロイ
git cloneが、Githubの認証方法変更が原因で実は下のコードではうまくいかなかったです。本題ではないのでまた別記事にまとめようと思います。
# GitHubにリポジトリを作成してプッシュ(ローカルで実行)
# その後、サーバー上で:
git clone https://github.com/<あなたのユーザー名>/web-app-comparison.git
cd web-app-comparison
# 依存関係をインストール
npm install
# アプリケーションを起動(フォアグラウンドでテスト)
npm start
# Ctrl+Cで停止
方法B: SCPでファイルを転送
# ローカルマシンで実行
scp -i ~/Downloads/iaas-key.pem -r . ec2-user@<パブリックIPアドレス>:~/web-app/
# サーバー上で
cd ~/web-app
npm install
npm start
ステップ5: プロセス管理の設定(PM2を使用)
プロセス管理が何かはなんとなくしっていましたが、サーバー設定の際に必須の作業としてあるとまでは理解していませんでした。。。!確かに、SSH切断するとアプリ停止したり、エラーで落ちると停止したままだと本番稼働できないため必須の作業となるなあと思いました。
# PM2をグローバルにインストール
sudo npm install -g pm2
# アプリケーションをPM2で起動
cd ~/web-app/web-app-comparison
pm2 start server.js --name "web-app"
# PM2の設定を保存
pm2 save
# システム起動時に自動起動するように設定
pm2 startup
# 表示されたコマンドを実行(sudoが必要)
# ステータス確認
pm2 status
pm2 logs web-app
ステップ6: リバースプロキシの設定(Nginx)
# Nginxをインストール
# Amazon Linux
sudo dnf install -y nginx
# Ubuntu
sudo apt install -y nginx
# Nginxの設定ファイルを編集
sudo nano /etc/nginx/conf.d/web-app.conf
以下の内容を追加:
server {
listen 80;
server_name <パブリックIPアドレス>;
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;
}
}
# Nginxの設定をテスト
sudo nginx -t
# Nginxを起動・有効化
sudo systemctl start nginx
sudo systemctl enable nginx
# ファイアウォール設定(必要に応じて)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
ステップ7: 動作確認
- ブラウザで
http://<パブリックIPアドレス>にアクセス - アプリケーションが表示されれば成功!
IaaSでの作業のまとめ
自分で行った作業:
- EC2インスタンスの作成と設定
- OSの更新
- Node.jsのインストール
- Gitのインストール
- アプリケーションコードのデプロイ
- 依存関係のインストール
- プロセス管理ツール(PM2)の設定
- リバースプロキシ(Nginx)の設定
- 自動起動の設定
EC2から本番環境で使えるようにするには、IT初心者目線で、かなり工数があったように感じました。
方法②:PaaSを用いてデプロイ
ステップ1: Herokuアカウントの作成
- https://www.heroku.com/ にアクセス
- 無料アカウントを作成
ステップ2: Heroku CLIのインストール
# macOS
brew tap heroku/brew && brew install heroku
# または公式サイトからインストール
# https://devcenter.heroku.com/articles/heroku-cli
ステップ3: Herokuにログイン
heroku login
# ブラウザが開くので、ログインを承認
ステップ4: Herokuアプリの作成
# プロジェクトディレクトリに移動
cd web-app-comparison
# Herokuアプリを作成
heroku create paas-web-app
# アプリのURLが表示される(例:https://paas-web-app-xxxxx.herokuapp.com)

その他、Herokuアプリを作成時に認証情報としてクレジットカードの登録が必要だったり、初回ログイン時にはMFA登録が必要だったり、サービスを使うための初期設定が必要でした。
ステップ5: アプリケーションのデプロイ
# 依存関係をインストール(ローカルで)
npm install
# Herokuにデプロイ
git add .
git commit -m "Deploy to Heroku"
git push heroku main
# デプロイが完了するまで待つ(1-2分)
ステップ6: 動作確認
# アプリを開く
heroku open
# またはログを確認
heroku logs --tail
https://paas-web-app-eed84ae8dac5.herokuapp.com/

Herokuアカウントを作成してHerokuCLI、herokuコマンドを打っていくと、OSの選択やランタイムなど諸々のインストールなしにアプリが無事デプロイされました!
PaaSでの作業のまとめ
自分で行った作業:
- Herokuアカウント作成
- Heroku CLIのインストール
-
heroku createコマンド実行 -
git push heroku mainでデプロイ
所要時間: 約5-10分
比較:IaaS vs PaaS
作業量の比較
| 作業項目 | IaaS | PaaS |
|---|---|---|
| サーバーの準備 | 手動(EC2作成) | 自動(heroku create) |
| OSの設定 | 手動(更新、設定) | 自動 |
| ランタイムのインストール | 手動(Node.js) | 自動 |
| 依存関係のインストール | 手動(npm install) |
自動 |
| プロセス管理 | 手動(PM2設定) | 自動 |
| リバースプロキシ | 手動(Nginx設定) | 自動 |
| SSL証明書 | 手動(Let's Encrypt等) | 自動 |
| デプロイ | 手動(Git/SCP) | 自動(git push) |
| スケーリング | 手動(複数インスタンス) | 自動(heroku scale) |
管理責任の比較
| レイヤー | IaaS | PaaS |
|---|---|---|
| アプリケーション | 自分で管理 | 自分で管理 |
| データ | 自分で管理 | 自分で管理 |
| ランタイム | 自分で管理 | PaaSが管理 |
| ミドルウェア | 自分で管理 | PaaSが管理 |
| OS | 自分で管理 | PaaSが管理 |
| 仮想化 | IaaSが管理 | PaaSが管理 |
| サーバー | IaaSが管理 | PaaSが管理 |
| ストレージ | IaaSが管理 | PaaSが管理 |
| ネットワーク | IaaSが管理 | PaaSが管理 |
まとめ
今回は、理解が抽象的だったIaaSとPaaSの違いを実際に手を動かして体験してみました!
IaaSをすることで実際に必要な作業を体験できて、nginxなどの聞いたことのある言葉や、アプリケーションレイヤーのイメージが深まりました♪





