はじめに
Node.jsプロジェクトにおいて、環境変数の管理は非常に重要です。このブログでは、.env ファイルと globals.ts モジュールを使用して、環境変数を効率的に管理する方法について説明します。
アプリケーションの設定情報をコードから分離することは、セキュリティのベストプラクティスとされています。特に、データベースの接続情報やAPIキーなどの機密情報は、公開されるべきではありません。.envファイルを使用することで、これらの情報を安全に管理し、異なる環境(開発、ステージング、本番)でのアプリケーションの動作を容易に切り替えることができます。
ステップ 1: 環境変数の設定
.envファイルは、キーと値のペアで構成され、アプリケーションが実行される環境に応じて異なる設定を提供します。dotenvライブラリを使用することで、これらの環境変数をアプリケーションの起動時に読み込み、プロセスの環境変数として利用できるようになります。
# okta credentials
SSH_USERNAME="ssh-username"
SSH_PASSWORD="some-password"
# couchbase credentials
COUCHBASE_USERNAME="couchbase-user"
COUCHBASE_PASSWORD="couchbase-password"
# elastic DB
ELASTIC_AUTH="user:password"
# mysql
MYSOL_USERNAME="mysql-user"
MYSQL_PASSWORD="mysql-password"
ステップ 2: globals.ts の作成
globals.ts ファイルは、アプリケーション内で共通して使用される設定情報を一元管理するためのモジュールです。このファイル内で、dotenvを使用して.envファイルから環境変数を読み込み、必要な設定情報をエクスポートします。これにより、アプリケーション全体で一貫性のある設定情報を簡単に利用できるようになります。
実装例
npm install dotenv --save-dev
import os from "os";
import dotenv from "dotenv";
dotenv.config();
const sshUserName = process.env["SSH_USERNAME"];
const globals = {
//jump server
OS_USERNAME: os.userInfo().username,
REMOTE_HOST: "<remote-ip>",
KIBA_USERNAME: sshUserName,
KIBA_PASSWORD: process.env["SSH_PASSWORD"] || "",
LISTENING_PORT: 2205,
CLUSTER_VIP: "<cluster-vip>",
//robin
NAMESPACE: "robin-namespace",
TENANT: "robin-tenant",
ROBIN_PORT: 12345,
//couchbase
COUCHBASE_HOST_DOMAIN: "host-domain(ipv4 or ipv6)",
BUCKET: "bucket",
COUCHBASE_USERNAME: process.env["COUCHBASE_USERNAME"],
COUCHBASE_PASSWORD: process.env["COUCHBASE_PASSWORD"],
//elastic database
ELASTIC_AUTH: process.env["ELASTIC_AUTH"],
//mysql database
MYSQL_USERNAME: process.env["MYSQL_USERNAME"] || "",
MYSQL_PASSWORD: process.env["MYSQL_PASSWORD"] || "",
MYSQL_PORT: 1234,
// project path
REMOTE_DOC_PATH: `/home/${sshUserName}/documents`,
LOCAL_DOC_PATH: "output/documents",
};
export default globals;
この例では、globals.ts ファイル内で環境変数を読み込み、デフォルト値を設定しています。これにより、環境変数が設定されていない場合でも、アプリケーションが正常に動作するようになります。
ステップ 3: globals.ts の利用
アプリケーションの他の部分で globals.ts をインポートし、設定情報にアクセスします。例えば、Express.js のサーバーを設定する際に globals.ts からポート番号を取得することができます。
import express from 'express';
import globals from './globals';
const app = express();
const port = globals.port; // globals.ts からポート番号を取得
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
利点と潜在的な課題
このアプローチの最大の利点は、設定情報の中央管理にあります。これにより、コードの可読性が向上し、設定の変更が必要な場合に一箇所の修正で済むようになります。ただし、.envファイルやglobals.tsモジュールのセキュリティを確保することが重要です。例えば、これらのファイルを誤ってソースコード管理システムにコミットしないように注意する必要があります。
まとめ
.envファイルとglobals.tsモジュールを使用することで、Node.jsプロジェクトにおける設定管理を効率的かつ安全に行うことができます。このアプローチを採用することで、開発プロセスがスムーズになり、アプリケーションのセキュリティが向上します。