以前、Visual Studioのデバッグ実行でpulumi preview
を実行する方法を紹介しました。
今回はデバッグ実行中のPulumiにデバッガーをアタッチする方法を紹介します。これを使うとPulumi実行時にブレークポイントを仕込んで実行しつつ経過確認したり、変数の値を確認したり、ウォッチウィンドウを使えます。
Debug Adapter Protocol
Pulumiは各種IDEに対してDebug Adapter Protocolをサポートしています。
公式のデバッガー記事にはVS Codeのデバッガーを使った方法が紹介されていますが、Visual Studioはpulumi preview --attach-debugger
を使ってデバッガーを差し込むことになります。
Visual Studioでのデバッガーアタッチ
以前の記事で、Visual Studioのデバッグ実行でpulumi preview
を仕込みました。これをベースにデバッガーをアタッチする流れを説明します。
{ "profiles": { "pulumi": { "commandName": "Executable", "executablePath": "pulumi", "commandLineArgs": "preview --refresh --stack {スタック名}", "environmentVariables": { "IS_DEBUG": "false", "AWS_PROFILE": "{AWS_PROFILE_NAME}" } } } }
--attach-debugger
引数を追加
pulumiの実行時に--attach-debugger
引数を追加します。これでPulumi実行中にデバッガーがアタッチされるまで実行が止まります。
{ "profiles": { "pulumi": { "commandName": "Executable", "executablePath": "pulumi", "commandLineArgs": "preview --attach-debugger --refresh --stack {スタック名}", "environmentVariables": { "IS_DEBUG": "false", "AWS_PROFILE": "{AWS_PROFILE_NAME}" } } } }
Visual Studioでデバッグ実行 & プロセスへデバッガーアタッチ
Visual Studioで適当にブレークポイントを仕込みましょう。今回はregionを取得している箇所でブレークポイントを仕込みます。
var region = Output.Create(Pulumi.Aws.GetRegion.InvokeAsync()).Apply(x => x.Id);
Visual Studioでデバッグ実行(F5
)を開始します。Pulumiの実行が始まるとコンソール出力が止まり、デバッガーがアタッチされるまで待機します1。
Previewing update (master) View in Browser (Ctrl+O): https://app.pulumi.com/foobar/..... Type Name Plan Info 省略.... ~ └─ pkg:component:route53 route53-foo ~ └─ aws:route53:Zone route53-foo-zone
Visual StudioのメニューからDebug > Attach to Process...
を選択します。
Attach to Processウィンドウが開くので、dotnet.exe
を選択してAttach
ボタンを押します。
Attachすると即座にPulumiの実行が再開されて、ブレークポイントでデバッガーが止まります。
先のリージョン取得コードの型はOutput<T>
なので一見すると評価されず値が見えませんが、デバッガーでResult.Value
を覗くと値が確認できます。ただ、まだ作成されていないリソースの値はないので注意しましょう。この辺りはIaCという特性上、仕方ない部分です。
既に作られたリソースであれば、pulumi preview
のデバッグ実行でリソースARNを確認できます。うれしい!
注意
Visual Studioのデバッグ実行でpulumi preview
を素直に実行してほしい場合、--atacch-debugger
は外しましょう。
私はアタッチ用とpreview実行用の2プロファイル用意しています。
まとめ
IaCの実行中デバッグができるの嬉しいですよね。Terraformもそうですが、IaCは実行中のデバッグ体験をあまり重視していない傾向を感じます。 汎用プログラミング言語でのIaCは、AIとの相性以外にもデバッグ体験の向上が期待できるのではないでしょうか。
参考
-
--attach-debugger
がない場合、コンソール出力が止まらないのでここで動作の違いがわかります。↩