Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

● Twitter: ysakura_ ● 櫻 勇人(さくら ゆうと) ● 株式会社マネーフォワード ○ サーバーサイドエンジニア ○ Go製のマイクロサービスの開発運用を担当 ● Go歴は3年ほど 自己紹介

Slide 3

Slide 3 text

Goでの設定情報管理

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

dbHost := os.Getenv("DB_HOST") logLevel := os.Getenv("LOG_LEVEL") 環境変数を直接読み込む ● 読み込み方法 ○ os.Getenvを利用して読み込む ● 良かった点 ○ サクッと書ける ● 苦労した点 ○ 設定項目が増えてくるとコードの可読性が下がる ■ os.Getenv がひたすらに並ぶ ● 次にやったこと ○ 階層構造がある管理方法にしたい ■ 環境変数を構造体にマッピングする

Slide 7

Slide 7 text

● 読み込み方法 ○ 環境変数を構造体にマッピングする ● ライブラリの例 ○ 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"` }

Slide 8

Slide 8 text

db: host: "{{ env "DB_HOST" }}" log: level: "{{ env "LOG_LEVEL" }}" ● 読み込み方法 ○ yamlのtemplateで環境変数を読み込む ■ text/templateを利用 ○ 生成したyamlを構造体にマッピング ● 利用したライブラリ ○ Masterminds/sprig ■ Template関数のライブラリ ● {{ env “HOGE” }} で環境変数を読み込めるので採用 ○ go-yaml/yaml ● 良かった点 ○ 設定項目の全容が一目で分かる様になった ○ 設定項目と環境変数の対応が一目で分かる様になった Templateで環境変数を読み込み、設定ファイルを生成する

Slide 9

Slide 9 text

● 一番初め ○ os.Getenvを使ったが 項目数が増えるにつれて可読性が下がった ● 2つめ ○ 構造体にマッピングする様にしたが 環境変数の全体像が分かりづらくなった ● 直近 ○ 環境変数を読むTemplateを使って 設定ファイルを生成する様にした まとめ

Slide 10

Slide 10 text

Thank you!