LoginSignup
6
1

More than 5 years have passed since last update.

Go言語でクレデンシャルな情報をコード内に書き込まずに使用する3つのアプローチ

Last updated at Posted at 2019-04-04

はじめに

みなさん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 buildldflagsオプションを使って実行ファイルの中に変数を注入することが可能です。
ビルド時に注入可能なため、デプロイ先や配布先に合わせて注入するなどの応用が可能です。

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つの方法でしっかり管理していきましょう。

6
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1