Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Goでの設定情報管理に苦労した話
ysakura_
May 30, 2021
Programming
0
150
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
56
マネーフォワードにおけるGoとマイクロサービスの活用事例
ysakura_
0
250
Other Decks in Programming
See All in Programming
io22 extended What's new in app performance
veronikapj
0
330
trocco® の品質を守る、とても普通な取り組み
kekekenta
0
350
Overview of The Modern Data Stack / モダンデータスタック概論
satoshihirose
6
3.2k
Springin‘でみんなもクリエイターに!
ueponx
0
120
Amazon Aurora の v1 が EOL になるので 10 クラスタアップグレードして出てきたノウハウ
dekokun
0
840
Oracle REST Data Service: APEX Office Hours
thatjeffsmith
0
660
#JJUG_CCC 「サポート」は製品開発? - JDBCライブラリ屋さんが実践する攻めのテクニカルサポートとJavaエンジニアのキャリアについて -
cdataj
0
400
Scrum Fest Osaka 2022/5年で200人になったスタートアップの アジャイル開発の歴史とリアル
atamaplus
1
770
ドメインモデル方式のクラス設計 座談会
masuda220
PRO
3
1k
Embracing commonMain for Android Development - Droidcon SF 2022
handstandsam
4
230
EFFICIENT CREATION OF AN EMPTY COLLECTION IN .NET
abt
0
150
Make the most of Django - PyCon Italia 2022
pauloxnet
0
110
Featured
See All Featured
Unsuck your backbone
ammeep
659
55k
Keith and Marios Guide to Fast Websites
keithpitt
404
21k
A better future with KSS
kneath
225
15k
Automating Front-end Workflow
addyosmani
1351
200k
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
172
8.4k
The Invisible Customer
myddelton
110
11k
Code Review Best Practice
trishagee
43
8.9k
Rails Girls Zürich Keynote
gr2m
86
12k
It's Worth the Effort
3n
172
25k
Git: the NoSQL Database
bkeepers
PRO
415
59k
Clear Off the Table
cherdarchuk
79
280k
Navigating Team Friction
lara
175
11k
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!