はじめに
みなさんGo言語してますか?
Go言語でAPIサーバやCLIツールを作っているときに、クレデンシャル情報をアプリケーションの中で使用するケースが出てくるかと思います。
クレデンシャルな情報をコード内に書いてしまうとGithubでコミットするときに都度コードいじったり、うっかりコミットして焦ったり・・・
今回はGo言語でクレデンシャルな情報を使う場合のアプローチを書きたいと思います。
環境変数で参照する
これはオーソドックスな環境変数を使ったスタイルです。
APIサーバ起動前やCLI実行前に環境変数を設定し、実行します。
application.go
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Getenv("SOMENAME"))
}
$ export SOMENAME=VALUE
$ go run application.go
VALUE
Go言語とは直接関係ありませんが、Dockerを使っている場合は、docker run
時に環境変数を突っ込むといいでしょう。
Docker runのオプションについて
外部ファイルで参照する
設定ファイルを読み取る便利なライブラリViper を使えば外部ファイルから変数の呼び出しが可能です。
環境変数に比べセキュアではありませんが、限られた環境内で使うには十分でしょう。
config.yaml
# viper configuration file
key:
token: tokenvalue
application.go
package main
import (
"fmt"
"os"
"github.com/spf13/viper"
)
func main() {
// set up init config.
viper.SetConfigName("config") // name of config file (without extension)
viper.AddConfigPath(".") // optionally look for config in the working directory
if err := viper.ReadInConfig(); err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(viper.GetString("key.token"))
}
$ go run application.go
tokenvalue
go build時に注入する
go build
のldflags
オプションを使って実行ファイルの中に変数を注入することが可能です。
ビルド時に注入可能なため、デプロイ先や配布先に合わせて注入するなどの応用が可能です。
application.go
package main
import "fmt"
var key string
func main() {
fmt.Println(key)
}
$ go build --ldflags "-X main.key=VALUE" application.go
$ ./application
VALUE
さいごに
クレデンシャルな情報はうっかりやってしまうと大きな事故に繋がるので作るアプリケーションの初期設計からどう管理するか考えておきたいですね。
上に書いた3つの方法でしっかり管理していきましょう。