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
CUE+Goで安全かつ簡単に設定ファイルを自動生成してみた
Search
kuro
December 01, 2023
0
750
CUE+Goで安全かつ簡単に設定ファイルを自動生成してみた
Go Conference mini 2023/12/02 Winter in Kyotoの登壇資料です。
kuro
December 01, 2023
Tweet
Share
More Decks by kuro
See All by kuro
サプライチェーン攻撃に学ぶModuleの仕組みと セキュリティ対策
kuro_kurorrr
3
870
PipeCD と Bucketeer の Document MCP Serverを作って公開した話
kuro_kurorrr
0
130
近頃の気になるGo testingパッケージ
kuro_kurorrr
3
540
Go1.25からのGOMAXPROCS
kuro_kurorrr
2
1.4k
Go Modules: From Basics to Beyond / Go Modulesの基本とその先へ
kuro_kurorrr
0
160
最速Green Tea 🍵 Garbage Collector
kuro_kurorrr
4
840
fieldalignmentから見るGoの構造体
kuro_kurorrr
0
190
Go1.24 go vetとtestsアナライザ
kuro_kurorrr
2
1.2k
Go1.24で testing.B.Loopが爆誕
kuro_kurorrr
0
250
Featured
See All Featured
Site-Speed That Sticks
csswizardry
11
880
Thoughts on Productivity
jonyablonski
70
4.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Side Projects
sachag
455
43k
How STYLIGHT went responsive
nonsquared
100
5.8k
GraphQLとの向き合い方2022年版
quramy
49
14k
Practical Orchestrator
shlominoach
190
11k
Bash Introduction
62gerente
615
210k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
Automating Front-end Workflow
addyosmani
1371
200k
The Language of Interfaces
destraynor
162
25k
Transcript
CUE+Goで安全かつ簡単に設定 ファイルを自動生成してみた Go Conference mini 2023/12/02 Winter in Kyoto kuroda
naoki
自己紹介 kuro @knkurokuro7 - 名前:kuroda naoki - 所属:株式会社サイバーエージェントAI事業本部 プリズムパートナーカンパニー -
大学生の時、京都で過ごしました。 - 鴨川デルタで毎日のようにお酒を飲んだり、花火 をしたりしていました。 この三角のとこが鴨 川デルタです→
CUEについて - Goで書かれた設定記述言語 - JSONやYAMLのように値を設定するだけでなく、同時に型を設定すること もできる。→値と型を同等に扱う。 - 型や制約の表現が豊富(例. string型やint型、デフォルト値、配列、struct、 パターン制約、for文、if
) - 異なるファイル間に定義を分割できる。 →「package」(https://cuelang.org/docs/tutorials/tour/packages/packages/)を使う - Goの処理の中で呼び出して、JSONやYAMLに変換できる。
なぜCUEを使いたいのか PipeCDというCDツール(ArgoCDみたいなもの)を使いたい。 →そのために各環境×アプリケーション(ECS or Lambda)×(設定YAML+リソース 記述YAML)=約360YAMLファイル の数のYAMLファイルを作成する必要があった。 →ファイルごとに共通した部分も多く、なるべくcopy&pasteミスを減らしたい。 →CUEでバリデーションをしながらGoでファイルを自動生成 →さらにコマンド化する。
具体的な実装(CUE) 1. ベースファイル→全てのファイルで共通 する値(バージョンとか)や各値に対する制 約(cpuやmemoryとか) 2. 各設定ファイル→各YAMLで異なる具体 的な値 ↓同じpackageであればファイルを分割でき る。
具体的な実装(Go) 1. ベースファイルと各個別ファイル をマージしてインスタンスを作成 2. バリデーションを実行 3. 各CUEのvalueごとにYAMLに 変換 4.
YAMLファイルに出力 ("cuelang.org/go/cue"、"cuelang.or g/go/cue/load"、"cuelang.org/go/en coding/yaml"を使用)
バリデーションの挙動 例えば先ほどの_cpuの値を 25600としたとき。 make pipecdコマンドを叩くと、 {"time":"2023-12-02T06:08:45.056174+09:00","level": "ERROR","msg":"failed to generate cue
file: value error (path = cue/app/dev/fuga/taskdef.cue): _cpu: invalid value 25600 (out of bound <=4096)","syslog":{"appname":"unknown","env":"loca l","tag":"","commit":""}} make: *** [pipecd] Error 1
Pros&Cons Pros - バリデーションによってミスが減った(気がする?)。 - Goから直接呼び出して操作できるので、ロジックをGo側でも追加できる。 →特定のファイルは生成しないとか、特定の値はJSONファイルに出力する等 - 公式ドキュメントが詳しい。(https://cuelang.org/) Cons
- いろんな制約や型を追加したくなるので、慣れてないメンバーには読みにくい。 - CUE→YAMLという流れなので、YAMLを直接書き換えたくなる→CIでチェック。 - 日本語での記事があまりない→これからもっと広まってほしい。。
おまけ - CUEもっと広まってほしい。 - playground(https://cuelang.org/play/#cue@export@cue)もあるのでぜひ試 してみてください。 - 使えそうな部分は無限にありそうなので、もし何か思いついたらぜひ教えてくだ さい。 -
あと、sivchariさんスライドチェックしてもらってありがとうございます。