Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goでの設定情報管理に苦労した話
Search
ysakura_
May 30, 2021
Programming
0
400
Goでの設定情報管理に苦労した話
Kyoto.go remote #20 Discord LT会 で発表した内容です。
ysakura_
May 30, 2021
Tweet
Share
More Decks by ysakura_
See All by ysakura_
OpenAPI を用いた GoのAPIサーバー の開発自動化
ysakura_
0
78
マネーフォワードにおけるGoとマイクロサービスの活用事例
ysakura_
0
510
Other Decks in Programming
See All in Programming
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
200
MDN Web Docs に日本語翻訳でコントリビュートしたくなる
ohmori_yusuke
1
120
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
150
Node-RED を(HTTP で)つなげる MCP サーバーを作ってみた
highu
0
120
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
170
A full stack side project webapp all in Kotlin (KotlinConf 2025)
dankim
0
120
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
220
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
890
初学者でも今すぐできる、Claude Codeの生産性を10倍上げるTips
s4yuba
16
11k
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
830
VS Code Update for GitHub Copilot
74th
2
650
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
730
Featured
See All Featured
Thoughts on Productivity
jonyablonski
69
4.7k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
A better future with KSS
kneath
238
17k
Speed Design
sergeychernyshev
32
1k
Designing for Performance
lara
610
69k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Fireside Chat
paigeccino
37
3.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
Docker and Python
trallard
44
3.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Building Adaptive Systems
keathley
43
2.7k
Transcript
Goでの設定情報管理に苦労した話
• Twitter: ysakura_ • 櫻 勇人(さくら ゆうと) • 株式会社マネーフォワード ◦
サーバーサイドエンジニア ◦ Go製のマイクロサービスの開発運用を担当 • Go歴は3年ほど 自己紹介
Goでの設定情報管理
Goでの設定情報管理どうしてますか? 設定情報の例) DBのホスト名
自分は苦労したので その過程を共有 ※ 今回は環境変数の利用を前提
dbHost := os.Getenv("DB_HOST") logLevel := os.Getenv("LOG_LEVEL") 環境変数を直接読み込む • 読み込み方法 ◦
os.Getenvを利用して読み込む • 良かった点 ◦ サクッと書ける • 苦労した点 ◦ 設定項目が増えてくるとコードの可読性が下がる ▪ os.Getenv がひたすらに並ぶ • 次にやったこと ◦ 階層構造がある管理方法にしたい ▪ 環境変数を構造体にマッピングする
• 読み込み方法 ◦ 環境変数を構造体にマッピングする • ライブラリの例 ◦ 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"` }
db: host: "{{ env "DB_HOST" }}" log: level: "{{ env
"LOG_LEVEL" }}" • 読み込み方法 ◦ yamlのtemplateで環境変数を読み込む ▪ text/templateを利用 ◦ 生成したyamlを構造体にマッピング • 利用したライブラリ ◦ Masterminds/sprig ▪ Template関数のライブラリ • {{ env “HOGE” }} で環境変数を読み込めるので採用 ◦ go-yaml/yaml • 良かった点 ◦ 設定項目の全容が一目で分かる様になった ◦ 設定項目と環境変数の対応が一目で分かる様になった Templateで環境変数を読み込み、設定ファイルを生成する
• 一番初め ◦ os.Getenvを使ったが 項目数が増えるにつれて可読性が下がった • 2つめ ◦ 構造体にマッピングする様にしたが 環境変数の全体像が分かりづらくなった
• 直近 ◦ 環境変数を読むTemplateを使って 設定ファイルを生成する様にした まとめ
Thank you!