CDKTF in TypeScriptでインフラの定義を部分的にラップした関数を提供したい。
セットアップ
tsupでビルドしたいので入れておく。ここではpnpmを使う。
pnpm init
pnpm install -D tsup @types/node typescript
あとはcdktf自体もhomebrewかなんかでインストールしておく必要あり。
cdktfとconstructはcustom providerを利用する側でも使うので peerDependencies
に入れておくのが良さそうだが、正しいかは不明。
TypeScriptコードの生成
ここまで準備できたら、ベースにしたいproviderを terraformProviders
で指定した cdktf.json
を作る
{
"language": "typescript",
"app": "exit 0",
"terraformProviders": [
"tailor-platform/tailor@~> 0.0"
]
}
TypeScriptのproviderをgenerateする
cdktf get
すると同ディレクトリに .gen
が生える。
あとは生成されたproviderを使って、公開したい関数を index.ts
らへんに準備しておく。
export * as Tailor from "../.gen/providers/tailor";
export const addSomeUsefulResources = () => {
/**
* いろいろいい感じにリソースを追加してくれる何かしらのコード...
*/
}
ビルド
tsupの設定ファイルはこんな感じ。
/// <reference types="node" />
import { defineConfig } from "tsup";
export default defineConfig({
format: ["cjs"],
entry: ["src/index.ts"],
clean: true,
minify: true,
dts: true,
});
cdktfはesmに対応していないので format
はCommonJS決め打ち。
最終的にはnpmで公開したいので exports
と types
を追加。
{
"name": "my-cdktf-custom-provider"
"version": "0.1.0",
"exports": {
".": "./dist/index.js",
},
"types": "./dist/index.d.ts"
}
こういうコマンドも用意しておくと便利
"scripts": {
"cdktf:fetch": "cdktf get",
"build": "pnpm cdktf:fetch && pnpm type-check && tsup",
"package:publish": "pnpm build && pnpm publish --access public",
}
これで pnpm package:publish
を実行するだけでパッケージをビルドして公開できる
使う側
TypeScriptのcdktfプロジェクトをprovider指定せず初期化
cdktf init --template=typescript --local
先ほど作ったnpmパッケージをインストール
npm install --save my-cdktf-custom-provider
あとは main.ts
の中で呼び出すだけ
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { addSomeUsefulResources } from "my-cdktf-custom-provider";
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string) {
super(scope, id);
addSomeUsefulResources();
}
}
最後にデプロイする
cdktf deploy
おわり
参考実装