ecspressoの設定ファイルにはJsonnetをお勧めします

こちらの記事へのアンサーです。(記事ありがとうございます!)

dev.classmethod.jp

ecspresso init したときに生成されるデフォルトのファイル形式(タスク定義、サービス定義)は JSON + Go の text/template 関数形式なのですが、ecspresso はずいぶん前 (2021年の v1.7)から Jsonnet をネイティブに対応しています。また、v2.4からはテンプレート記法だけではなく Jsonnet native function というものが導入され、関数の記述がきれいに書けるようになっています。

sfujiwara.hatenablog.com

以下のようなテンプレート記法の定義ファイルの記述箇所は

printfで組み立てる場合 スタック名の命名規則が <ベース名>-<環境> のように規則的であれば、printfでサフィックスを組み立てたほうが楽です。

ecs-task-def.json

"awslogs-group": "{{ cfn_output (printf `EcspressoDemoInfraStack-%s` (must_env `ENV`)) `LogGroupName` }}"

Jsonnet と native func を使うと以下のように、かなり読みやすく書けるようになっています。

local must_env = std.native('must_env');
local cfn_output = std.native('cfn_output');
local envName = must_env('ENV');

// ...
'awslogs-group': cfn_output('EcspressoDemoInfraStack-%s' % envName, 'LogGroupName'),

ほかにも Jsonnet を使うと、以下のように読みやすく書ける機能が豊富に使えます。お勧めです。

  • コメントが書ける
  • 変数定義ができる (text/templateでもできますが…)
  • 他のファイルの include (import) もできる
  • ecspresso が提供する関数の自然な呼び出し
  • Jsonnet の標準関数 も自由に使える

ただし、Jsonnet で関数やimportなどを自由に駆使しすぎると、いざ出来上がった設定ファイルが後から読めない!ということにもなりがちです。

その場合は ecspresso render で JSON / Jsonnet としてプレーンな形式でレンダリングできるので、そこからリファクタリングをやり直すのがよいでしょう。ecspresso diff を使えば、リファクタリング後の定義ファイルが実際に差分を発生させないことも確認できるので、安心してやり直せますね。

ということで、ecspresso の設定/定義ファイルには Jsonnet を強くお勧めします、という作者からのお知らせでした。 まずは ecspresso init --jsonnet や ecspresso render --jsonnet でお試し下さい。


余談ですが、JSON + template 記法の小さな失敗と Jsonnet での解決へ至る道の経緯は以下の発表資料にあります。いろいろありますね。

speakerdeck.com