$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goでの設定情報管理に苦労した話
Search
ysakura_
May 30, 2021
Programming
0
410
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
81
マネーフォワードにおけるGoとマイクロサービスの活用事例
ysakura_
0
560
Other Decks in Programming
See All in Programming
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
420
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
7.3k
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
2.8k
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
170
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.9k
JETLS.jl ─ A New Language Server for Julia
abap34
1
400
tparseでgo testの出力を見やすくする
utgwkk
2
230
TestingOsaka6_Ozono
o3
0
160
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.3k
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.4k
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
470
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
130
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Thoughts on Productivity
jonyablonski
73
5k
Faster Mobile Websites
deanohume
310
31k
Producing Creativity
orderedlist
PRO
348
40k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
How STYLIGHT went responsive
nonsquared
100
6k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
GitHub's CSS Performance
jonrohan
1032
470k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
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!