Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goでの設定情報管理に苦労した話

 Goでの設定情報管理に苦労した話

Kyoto.go remote #20 Discord LT会 で発表した内容です。

6203b542bcb0b87df6005a09b2443a27?s=128

ysakura_

May 30, 2021
Tweet

Transcript

  1. Goでの設定情報管理に苦労した話

  2. • Twitter: ysakura_ • 櫻 勇人(さくら ゆうと) • 株式会社マネーフォワード ◦

    サーバーサイドエンジニア ◦ Go製のマイクロサービスの開発運用を担当 • Go歴は3年ほど 自己紹介
  3. Goでの設定情報管理

  4. Goでの設定情報管理どうしてますか? 設定情報の例) DBのホスト名

  5. 自分は苦労したので その過程を共有 ※ 今回は環境変数の利用を前提

  6. dbHost := os.Getenv("DB_HOST") logLevel := os.Getenv("LOG_LEVEL") 環境変数を直接読み込む • 読み込み方法 ◦

    os.Getenvを利用して読み込む • 良かった点 ◦ サクッと書ける • 苦労した点 ◦ 設定項目が増えてくるとコードの可読性が下がる ▪ os.Getenv がひたすらに並ぶ • 次にやったこと ◦ 階層構造がある管理方法にしたい ▪ 環境変数を構造体にマッピングする
  7. • 読み込み方法 ◦ 環境変数を構造体にマッピングする • ライブラリの例 ◦ caarlos0/env • 良かった点

    ◦ 可読性が上がった • 苦労した点 ◦ 環境変数の全体像が分かりづらい ▪ 構造体がネストしているケース ▪ 設定項目と対応する環境変数の一覧を一目で見たい • 運用をする上で、設定すべき情報を把握しやすくしたい • 次にやったこと ◦ 1ファイルに、環境変数と設定項目のマッピングが書かれていて欲しい ▪ Templateで環境変数を読み込み、設定ファイルを生成する 環境変数を構造体にマッピングする type Config struct { DBConfig LogConfig } type DBConfig struct { Host string `env:"DB_HOST"` } type LogConfig struct { Level string `env:"LOG_LEVEL"` }
  8. db: host: "{{ env "DB_HOST" }}" log: level: "{{ env

    "LOG_LEVEL" }}" • 読み込み方法 ◦ yamlのtemplateで環境変数を読み込む ▪ text/templateを利用 ◦ 生成したyamlを構造体にマッピング • 利用したライブラリ ◦ Masterminds/sprig ▪ Template関数のライブラリ • {{ env “HOGE” }} で環境変数を読み込めるので採用 ◦ go-yaml/yaml • 良かった点 ◦ 設定項目の全容が一目で分かる様になった ◦ 設定項目と環境変数の対応が一目で分かる様になった Templateで環境変数を読み込み、設定ファイルを生成する
  9. • 一番初め ◦ os.Getenvを使ったが 項目数が増えるにつれて可読性が下がった • 2つめ ◦ 構造体にマッピングする様にしたが 環境変数の全体像が分かりづらくなった

    • 直近 ◦ 環境変数を読むTemplateを使って 設定ファイルを生成する様にした まとめ
  10. Thank you!