RubyonRails

Rails 7 APIモードの概要とベストプラクティス

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

Rails 7 の API モードとは何か

Rails 7 は API 専用モード--api オプション)を標準で提供しています。ビュー系のミドルウェアや Asset Pipeline が自動的に除外されるため、JSON だけを返すバックエンドとしては構成がシンプルになります。本セクションでは、API モードがどんなメリットをもたらすか、そして「Hotwire」や「import‑map」の取り扱いについて正確に整理します。

  • Hotwire は Rails 7 に同梱されているわけではなく、hotwired-rails gem を追加しなければ利用できません。
  • import‑map--importmap フラグで生成できるオプションです。このフラグは Rails 7.0 以降で使用可能です(7.1 だけの限定ではありません)。

以上を踏まえて、API モードが提供する「軽量化」の実体と、導入時に注意すべきポイントを見ていきます。


API モードでアプリケーションを作成する手順と主要オプション

このセクションでは rails new --api の基本的な使い方と、実務で頻出するフラグの意味を解説します。プロジェクト開始時に不要なコンポーネントを除外できるので、後から手作業で削除する手間が省けます。

rails new --api の基本形

--api フラグは Rails アプリケーションの設定ファイル(config/application.rb) に自動的に config.api_only = true を書き込み、ビュー・アセット関連ミドルウェアを最小構成にします。以下は最もシンプルなコマンド例です。

この状態だけでも API サーバーとして動作しますが、実際のプロジェクトではテストフレームワークやメール機能など不要なものをさらにスキップすることが多いです。

実務でよく使うオプション

オプション 用途・効果
-T / --skip-test MiniTest を除外し、RSpec など別のテストフレームワークを採用したいときに使用 rails new my_api --api -T
--skip-action-mailbox Action Mailbox のコードとミドルウェアを削除(メール受信は不要なケース) rails new my_api --api --skip-action-mailbox
--skip-action-text Rich Text 機能(Action Text)を除外 rails new my_api --api --skip-action-text
--skip-active-record ActiveRecord を使わない場合に ORM 関連コードとミドルウェアを削除 rails new my_api --api --skip-active-record
--database=postgresql データベースのデフォルト設定を PostgreSQL に変更(MySQL や SQLite でも同様) rails new my_api --api --database=postgresql
--importmap Import‑map を使用したフロントエンド資産管理を有効化(Rails 7.0 以降で利用可能) rails new my_app --importmap

ポイント:API モードでもデータベースは必須ではありません。外部サービスや NoSQL データストアだけで完結させる場合は --skip-active-record が有効です。


