日々常々

ふつうのプログラマがあたりまえにしたいこと。

AWS CDKをTypeScriptでVSCodeで書いてる

馴染みのない環境でやると色々微妙な詰まり方しますよね。

AWSはマネジメントコンソールで作ると色々勝手にやってくれてとても便利です。 勝手にやってくれて動きはするんだけれど、何が作られてるか良く分からない状況になってしまう私。 「動くからいいじゃん」っていうのもあるかと思いますが、プロダクションなので動くのは当たり前……というか話題にする必要もありません。

動いちゃいけないものは動いちゃいけないのがすごく大事だと思っています。とても大事。動くものは動く、その上で動いちゃいけないものが動かない。 無邪気に「動けばいい」と発言される方とチームをご一緒する時にまず押さえるところにしています。 ということで何が作られているかは把握したい。

インフラわからないので最近これ読んでます。とてもおもしろい。

マネジメントコンソールも結局はAPIの操作って理解してから見たらわかるところ多いんですけど、如何せんわからないものが多すぎて、それなのに動いちゃうのが怖くて仕方なかった。 あと知らないものが勝手に作られて、それに費用がかかっちゃうのも気になるところ。

閑話休題。そんなわけで(なんで他じゃなくCDKなのかとか色々省略)AWS CDKをはじめました。 Javaでもできるみたいなんですが、ついでにTypeScriptに手を出すことにしました。TypeScriptを書くのにVisualStudio Codeを使うことにしました。これはCDKのベースがTypeScriptだったり、WorkshopがVSCodeだったからです。私にはどれも馴染みが薄いので「変える時は一つだけにしろ」の原則を思いっきり外してますが、大枠ではCDKって一つなので大丈夫(何が大丈夫なのかは知らない)。

でまぁ手探りしながらTypeScriptの文法とかも雰囲気で書いていきます。なんか動きはする。

f:id:irof:20200710155810p:plain https://twitter.com/irof/status/1280867510879784961 変なこと書いたらコンパイルエラーになるのはとても安心感がある。

あ、冒頭と反するように見えますが、ここは「動けばいい」を適用していい領域です。なぜならCloudFormationのテンプレートができて、作られるAWSリソースを検証できるから。 jestでテストできるし。テスト対象がCloudFormationのテンプレートだったりするので、CloudFormationの知識は前提になります。 CloudFormation書くの辛くなってCDKに手を出して、付け焼き刃程度とはいえCloudFormationの知識があるのが良い方に働いてはいるけれど、結局CloudFormationから逃れられないのか感があったり。 ともかく動くのは絶対的に正しいですが、「動けばいい」は取扱注意です。

そんなこんなで書いていきます。そのうち一つのファイルに長々書くのは趣味じゃないから、構造化したくなり……するとこんな感じで辛くなってきました。

f:id:irof:20200710153742p:plain

1つのTypeScriptファイル xxx.ts に対して xxx.d.tsxxx.js の2ファイルが npm run buildwatch だけど)で作られ、それが同じディレクトリに出力されます。

TypeScriptの文化なのかCDKが推奨してるだけなのかは知らないけれど、Workshop通りに作ったらこんな設定。 cdk init で作られる .gitignore では無視されるのだけどね…… Javaだと bin/ とか out/ とか build/ とか、とにかく別ディレクトリにできるのでちょっと違和感を覚えつつ、文化は自分に馴染ませてから評価することにしてるのでそのまま。

でも流石にこのファイルの中身は見ないなーと数日書いてて思ったので( cdk.out/*.template.json は結構見る)、やっぱビルド先のディレクトリ変えるかなぁもしくは消す方法はないかなぁとVSCodeの設定を眺めてたらあったた。.vscode/settings.json に以下を書く。

{
    "files.exclude": {
        "**/*.d.ts": {"when": "$(basename).ts"},
        "**/*.js": {"when": "$(basename).ts"}
    }
}

basename を指定できるのが面白いなと思いました。

f:id:irof:20200710161843p:plain

生きやすくなった。

ってとこまで至ってからこの内容で検索したら、どうもTypeScriptな方々は当たり前にやるものなようで。知らないものは目に入っても認識できなくて、知ったら目に入った時に認識できるようになるパターン。 馴染みのない環境って面白いなぁと改めて思いました。

今は xxx.tsyyy.ts に名前を変えた時に以前作られた xxx.js とかを消す方法( gradle clean みたいなの)が欲しいなと思いながら、別に何も調べてないところです。