Slide 1

Slide 1 text

CUE+Goで安全かつ簡単に設定 ファイルを自動生成してみた Go Conference mini 2023/12/02 Winter in Kyoto kuroda naoki

Slide 2

Slide 2 text

自己紹介 kuro @knkurokuro7 - 名前:kuroda naoki - 所属:株式会社サイバーエージェントAI事業本部 プリズムパートナーカンパニー - 大学生の時、京都で過ごしました。 - 鴨川デルタで毎日のようにお酒を飲んだり、花火 をしたりしていました。 この三角のとこが鴨 川デルタです→

Slide 3

Slide 3 text

CUEについて - Goで書かれた設定記述言語 - JSONやYAMLのように値を設定するだけでなく、同時に型を設定すること もできる。→値と型を同等に扱う。 - 型や制約の表現が豊富(例. string型やint型、デフォルト値、配列、struct、 パターン制約、for文、if ) - 異なるファイル間に定義を分割できる。 →「package」(https://cuelang.org/docs/tutorials/tour/packages/packages/)を使う - Goの処理の中で呼び出して、JSONやYAMLに変換できる。

Slide 4

Slide 4 text

なぜCUEを使いたいのか PipeCDというCDツール(ArgoCDみたいなもの)を使いたい。 →そのために各環境×アプリケーション(ECS or Lambda)×(設定YAML+リソース 記述YAML)=約360YAMLファイル の数のYAMLファイルを作成する必要があった。 →ファイルごとに共通した部分も多く、なるべくcopy&pasteミスを減らしたい。 →CUEでバリデーションをしながらGoでファイルを自動生成 →さらにコマンド化する。

Slide 5

Slide 5 text

具体的な実装(CUE) 1. ベースファイル→全てのファイルで共通 する値(バージョンとか)や各値に対する制 約(cpuやmemoryとか)   2. 各設定ファイル→各YAMLで異なる具体 的な値 ↓同じpackageであればファイルを分割でき る。 

Slide 6

Slide 6 text

具体的な実装(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"を使用)

Slide 7

Slide 7 text

バリデーションの挙動 例えば先ほどの_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

Slide 8

Slide 8 text

Pros&Cons Pros - バリデーションによってミスが減った(気がする?)。 - Goから直接呼び出して操作できるので、ロジックをGo側でも追加できる。 →特定のファイルは生成しないとか、特定の値はJSONファイルに出力する等 - 公式ドキュメントが詳しい。(https://cuelang.org/) Cons - いろんな制約や型を追加したくなるので、慣れてないメンバーには読みにくい。 - CUE→YAMLという流れなので、YAMLを直接書き換えたくなる→CIでチェック。 - 日本語での記事があまりない→これからもっと広まってほしい。。

Slide 9

Slide 9 text

おまけ - CUEもっと広まってほしい。 - playground(https://cuelang.org/play/#cue@export@cue)もあるのでぜひ試 してみてください。 - 使えそうな部分は無限にありそうなので、もし何か思いついたらぜひ教えてくだ さい。 - あと、sivchariさんスライドチェックしてもらってありがとうございます。