環境変数ガイド
アプリケーションで使用する環境変数の取得方法と管理方法を説明します。
概要
このインフラでは、環境変数は以下の2つの方法で提供されます:
- Terraform が自動的に設定する環境変数: データベース接続情報、Redis 接続情報、Storage 接続情報など
- アプリケーション固有の環境変数:
.env.{env}ファイルで管理
環境変数の種類
1. Terraform が自動設定する環境変数
これらの環境変数は、Terraform がインフラをプロビジョニングする際に自動的に Container Apps に注入されます。
特徴: アプリケーション側で設定不要、.env ファイルに記載しても自動上書きされる、環境ごとに自動的に値が変わる
例: DATABASE_URL, REDIS_HOST, AZURE_STORAGE_CONNECTION_STRING, ENVIRONMENT
詳細は Terraform が提供する環境変数仕様 を参照。
2. アプリケーション固有の環境変数
これらの環境変数は、アプリケーションの動作を制御するために .env.{env} ファイルで管理します。
特徴: アプリケーション開発者が管理、暗号化されて Git で管理(dotenvx)、CI/CD でデプロイ時に適用
例: API_KEY, JWT_SECRET, LOG_LEVEL, FEATURE_FLAG_XXX
環境変数の取得方法
Python での取得
基本的な取得
import os
# 環境変数を取得
database_url = os.getenv("DATABASE_URL")
redis_host = os.getenv("REDIS_HOST")
api_key = os.getenv("API_KEY")
# デフォルト値を指定
log_level = os.getenv("LOG_LEVEL", "INFO")
必須環境変数のチェック
import os
import sys
def get_required_env(name: str) -> str:
"""必須環境変数を取得"""
value = os.getenv(name)
if value is None:
print(f"Error: {name} is not set")
sys.exit(1)
return value
# 使用例
database_url = get_required_env("DATABASE_URL")
api_key = get_required_env("API_KEY")
pydantic-settings を使用(推奨)
インストール:
pip install pydantic-settings
設定クラスの定義:
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
# Terraformが提供する環境変数
database_url: str
redis_host: str
redis_port: int = 6380
redis_password: str
environment: str
# アプリケーション固有の環境変数
api_key: str
jwt_secret: str
log_level: str = "INFO"
class Config:
# 環境変数は大文字小文字を区別しない
case_sensitive = False
# グローバル設定インスタンス
settings = Settings()
使用例:
from config import settings
# 環境変数を取得
print(settings.database_url)
print(settings.api_key)
print(settings.log_level)
FastAPI での使用:
from fastapi import FastAPI, Depends
from config import Settings
app = FastAPI()
def get_settings():
return Settings()
@app.get("/config")
def read_config(settings: Settings = Depends(get_settings)):
return {
"environment": settings.environment,
"log_level": settings.log_level
}
Node.js での取得
基本的な取得
// 環境変数を取得
const databaseUrl = process.env.DATABASE_URL;
const redisHost = process.env.REDIS_HOST;
const apiKey = process.env.API_KEY;
// デフォルト値を指定
const logLevel = process.env.LOG_LEVEL || 'INFO';
必須環境変数のチェック
function getRequiredEnv(name) {
const value = process.env[name];
if (!value) {
console.error(`Error: ${name} is not set`);
process.exit(1);
}
return value;
}
// 使用例
const databaseUrl = getRequiredEnv('DATABASE_URL');
const apiKey = getRequiredEnv('API_KEY');
設定モジュールの作成(推奨)
config.js:
// config.js
class Config {
constructor() {
// Terraformが提供する環境変数
this.databaseUrl = this.getRequired('DATABASE_URL');
this.redisHost = this.getRequired('REDIS_HOST');
this.redisPort = parseInt(process.env.REDIS_PORT || '6380');
this.redisPassword = this.getRequired('REDIS_PASSWORD');
this.environment = this.getRequired('ENVIRONMENT');
// アプリケーション固有の環境変数
this.apiKey = this.getRequired('API_KEY');
this.jwtSecret = this.getRequired('JWT_SECRET');
this.logLevel = process.env.LOG_LEVEL || 'INFO';
}
getRequired(name) {
const value = process.env[name];
if (!value) {
throw new Error(`Environment variable ${name} is required`);
}
return value;
}
}
module.exports = new Config();
使用例:
const config = require('./config');
console.log(config.databaseUrl);
console.log(config.apiKey);
console.log(config.logLevel);
Next.js での環境変数
Next.js では、環境変数の扱いが少し異なります。
サーバーサイドでの使用:
// pages/api/data.js
export default async function handler(req, res) {
// サーバーサイドではすべての環境変数にアクセス可能
const databaseUrl = process.env.DATABASE_URL;
const apiKey = process.env.API_KEY;
// データベース処理など
res.status(200).json({ data: 'some data' });
}
クライアントサイドで使用する場合:
クライアントサイドで環境変数を使用する場合は、NEXT_PUBLIC_ プレフィックスが必要です。
// .env.dev
NEXT_PUBLIC_API_URL=https://api.example.com
// pages/index.js
export default function Home() {
// クライアントサイドで使用
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
return <div>API URL: {apiUrl}</div>;
}
重要: NEXT_PUBLIC_ プレフィックスがない環境変数は、サーバーサイドでのみ使用できます。機密情報(API キー、データベース接続情報など)は NEXT_PUBLIC_ プレフィックスを使用しないでください。
Terraform が提供する環境変数
以下の環境変数は、Terraform が自動的に設定します。
共通環境変数
| 変数名 | 説明 | 例 |
|---|---|---|
ENVIRONMENT | 環境名 | dev, prd |
MySQL 接続情報
| 変数名 | 説明 | 例 |
|---|---|---|
DATABASE_URL | MySQL 接続 URL | mysql://user:pass@host:3306/db |
MYSQL_HOST | MySQL ホスト名 | mysql-mycompany-dev.mysql.database... |
MYSQL_PORT | MySQL ポート | 3306 |
MYSQL_USER | MySQL ユーザー名 | admin |
MYSQL_PASSWORD | MySQL パスワード | (自動生成) |
MYSQL_DATABASE | MySQL データベース名 | mycompany_dev_db |
詳細は MySQL 接続ガイド を参照してください。
Redis 接続情報(Redis 有効時)
| 変数名 | 説明 | 例 |
|---|---|---|
REDIS_HOST | Redis ホスト | redis-mycompany-dev.redis.cache.windows.net |
REDIS_PORT | Redis ポート | 6380 |
REDIS_PASSWORD | Redis パスワード | (自動生成) |
REDIS_SSL | SSL 有効化 | true |
詳細は Redis 接続ガイド を参照してください。
Storage 接続情報(Storage 有効時)
| 変数名 | 説明 | 例 |
|---|---|---|
AZURE_STORAGE_ACCOUNT_NAME | Storage Account 名 | stmycompanydevfs |
AZURE_STORAGE_ACCOUNT_KEY | Storage Account キー | (自動生成) |
AZURE_STORAGE_CONNECTION_STRING | Storage 接続文字列 | DefaultEndpointsProtocol=https;... |
AZURE_STORAGE_BLOB_ENDPOINT | Blob エンドポイント | https://stmycompanydevfs.blob.core.windows... |
AZURE_STORAGE_CONTAINER_NAME | Blob コンテナ名 | backend-blob |
詳細は Storage アクセスガイド を参照してください。
Backend URL(frontend-backend テンプレート)
| 変数名 | 説明 | 例 |
|---|---|---|
BACKEND_URL | Backend の内部 URL | https://ca-mycompany-backend-dev.internal...io |
NEXT_PUBLIC_API_URL | Backend の API エンドポイント | https://ca-mycompany-backend-dev.japaneast...io |
アプリケーション固有の環境変数
設定方法
アプリケーション固有の環境変数は、.env.{env} ファイルで管理します。
例: .env.dev
# 外部APIキー
API_KEY=your_api_key_here
# JWT設定
JWT_SECRET=your_jwt_secret_here
JWT_EXPIRATION=3600
# ログ設定
LOG_LEVEL=DEBUG
# 機能フラグ
FEATURE_FLAG_NEW_UI=true
暗号化
機密情報を含む環境変数ファイルは、dotenvx で暗号化して Git で管理します。
暗号化コマンド:
# infra CLIを使用
infra encrypt my-tenant --non-interactive
# または直接dotenvxを使用
npx dotenvx encrypt .env.dev
復号化コマンド:
# infra CLIを使用
infra decrypt my-tenant --non-interactive
# または直接dotenvxを使用
npx dotenvx decrypt .env.dev
詳細は 環境変数の管理 を参照してください。
CI/CD での適用
環境変数は、CI/CD パイプラインで自動的に Container Apps に適用されます。
.env.{env}ファイルを更新- Git にコミット・プッシュ
- Environment Apply ワークフローを実行
詳細は CI/CDの使い方 を参照してください。
ベストプラクティス
1. 環境変数名は大文字とアンダースコアを使用
良い例:
DATABASE_URL=mysql://...
API_KEY=abc123
LOG_LEVEL=INFO
悪い例:
databaseUrl=mysql://...
apiKey=abc123
logLevel=INFO
2. デフォルト値を設定する
必須でない環境変数には、デフォルト値を設定します。
Python:
log_level = os.getenv("LOG_LEVEL", "INFO")
max_retries = int(os.getenv("MAX_RETRIES", "3"))
Node.js:
const logLevel = process.env.LOG_LEVEL || 'INFO';
const maxRetries = parseInt(process.env.MAX_RETRIES || '3');
3. 必須環境変数はアプリ起動時にチェック
アプリケーションの起動時に、必須環境変数が設定されているかチェックします。
Python:
import os
import sys
required_env_vars = [
"DATABASE_URL",
"REDIS_HOST",
"API_KEY",
"JWT_SECRET"
]
missing_vars = [var for var in required_env_vars if not os.getenv(var)]
if missing_vars:
print(f"Error: Missing required environment variables: {', '.join(missing_vars)}")
sys.exit(1)
print("All required environment variables are set")
Node.js:
const requiredEnvVars = [
'DATABASE_URL',
'REDIS_HOST',
'API_KEY',
'JWT_SECRET'
];
const missingVars = requiredEnvVars.filter(varName => !process.env[varName]);
if (missingVars.length > 0) {
console.error(`Error: Missing required environment variables: ${missingVars.join(', ')}`);
process.exit(1);
}
console.log('All required environment variables are set');
4. 型変換を適切に行う
環境変数は常に文字列として取得されるため、必要に応じて型変換します。
Python:
# 整数型
max_retries = int(os.getenv("MAX_RETRIES", "3"))
# 浮動小数点型
timeout = float(os.getenv("TIMEOUT", "30.0"))
# ブール型
debug = os.getenv("DEBUG", "false").lower() in ["true", "1", "yes"]
# リスト型
allowed_hosts = os.getenv("ALLOWED_HOSTS", "localhost").split(",")
Node.js:
// 整数型
const maxRetries = parseInt(process.env.MAX_RETRIES || '3');
// 浮動小数点型
const timeout = parseFloat(process.env.TIMEOUT || '30.0');
// ブール型
const debug = process.env.DEBUG === 'true';
// リスト型
const allowedHosts = (process.env.ALLOWED_HOSTS || 'localhost').split(',');
5. 機密情報をログに出力しない
環境変数に機密情報が含まれる場合、ログに出力しないよう注意してください。
悪い例:
import os
print(f"Database URL: {os.getenv('DATABASE_URL')}")
print(f"API Key: {os.getenv('API_KEY')}")
良い例:
import os
# 機密情報はマスク
def mask_secret(value: str) -> str:
if not value or len(value) < 4:
return "****"
return f"{value[:2]}{'*' * (len(value) - 4)}{value[-2:]}"
print(f"Database URL: {mask_secret(os.getenv('DATABASE_URL'))}")
print(f"API Key: {mask_secret(os.getenv('API_KEY'))}")
6. 環境ごとに異なる値を設定
開発環境と本番環境で異なる値を使用します。
例:
# .env.dev
LOG_LEVEL=DEBUG
MAX_CONNECTIONS=5
FEATURE_FLAG_NEW_UI=true
# .env.prd
LOG_LEVEL=INFO
MAX_CONNECTIONS=20
FEATURE_FLAG_NEW_UI=false
トラブルシューティング
環境変数が取得できない
症状: 環境変数が None や undefined になる
原因と対処:
- 環境変数名が間違っている
環境変数名は大文字小文字を区別します。正しい名前を使用してください。
# 間違い
database_url = os.getenv("database_url")
# 正しい
database_url = os.getenv("DATABASE_URL")
- Container Apps に環境変数が設定されていない
Azure Portal で Container Apps の環境変数を確認します。
- Azure Portal → Container Apps → Configuration → Environment variables
- CI/CD で環境変数が適用されていない
Environment Apply ワークフローが正しく実行されているか確認します。
環境変数が反映されない
症状: 環境変数を更新したが、アプリケーションに反映されない
原因と対処:
- Container Apps が再起動されていない
環境変数の変更後、Container Apps を再起動する必要があります。
az containerapp revision restart \
--name ca-myapp-backend-dev \
--resource-group rg-myapp-dev
- Terraform が自動上書きする環境変数を設定している
以下の環境変数は、.env ファイルに記載しても Terraform が自動的に上書きします:
DATABASE_URL,MYSQL_*REDIS_*AZURE_STORAGE_*BACKEND_URL,NEXT_PUBLIC_API_URL
これらの値を変更したい場合は、インフラチームに依頼してください。
環境変数の値がおかしい
症状: 環境変数の値が期待と異なる
デバッグ方法:
- Container Apps のログを確認
az containerapp logs show \
--name ca-myapp-backend-dev \
--resource-group rg-myapp-dev \
--follow
- 起動時に環境変数を出力
デバッグ用に、アプリケーション起動時に環境変数を出力します(機密情報は除く)。
Python:
import os
# デバッグ用(機密情報は除く)
print("Environment variables:")
for key, value in os.environ.items():
if key in ["DATABASE_URL", "REDIS_PASSWORD", "API_KEY", "JWT_SECRET"]:
print(f"{key}: ****")
else:
print(f"{key}: {value}")
Node.js:
// デバッグ用(機密情報は除く)
console.log('Environment variables:');
for (const [key, value] of Object.entries(process.env)) {
if (['DATABASE_URL', 'REDIS_PASSWORD', 'API_KEY', 'JWT_SECRET'].includes(key)) {
console.log(`${key}: ****`);
} else {
console.log(`${key}: ${value}`);
}
}
まとめ
- Terraform が提供する環境変数: データベース、Redis、Storage の接続情報は自動設定
- アプリケーション固有の環境変数:
.env.{env}ファイルで管理し、dotenvx で暗号化 - 必須環境変数はアプリ起動時にチェック: エラーを早期に検出
- 機密情報をログに出力しない: セキュリティを確保
詳細は以下のドキュメントも参照してください:
- Terraform が提供する環境変数仕様 - 自動設定される環境変数の詳細
- 環境変数の管理 - 環境変数の更新方法
- MySQL 接続ガイド - MySQL 接続情報の使用方法
- Redis 接続ガイド - Redis 接続情報の使用方法
- Storage アクセスガイド - Storage 接続情報の使用方法