以前、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がない場合、コンソール出力が止まらないのでここで動作の違いがわかります。↩