Go設定:Viper+env
設定管理の概要
Go実践において設定管理は、アプリケーションの柔軟性と保守性を左右します。設定はコードに埋め込むのではなく、外部ファイルや環境変数で管理することで、デプロイ環境ごとに差異を吸収できます。Goでは標準ライブラリだけでなく、viperやgodotenvといったサードパーティライブラリが広く利用されています。
設定管理の基本的な流れは、まず設定ファイル(YAML, JSON, TOMLなど)を読み込み、必要に応じて環境変数で上書きし、最後にアプリケーションに注入するというものです。このプロセスを自動化することで、開発者は設定ミスを減らし、CI/CDパイプラインでの一貫性を保てます。
viperとgodotenv
viperは設定ファイルの読み込み、環境変数の取得、デフォルト値の設定などを統合的に扱えるライブラリです。YAML, JSON, TOML, HCL, INI など多様なフォーマットをサポートし、再読み込み機能も備えています。godotenvは主に.envファイルを読み込み、環境変数に設定するだけの軽量ツールです。
実際の使い分けとしては、複雑な設定構造や階層化が必要な場合はviperを選択し、単純に環境変数をロードするだけならgodotenvで十分です。以下はviperを使った基本的な設定読み込み例です。
import (
"github.com/spf13/viper"
)
func initConfig() {
viper.SetConfigName("config") // config.yaml
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AutomaticEnv() // 環境変数を自動で取得
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
}
YAML/JSON/TOMLの読み込み
viperは複数フォーマットを同時に扱えるため、開発者はプロジェクトに最適な形式を選択できます。YAMLは可読性が高く、JSONは既存のAPIと親和性があるため、TOMLは構造化された設定に適しています。
以下はJSONとTOMLを読み込むサンプルです。viperはファイル名とタイプを指定するだけで自動的にパースします。
viper.SetConfigName("app") // app.json
viper.SetConfigType("json")
viper.AddConfigPath("./configs")
viper.ReadInConfig()
// TOML
viper.SetConfigName("app") // app.toml
viper.SetConfigType("toml")
viper.AddConfigPath("./configs")
viper.ReadInConfig()
環境変数とconfig統合
環境変数はデプロイ環境ごとに差異を持たせるために不可欠です。viperのAutomaticEnv()を呼び出すと、設定ファイルのキーと同名の環境変数が自動で上書きされます。キー名は大文字に変換され、アンダースコアで区切られます。
例えば、config.yamlに database.host が定義されている場合、環境変数 DATABASE_HOST を設定すると、viperはその値で上書きします。これにより、開発環境と本番環境で同じコードベースを使いながら、設定を切り替えることができます。
コメント
コメントを投稿