第12章
Fastifyの本番運用 — ログ・CORS・環境変数・終了処理を整える
約4分
この章では、本番運用で最低限確認したいポイントを整理します。Fastifyのコードが動くだけでは、運用できるAPIとは言えません。ログ、設定、セキュリティ、終了処理まで含めて「サーバー」として見ます。
環境変数で設定を切り替える
ポート番号や外部サービスのURLは、コードに直接書かず環境変数から読みます。
const port = Number(process.env.PORT ?? 3000);
const nodeEnv = process.env.NODE_ENV ?? 'development';
const app = buildApp({
logger: nodeEnv !== 'test',
});
await app.listen({ port, host: '0.0.0.0' });js
host: '0.0.0.0' が必要になる場面があります。ローカルだけでなく、実行環境に合わせて確認しましょう。
環境変数の考え方は、Node.jsの本番運用の章ともつながります。
ログを残す
Fastifyはロガーを組み込んでいます。logger: true を有効にすると、リクエストログやアプリケーションログを出せます。
const fastify = Fastify({
logger: true,
});
fastify.get('/todos', async (request) => {
request.log.info('fetching todos');
return todos;
});js
ログには、ユーザーのパスワード、アクセストークン、個人情報などをそのまま出さないようにします。本番では、ログの出力先、保持期間、検索方法も運用設計の一部です。
CORSを設定する
ブラウザから別オリジンのAPIを呼ぶ場合、CORS設定が必要です。Fastifyでは公式エコシステムの @fastify/cors を使います。
npm install @fastify/corsbash
import cors from '@fastify/cors';
fastify.register(cors, {
origin: ['https://example.com'],
methods: ['GET', 'POST', 'PATCH', 'DELETE'],
});js
graceful shutdown
サーバーを停止するとき、処理中のリクエストやDB接続をできるだけきれいに閉じる必要があります。
const close = async () => {
app.log.info('closing server');
await app.close();
};
process.on('SIGINT', close);
process.on('SIGTERM', close);js
FastifyのpluginでDB接続を開いている場合は、onClose hookで閉じる処理を登録できます。
fastify.addHook('onClose', async () => {
await db.close();
});js
本番前チェックリスト
NODE_ENV、PORT、DB接続先を環境変数で渡せるloggerが有効で、機密情報を出していない- CORSの
originが本番URLに制限されている - schema validationで入口を守っている
- エラーレスポンスの形式が揃っている
fastify.inject()で主要APIのテストがあるSIGTERMで安全に終了できる- Dockerやホスティング先で
hostとポートの扱いを確認している
学習者Fastifyのコードだけ分かれば、本番運用も大丈夫だと思っていました。
先生フレームワークの書き方は入口です。本番では、ログ、設定、セキュリティ、終了処理、監視まで含めてAPIを育てます。
参考リンク
次章では、ここまで学んだ内容を使って、小さなTodo APIを最初から組み立てます。
Node.jsクイズに挑戦するNode.jsサーバー運用の基礎をクイズで確認しよう