設定ファイル(application.rb / environments/*.rb)で意識すべき項目

API アプリは ミドルウェアの削減環境別の CORS・ロギング設定 がパフォーマンスとセキュリティに直結します。ここでは実務的に使われる典型的なコード例を示し、何が「必要」かを明確にします。

config/application.rb におけるミドルウェア調整

API モードはデフォルトで config.api_only = true が設定されますが、実際にはまだ CookieSession などのミドルウェアがロードされています。不要なものを削除するとリクエストごとの呼び出しコストが減少します。

効果:上記のように Cookie 関連を外すだけでも、メモリ使用量が数 MB 減り、シンプルなステートレス API に適した構成になります。

環境別設定(development / production)

開発環境と本番環境では CORS の許可範囲ログレベル を分けることがベストプラクティスです。以下は両環境での典型的な設定例です。

ポイントRack::Cors の設定は「開発時はワイルドカード、本番では明示的に列挙」の原則で管理すると、意図しないオリジンからのアクセスを防げます。


CORS とシリアライザ選択肢

API が外部クライアント(SPA、モバイルアプリ、他サービス)とやり取りする際に必須となる CORS 設定と、返却データのフォーマットを整える シリアライザ の選び方について解説します。

rack-cors の導入手順

  1. Gemfile に追加し bundle install
  2. 初期化ファイルでミドルウェアとして組み込むだけで、環境ごとに細かい制御が可能です。

ベストプラクティスCORS_ORIGINS は環境変数で管理し、ステージング・本番それぞれに異なる値を設定する。

シリアライザの比較と選定基準

項目 Active Model Serializers (AMS) jsonapi-serializer (fast_jsonapi)
標準化 任意の JSON 構造に柔軟対応 JSON:API 1.0 に完全準拠
パフォーマンス オブジェクト単位でシリアライズ(中程度) ハッシュ構築を最適化し高速
学習コスト Rails 標準的 DSL が直感的 宣言的 DSL だがドキュメント充実
拡張性 メソッドオーバーライドで自由度高い アトリビュート・関係を宣言的に記述

外部サービスと JSON:API でやり取りする場合は jsonapi-serializer が推奨されます。社内向けのシンプルなエンドポイントだけなら AMS の方が導入ハードルが低いです。

AMS の基本設定例

jsonapi-serializer の基本設定例


認証・認可の実装例とテスト戦略

トークンベース認証は API 開発において必須です。ここでは Devise Token Auth自前 JWT 実装 の比較を行い、メリット・デメリットだけでなくセキュリティ上の注意点も併せて示します。そのうえで、RSpec と Minitest によるテストコード例を提示し、実務で再利用できる形にまとめます。

Devise Token Auth の特徴と適用シーン

観点 内容
導入コスト devisedevise_token_auth をインストールすれば、ユーザー登録・ログイン・トークン更新 API が自動生成される。
機能範囲 トークンのローテーション、複数デバイス対応、期限設定、ヘッダー/クエリパラメータどちらでも利用可能。
拡張性 Devise の Warden フックを使えばカスタム認可ロジックも容易に追加できる。
運用上の注意 デフォルトではトークンは DB に保存しない(stateless)。リフレッシュトークンが必要な場合は別途実装する必要がある。

インストール手順

生成された /auth 名前空間のエンドポイントは次のとおりです。

HTTP メソッド パス 目的
POST /auth/sign_in ログイン(トークン取得)
DELETE /auth/sign_out トークン失効
PUT/PATCH /auth アカウント情報更新
GET /auth/validate_token 現在のトークンが有効か確認

セキュリティ補足:トークンは Bearer ヘッダーで送信し、HTTPS を必ず使用してください。config/initializers/devise_token_auth.rbtoken_lifespan(例: 2 weeks)や batch_request_buffer_throttle を調整することでリプレイ攻撃のリスクを低減できます。

JWT を自前実装した場合のトレードオフ

項目 説明
柔軟性 ペイロードに独自クレーム(ロール、組織 ID 等)を自由に追加できる。
運用コスト トークンの署名検証・失効管理は開発者側で実装する必要がある。
アルゴリズム選択 HS256(対称鍵)は実装が簡単だが、キー漏洩時に全トークンが危険になる。RS256(非対称鍵)なら公開鍵だけを配布でき、安全性が高いが鍵管理がやや複雑。
失効 / 再発行 JWT はステートレスなので、サーバ側で即時失効させるにはブラックリストテーブル等を別途用意する必要がある。

シンプルな実装例(HS256)

注意点
exp クレームでトークン有効期限を必ず設定し、短め(例:1 hour)にすると漏洩リスクが減ります。
本番環境では HS256 よりも RS256 を選択し、プライベートキーは Rails.application.credentials に安全に格納してください。

テスト戦略:RSpec と Minitest の実装例

API エンドポイントのテストでは 認証ヘッダーJSON 構造 の両方を検証します。以下は代表的なリクエストスペックです。

RSpec(request spec)

Minitest(Integration test)

テストでのベストプラクティス
as: :json オプションを付けてリクエストヘッダーに Content-Type: application/json を自動設定。
トークン生成はテスト専用のサービスオブジェクト(例:JwtService.encode)で一元管理し、キーや有効期限が変更されたときにもテストコードを修正せずに済む。


デプロイ手順と本番向けパフォーマンスチューニング

API アプリは 軽量化スケーラビリティ が求められます。ここでは Heroku と Docker の代表的なデプロイ方法を示し、さらに本番環境で有効なミドルウェア最小化・Eager Loading 設定について解説します。

Heroku でのシンプルなデプロイ

  1. Procfile に Puma 起動コマンドを書くだけ
  2. 必要な環境変数(RAILS_ENV, SECRET_KEY_BASE, DATABASE_URL)を CLI または Dashboard から設定

ポイント:Heroku の container スタックは自前の Dockerfile をそのまま使用できるため、ローカルと本番で同一イメージを走らせられます。

Docker で本番イメージをビルドするベストプラクティス

利点:マルチステージビルドにより、コンパイルツールや開発用ヘッダーが最終イメージに残らないため、サイズは約 120 MB 前後(Alpine ベース)に抑えられます。

本番向けパフォーマンスチューニング

チューニング項目 方法 効果の期待値
Eager Load config.eager_load = true(production.rb) 起動時に全クラスをロードし、リクエストごとの遅延ロードを防止。Cold start が数秒短縮されることが多い
ミドルウェア削除 不要な Rack::Sendfile, ActionDispatch::Cookies などを config.middleware.delete で除外 メモリ使用量と CPU サイクルが数%削減
HTTP 圧縮 Rack::Deflater をミドルウェアに追加 JSON レスポンスサイズが 30 % 前後圧縮され、帯域コストが低減
N+1 クエリ回避 includes, preload, eager_load を適切に使用 データベースアクセス数が劇的に削減され、レイテンシが 20‑30 % 改善

production.rb のサンプル設定

実務でのチェックリスト
1. bundle exec rails routes で API 用のエンドポイントだけが残っているか確認。
2. rails s -e production をローカルで起動し、ps aux | grep puma でプロセス数とメモリ使用量を測定。
3. 本番環境のロードテスト(例:k6, ApacheBench)で 平均応答時間スループット を記録し、チューニング前後で比較。


まとめと次に取るべきアクション

  1. API モードはデフォルトでミドルウェアが削減された軽量構成です。Hotwire は別途 gem が必要である点を忘れずに。
  2. rails new --api に加えるオプション(--skip-active-record, --database=postgresql, --importmap など)でプロジェクト要件に合わせた最小構成を作ります。
  3. CORSrack-cors と環境変数で管理し、開発と本番で許可オリジンを分けます。
  4. シリアライザ は AMS か jsonapi‑serializer を選択し、外部 API との連携要件に合わせて実装してください。
  5. 認証は Devise Token Auth(フル機能)と 自前 JWT(柔軟性)を比較し、トークン有効期限・アルゴリズム・失効管理の設計を必ず行うことが重要です。
  6. テストは RSpec の request spec か Minitest の統合テストで 認証ヘッダーと JSON 構造 を検証し、CI パイプラインに組み込んでください。
  7. デプロイは Heroku または Docker を選択し、ミドルウェア最小化・Eager Loading・HTTP 圧縮 で本番パフォーマンスを最大化します。

次のステップ:この記事を参考に実際に rails new my_api --api -T でプロジェクトを作成し、上記設定項目を順に適用してみましょう。CI に RSpec のリクエストスペックを追加したら、ローカルで docker compose up(または Heroku デプロイ)を実行し、パフォーマンス測定ツールで レスポンスタイムスループット を確認してください。改善点が見つかれば、前節のチューニングリストに沿ってミドルウェアやキャッシュ設定を微調整すると、実運用レベルの高速 API が手に入ります。

スポンサードリンク

-RubyonRails