プロジェクトの環境変数を設定する-VIPER

作成者:カランカラン
💡

質問やフィードバックがありましたら、フォームからお願いします

本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

数ヶ月前、私は golang で環境変数を設定する方法についての記事を書きました。環境変数を優雅に設定することは非常に重要なことですので、この目的のためにシンプルな関数を作成しました。

当初の考えはシンプルでした。対応する config ファイルがある場合、その中の key/value を os.Setenv を使って設定するというものでした。その後、アプリ全体で os.Getenv を使って値を取得できるようになります。

しかし、正式にデプロイを行うと、いくつかの問題が見えてきます:

  • 設定ファイルは必ずしも yaml ではなく、他の形式である可能性もあります。
  • 時には外部サービス(consul, etcd など)を通じて環境変数を注入したい場合がありますが、現状の書き方では os.Getenv を使用しています。
  • 異なるパスから設定ファイルを読み込むことができます。
  • コマンドラインを通じて変数を設定することができます。
  • その他、予想外の問題が発生することがあります。

小さなプロジェクトではこれで問題が解決しましたが、より柔軟な設定方法が必要になると、これだけでは不十分です。

実は、これらの問題に対して golang には成熟した解決策があり、それが Viper です。

VIPER

Viper は非常に強力な環境変数設定ライブラリです。以下の機能をサポートしています:

  • デフォルト値
  • 様々な形式の設定ファイルをサポート(json, toml, yaml
  • 設定ファイルの変更を監視することができます(これでサーバーを再起動する必要がありません!)
  • リモートサーバーから変数を取得することができます(例えば consuletcd
  • 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 のファイル名を設定します。例えば、私たちの設定ファイルが config.yml であれば、名前は config です。なぜ type を指定しないのかと言うと、viper が自動的に処理してくれるからです。
  • AddConfigPath:複数のフォルダを設定できます。
  • ReadInConfig:実際に設定を読み込むために呼び出す必要があります。
  • AutomaticEnvENV の変数を自動的に viper に同期させることができます。

Viper には設定を簡単に行うための多くの関数が用意されています。

変数の取得

変数を設定した後は、viper.Get を使って読み取ることができます。Getinterface{} を返しますが、viper には viper.GetStringviper.GetDurationviper.GetStringMap など、さまざまな型変換の関数も提供されています。

func main() {
	fmt.Println(viper.GetString("AWS_ACCESS_TOKEN"))
  fmt.Println(viper.GetUint32("YOUR_INT"))
  fmt.Println(viper.GetTime("YOUR_TIME"))
}

まとめ

変数設定は簡単とも言えず、難しいとも言えません。考慮すべきことは想像以上に多く、VIPER が多くの一般的な使用シナリオを処理してくれます。

特に注意したいのは、access token や secret key などを設定する際には、必ず .gitignore に追加して、意図せず GitHub にプッシュしてしまうことを避けるようにしてください。

この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

Buy me a coffee