JS.tfをHCLを書かずに使う

created at
updated at
technology CDKTF Terraform TypeScript IaC

最近こんな記事を見かけました。
【JavaScript × Terraform】次世代のモダン AltJS「JS.tf」の紹介
人類は HCL (Hashicorp Configuration Language) で JavaScript を記述するべきなので、次世代のモダン AltJS である「JS.tf」をリリースしました。

いや冷静に考えてHCLって書きづらくないですか、しかもresourceやdata sourceを参照するのもなんか分かりづらいし…
しかしTerraformにはHCLを書かなくてもいい最強のテクノロジーがあります。
それこそが、CDK for Terraformです。

CDK for Terraform(以下CDKTF)はHCLTypeScriptPythonGoC#Javaのコードから生成できるツールです。
いわゆるAWS CDKのTerraform版ですね
cdktf repositories · GitHub にあるとおり、多数のプロバイダーの定義が用意されていて、ここにない物もprovider addコマンドでコード生成することができます。
実際に使っている例は GitHub - rokoucha/alicization: Synthesis Ritual をご参照ください。

では実際に書いていきましょう、ということで完成品は GitHub - rokoucha/cdktfjs: Time to write HCL is a waste of time in life, so let's use CDK for Terraform. です。
基本的には DataJs~~~ をどんどんnewしていきます。
ただし、JS.tfのバグで一部の型が壊れているので回避が必要です。
認識している範囲では
  • DataJsConstvalue[key: string]: any しか受け付けない
  • as any しましょう
  • _
    tsconst message = new DataJsConst(this, 'message', {
      name: 'message',
      value: 'Hello, world!' as any,
    })
  • DataJsFunctionCall の型が壊れていてsynthした結果が壊れている
  • addOverride しましょう
  • _
    tsconst helloWorld = new DataJsFunctionCall(this, 'hello-world', {
      caller: 'console',
      function: 'log',
      args: [],
    })
    helloWorld.addOverride('args', [message.id])
があります。ユニオン型が軒並みおかしいので他にもありそう…

書き追わったら cdktf diff をするとHCLが生成されてplanが走ります。
問題なさそうであれば cdktf deploy で反映しましょう!
コードは cdktf.out/stacks/<スタック名>/main.js に生成されます
あとはこのJSファイルを実行すれば…
https://scrapbox.io/files/67454e7fe910c047af7c8d99.png
無事にHCLを書かずにJavaScriptを書けました!

あれ…さっきまでTypeScriptを書いていたような…