大概数ヶ月前、私はgolangで環境変数を設定する方法についての記事を書きました。環境変数をエレガントに設定することは非常に重要なことですので、私はこのために簡単な関数を作成しました。
当初の考えは非常にシンプルでした。対応するconfig
ファイルが提供されている場合、その中のキー/値をos.Setenv
を使用して設定します。その後、アプリ全体でos.Getenv
を直接使用して値を取得できます。
しかし、正式なデプロイ時にはいくつかの問題が発生することが避けられません:
- 設定ファイルは必ずしもyaml形式であるとは限らず、他の形式である可能性もあります。
- 時には外部サービス(consul、etcdなど)を使用して環境変数を注入したい場合がありますが、現在の方法では
os.Getenv
を使用しています。 - 異なるパスから設定ファイルを読み込むことができます。
- コマンドラインを介して変数を設定できます。
- その他の予期しない問題が発生する可能性があります。
小規模なプロジェクトでは、これによって問題が解決する場合もありますが、より柔軟な設定方法が必要になると、これだけでは不十分です。
これらの問題は、golangにはすでに成熟した解決策が存在しています。それがViperと呼ばれるものです。
VIPER
VIPERは非常に強力な環境変数設定パッケージです。以下の機能をサポートしています:
- デフォルト値の設定
- 異なる形式の設定ファイルのサポート(
json
、toml
、yaml
) - 設定ファイルの変更を監視することができます(これにより、サーバーを再起動する必要がありません!)
- リモートサーバーから変数を取得することができます(例:
consul
またはetcd
) flag
を使用して変数を取得することができますreader
から変数を取得することができます。これは、異なるソースから変数を設定できることを意味します。
基本的な使用方法
まず、go getまたはmodを使用してViperをダウンロードします。
go get github.com/spf13/viper
func main() {
viper.SetDefault("AWS_ACCESS_TOKEN", "AWS123456789") // デフォルト値の設定
viper.SetConfigName("config") // configファイルの名前を指定
viper.AddConfigPath("./config")
viper.ReadInConfig()
viper.AutomaticEnv()
}
SetDefault(key, value)
:デフォルト値の設定SetConfigName(name)
:設定ファイルの名前を設定します。例えば、設定ファイルがconfig.yml
と呼ばれる場合、config
とします。なぜ型を指定しないのかというと、viperが自動的に処理してくれるからです。AddConfigPath
:複数のフォルダーを設定できますReadInConfig
:呼び出す必要があります。設定を実際に読み込むためです。AutomaticEnv
:ENV
の変数をviperに自動的に同期させることができます
Viperは、設定を行うための多くの関数も提供しています。
変数の取得
変数を設定した後、viper.Get
を使用して読み取ることができます。Get
はinterface{}
を返しますが、viperはviper.GetString
、viper.GetDuration
、viper.GetStringMap
など、多くの型変換も提供しています。
func main() {
fmt.Println(viper.GetString("AWS_ACCESS_TOKEN"))
fmt.Println(viper.GetUint32("YOUR_INT"))
fmt.Println(viper.GetTime("YOUR_TIME"))
}
結論
変数の設定は難しいと言えるかもしれませんが、簡単な場合もあれば複雑な場合もあります。考慮すべきことは想像以上に多いですが、VIPER
は多くの一般的な使用シナリオを処理してくれます。
また、アクセストークンやシークレットキーなどの設定を行う際には、.gitignore
を使用してコミット時に誤ってGitHubにプッシュされないようにすることを特に注意してください。