· 2分で読了
Golangプロジェクトで環境変数を設定する方法
この記事は中国語から自動翻訳されたものです。翻訳によりニュアンスが失われている場合があります。
はじめに
プロジェクトの開発時には異なる環境を切り替えることがよくあり、そのため僕たちは通常、様々な環境変数を設定する。しかし、コード内に値を直接ハードコードしてしまうと、変更のたびに修正するのが非常に面倒だ。動的な方法で環境変数を渡すことができれば、無駄なコード修正を大幅に減らすことができ、プログラムも比較的クリーンに保てる。
flag
Golangでは通常、flag パッケージを利用して同様の効果を得ることができる。例えば以下のような形だ:
var env string
var accessToken string
func main() {
flag.StringVar(&env, 'ENV', 'development', 'your current env')
flag.StringVar(&accessToken, 'ACCESS_TOKEN', 'xxx-oo-ooo', 'your API access token')
flag.Parse()
// start your application
}
または、こちらの記事で紹介されている方法を参考に、go build -ldflag を使ってコンパイル時に変数を設定することもできる。
確かにこれならプログラム内に値をハードコードする必要はないが、変数は事前に定義しておく必要がある。
YAMLからの読み込み
上述の問題を解決するために、YAML(あるいは好みのフォーマット)を使って環境変数を一元管理することができる。例えば以下のようにする:
func LoadEnv(filename string) bool {
file, err := ioutil.ReadFile(filename)
if err != nil {
// 在 production,我們可能會直接用 console 設定環境變數
return false
}
var config := make(map[string]string)
yaml.Unmarshal(file, &config)
for k, v := range config {
os.Setenv(k, v)
}
}
YAML内の変数を読み込んだ後、まとめて os.Setenv(k, v) で設定する。こうすればローカル環境でも簡単に変数を調整できるようになる。なお、設定ファイルは必ず .gitignore などで除外しておくことを忘れないようにしよう。そうしないと、変数の中に機密情報が含まれていて、たまたま公開リポジトリだった場合に丸見えになってしまう。
おわりに
僕はこの処理を行うためのごくシンプルな リポジトリ を作成した。もし実際の開発で本当に必要になったら、さらに改善していこうと思う XD
関連記事
- 測定が目標になるとき:窓税からPull Request数まで かつて僕は小さなツールを自作し、四半期で自分がどれだけPRに貢献したか、レビューコメントをどれだけ残したか、チケットをどれだけ消化したかを集計して、上司にアウトプットを証明しようとしたことがある。上司は淡々と、評価はアウトプットだけで見るものではないと言った。数年後、僕はようやく理解した――測定が目標になるとき、それはもはや良い測定ではなくなるのだ。英国の窓税、ハノイのネズミ駆除の報奨金から、現代のPR数による開発者評価に至るまで、そのメカニズムはまったく同じだ。
- Cloudflare Images を画像ストレージ・変換ソリューションとして使う ウェブページに画像を1枚置くのはフロントエンドにとって最も簡単なことだが、リサイズや各種フォーマットの生成、さらにはトラフィックの負荷に耐えることまで完璧にやろうとすると、実際には一つの包括的なソリューションが必要になる。僕はその後、すべて Cloudflare Images に任せるようになり、オリジナル画像1枚だけを渡すようにしている。
- もう AWS Access Key を使うのはやめよう Access Key は AWS において見落とされがちなセキュリティリスクだ。OIDC と IAM Role を組み合わせることで、GitHub Actions にシークレットを一切保持させることなく、安全に AWS リソースを操作できるようにする。
- データベース主キー:AUTO_INCREMENT、UUID、そしてUUIDv7 バックエンド開発で度々直面する主キーの決定。auto incrementを使うべきか、それともUUIDか?衝突への懸念は?UUIDv7とcreated_at + インデックスの性能差はどれほどか?実際に2,000万件のデータで検証したベンチマークと設計上の意思決定を解説する。