メインコンテンツまでスキップ

環境変数ガイド

アプリケーションで使用する環境変数の取得方法と管理方法を説明します。

概要

このインフラでは、環境変数は以下の2つの方法で提供されます:

  1. Terraform が自動的に設定する環境変数: データベース接続情報、Redis 接続情報、Storage 接続情報など
  2. アプリケーション固有の環境変数: .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_URLMySQL 接続 URLmysql://user:pass@host:3306/db
MYSQL_HOSTMySQL ホスト名mysql-mycompany-dev.mysql.database...
MYSQL_PORTMySQL ポート3306
MYSQL_USERMySQL ユーザー名admin
MYSQL_PASSWORDMySQL パスワード(自動生成)
MYSQL_DATABASEMySQL データベース名mycompany_dev_db

詳細は MySQL 接続ガイド を参照してください。

Redis 接続情報(Redis 有効時)

変数名説明
REDIS_HOSTRedis ホストredis-mycompany-dev.redis.cache.windows.net
REDIS_PORTRedis ポート6380
REDIS_PASSWORDRedis パスワード(自動生成)
REDIS_SSLSSL 有効化true

詳細は Redis 接続ガイド を参照してください。

Storage 接続情報(Storage 有効時)

変数名説明
AZURE_STORAGE_ACCOUNT_NAMEStorage Account 名stmycompanydevfs
AZURE_STORAGE_ACCOUNT_KEYStorage Account キー(自動生成)
AZURE_STORAGE_CONNECTION_STRINGStorage 接続文字列DefaultEndpointsProtocol=https;...
AZURE_STORAGE_BLOB_ENDPOINTBlob エンドポイントhttps://stmycompanydevfs.blob.core.windows...
AZURE_STORAGE_CONTAINER_NAMEBlob コンテナ名backend-blob

詳細は Storage アクセスガイド を参照してください。

Backend URL(frontend-backend テンプレート)

変数名説明
BACKEND_URLBackend の内部 URLhttps://ca-mycompany-backend-dev.internal...io
NEXT_PUBLIC_API_URLBackend の 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 に適用されます。

  1. .env.{env} ファイルを更新
  2. Git にコミット・プッシュ
  3. 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

トラブルシューティング

環境変数が取得できない

症状: 環境変数が Noneundefined になる

原因と対処:

  1. 環境変数名が間違っている

環境変数名は大文字小文字を区別します。正しい名前を使用してください。

# 間違い
database_url = os.getenv("database_url")

# 正しい
database_url = os.getenv("DATABASE_URL")
  1. Container Apps に環境変数が設定されていない

Azure Portal で Container Apps の環境変数を確認します。

  • Azure Portal → Container Apps → Configuration → Environment variables
  1. CI/CD で環境変数が適用されていない

Environment Apply ワークフローが正しく実行されているか確認します。

環境変数が反映されない

症状: 環境変数を更新したが、アプリケーションに反映されない

原因と対処:

  1. Container Apps が再起動されていない

環境変数の変更後、Container Apps を再起動する必要があります。

az containerapp revision restart \
--name ca-myapp-backend-dev \
--resource-group rg-myapp-dev
  1. Terraform が自動上書きする環境変数を設定している

以下の環境変数は、.env ファイルに記載しても Terraform が自動的に上書きします:

  • DATABASE_URL, MYSQL_*
  • REDIS_*
  • AZURE_STORAGE_*
  • BACKEND_URL, NEXT_PUBLIC_API_URL

これらの値を変更したい場合は、インフラチームに依頼してください。

環境変数の値がおかしい

症状: 環境変数の値が期待と異なる

デバッグ方法:

  1. Container Apps のログを確認
az containerapp logs show \
--name ca-myapp-backend-dev \
--resource-group rg-myapp-dev \
--follow
  1. 起動時に環境変数を出力

デバッグ用に、アプリケーション起動時に環境変数を出力します(機密情報は除く)。

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 で暗号化
  • 必須環境変数はアプリ起動時にチェック: エラーを早期に検出
  • 機密情報をログに出力しない: セキュリティを確保

詳細は以下のドキュメントも参照してください: