ステージング環境とは?ローカル・本番との違いから基本的な使い方まで
Web開発をしていると、よくこんな言葉を見かけます。
- ローカル環境
- ステージング環境
- 本番環境
最初は「環境って何が違うの?」となりやすいですが、それぞれ役割が違います。
この記事では、ステージング環境とは何かを中心に、ローカル環境・本番環境との違いや、Railsを例にした基本的な使い方まで整理します。
1. ステージング環境とは何か?
一言でまとめると
ステージング環境とは、本番公開する前に、本番に近い状態で動作確認をするためのテスト環境です。
Webサービスでは、開発した機能をいきなり本番環境に公開するのは危険です。
例えば、新しくログイン機能を追加したとします。
自分のPCでは正常に動いていても、本番では、
- APIがうまく通信できない
- DB接続に失敗する
- 環境変数が設定されていない
- 画像が表示されない
- 本番用サーバーでだけエラーが発生する
といった問題が起こる可能性があります。
そこで、本番環境に出す前に本番に近い環境で最終確認する場所としてステージング環境を用意します。
なぜステージング環境が必要なのか?
一番大きな理由は、
本番環境で問題が起きる可能性を減らすため
です。
Web開発では、次のような流れで機能を公開することがあります。
┌─────────────────┐
│ ローカル環境 │
│ 自分のPCで開発 │
└────────┬────────┘
│
│ 実装完了
↓
┌─────────────────┐
│ ステージング環境 │
│ 本番に近い環境で確認 │
└────────┬────────┘
│
│ 問題なし
↓
┌─────────────────┐
│ 本番環境 │
│ ユーザーが利用する │
└─────────────────┘
例えばECサイトに「お気に入り機能」を追加する場合、
ローカル環境
↓
お気に入り機能を実装
ステージング環境
↓
実際のサーバー上で動作確認
本番環境
↓
ユーザーに公開
という流れになります。
ローカル・ステージング・本番の違い
| 環境 | 主な目的 | 主に使う人 |
|---|---|---|
| ローカル環境 | 開発・修正 | エンジニア |
| ステージング環境 | 本番前のテスト | エンジニア・社内メンバー |
| 本番環境 | 実際のサービス提供 | 一般ユーザー |
イメージとしては、
ローカル環境
= 練習
ステージング環境
= リハーサル
本番環境
= 本番
と考えると分かりやすいです。
2. 基本的な使い方
ここからはRailsを例にして考えてみます。
例えば、Webアプリに新しく
お気に入り機能
を追加するとします。
① ローカル環境で開発する
まずは自分のPCでRailsを起動します。
bin/rails server
ブラウザから、
http://localhost:3000
にアクセスします。
ここで、
- ボタンを押せるか
- DBに保存されるか
- エラーが出ないか
などを確認します。
② Gitにコードを保存する
実装が終わったら、変更したコードをGitに記録します。
git add .
git commit -m "お気に入り機能を追加"
git push origin main
会社では、直接mainブランチにpushするのではなく、
featureブランチ
↓
Pull Request
↓
レビュー
↓
mainへマージ
という流れになることも多いです。
例えば、
git switch -c feature/favorite
で作業用ブランチを作成します。
③ ステージング環境へデプロイする
コードをステージング環境へ反映します。
イメージとしては、
GitHub
│
│ デプロイ
↓
ステージングサーバー
となります。
サービスによっては、GitHubにpushすると自動的にデプロイされる場合もあります。
例えばステージング環境のURLが、
https://staging.example.com
だった場合、このURLへアクセスして実際の動作を確認します。
④ ステージング環境で動作確認する
例えば、お気に入り機能なら、
商品ページを開く
↓
お気に入りボタンを押す
↓
APIリクエストが送信される
↓
ステージングDBに保存される
↓
画面にお気に入り状態が表示される
という一連の流れを確認します。
ここでは単に画面だけを見るのではなく、
- フロントエンド
- API
- DB
- サーバー
- 環境変数
なども確認します。
ステージングDBとは?
ステージング環境には、ステージング用のDBが用意されていることがあります。
┌────────────────┐
│ ローカル環境 │
└────────┬───────┘
↓
ローカルDB
┌────────────────┐
│ ステージング環境 │
└────────┬───────┘
↓
ステージングDB
┌────────────────┐
│ 本番環境 │
└────────┬───────┘
↓
本番DB
それぞれ別のデータベースです。
例えば、
ローカルDB
→ 自分の開発用データ
ステージングDB
→ テスト用データ
本番DB
→ 実際のユーザーデータ
という違いがあります。
Railsでは環境によってDBが変わる
Railsでは環境を指定してコマンドを実行できます。
例えば、
RAILS_ENV=development bin/rails db:migrate
なら開発環境です。
RAILS_ENV=staging bin/rails db:migrate
ならステージング環境です。
RAILS_ENV=production bin/rails db:migrate
なら本番環境です。
つまり、同じ
bin/rails db:migrate
という操作でも、
どの環境に対して実行しているのか
によって影響するDBが変わります。
環境変数も環境ごとに違う
ステージング環境と本番環境では、環境変数も分けられていることがあります。
例えば、
DATABASE_URL=...
API_KEY=...
APP_URL=...
などです。
イメージとしては、
ローカル環境
DATABASE_URL=localhostのDB
ステージング環境
DATABASE_URL=ステージングDB
本番環境
DATABASE_URL=本番DB
となります。
そのため、
ローカルでは動く
↓
ステージングでは動かない
ということも普通にあります。
例えば、
ローカル
API_URL=http://localhost:3000
ステージング
API_URL=https://api-staging.example.com
本番
API_URL=https://api.example.com
のように設定が違うからです。
ステージング環境で確認すること
ステージング環境では、例えば次のようなものを確認します。
| 確認内容 | 具体例 |
|---|---|
| 画面 | レイアウトが崩れていないか |
| API | 正常にレスポンスが返ってくるか |
| DB | データが保存されるか |
| ログイン | 認証処理が正常か |
| 環境変数 | 正しく設定されているか |
| 外部サービス | APIなどと接続できるか |
| エラー | サーバーログに問題がないか |
特に注意したい「今どの環境なのか」
実務でかなり重要なのが、
今、自分がどの環境を操作しているのかを確認すること
です。
例えば、
bin/rails db:reset
のようなDBを操作するコマンドがあります。
ローカル環境なら問題なくても、本番DBに対して間違えて実行してしまうと、大きな問題になる可能性があります。
そのためコマンドを実行する前には、
今いるのはローカル?
ステージング?
本番?
どのDBに接続している?
を確認する癖をつけることが大切です。
全体のイメージ
最後に、開発から本番公開までの流れをまとめます。
┌─────────────────────┐
│ 開発者PC │
│ │
│ ローカル環境 │
│ │
│ React / Rails / DB │
└──────────┬──────────┘
│
│ git push
↓
┌─────────────────────┐
│ GitHub │
└──────────┬──────────┘
│
│ deploy
↓
┌─────────────────────┐
│ ステージング環境 │
│ │
│ 本番に近い状態でテスト │
│ │
│ ステージングDB │
└──────────┬──────────┘
│
│ 問題なし
↓
┌─────────────────────┐
│ 本番環境 │
│ │
│ 実際のユーザーが利用 │
│ │
│ 本番DB │
└─────────────────────┘
まとめ
ステージング環境とは、
本番公開する前に、本番に近い状態で動作確認をするための環境
です。
開発の流れとしては、
ローカル
↓
開発
GitHub
↓
コード共有・レビュー
ステージング
↓
本番前の確認
本番
↓
ユーザーに公開
と考えると分かりやすいです。
特に実務では、
「今どの環境を操作しているのか?」
「今どのDBに接続しているのか?」
を意識することが非常に重要です。
最初は「ステージング」「本番」「DB」「デプロイ」など知らない単語が多く感じますが、それぞれ単体で覚えるよりも、Webサービスが開発されてからユーザーに届くまでの流れの中で覚えると理解しやすくなります。