tech.guitarrapc.cóm

Technical updates

Visual StudioのPulumi実行時にデバッガーをアタッチする

以前、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);

alt text

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... の選択

Attach to Processウィンドウが開くので、dotnet.exeを選択してAttachボタンを押します。

dotnet.exeを選択してアタッチ

Attachすると即座にPulumiの実行が再開されて、ブレークポイントでデバッガーが止まります。

ブレークポイントで止まった様子

先のリージョン取得コードの型はOutput<T>なので一見すると評価されず値が見えませんが、デバッガーでResult.Valueを覗くと値が確認できます。ただ、まだ作成されていないリソースの値はないので注意しましょう。この辺りはIaCという特性上、仕方ない部分です。

Output型は一見するとデバッガーで値を確認できなさそうにみえる

Output型の変数はリソースが存在するならResult.Valueで値を確認できる

既に作られたリソースであれば、pulumi previewのデバッグ実行でリソースARNを確認できます。うれしい!

注意

Visual Studioのデバッグ実行でpulumi previewを素直に実行してほしい場合、--atacch-debuggerは外しましょう。 私はアタッチ用とpreview実行用の2プロファイル用意しています。

まとめ

IaCの実行中デバッグができるの嬉しいですよね。Terraformもそうですが、IaCは実行中のデバッグ体験をあまり重視していない傾向を感じます。 汎用プログラミング言語でのIaCは、AIとの相性以外にもデバッグ体験の向上が期待できるのではないでしょうか。

参考


  1. --attach-debuggerがない場合、コンソール出力が止まらないのでここで動作の違いがわかります。