0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

n8nでワークフローを組んでいると、避けて通れないのがテストの怖さです。

ノードの接続先はCMS、Slack、GitHubといった本物の外部サービス
気軽に「Execute workflow」を押すと、本番のコンテンツが書き換わったり、関係者に通知が飛んだりします。

この記事は、外部サービスにがっつり繋がったワークフローを開発したときに実際に使った、本番リソースに触れずにテスト・デバッグを回すためのテクニックをまとめたものです。

n8nはセルフホスト版(Community Edition)を使っています。

1. Pin Data(ピン留め)で高コストなステップをスキップする

一番効いたのがこれです。
n8nにはノードの出力を固定する Pin Data という機能があります。

ピン留めされたノードは実行されず、固定したデータをそのまま返します。

何が嬉しいか

たとえばワークフローの途中に、こんな「テストのたびに繰り返したくない」ステップがあるとします。

  • 人間の回答待ち(Send and Wait for Responseでフォーム回答を待つノード)
  • 外部リソースの作成(GitHub issueの作成など、実行のたびにゴミが増えるノード)

これらの出力を一度の実行で取得したら、その値でピン留めしておきます。

以降のテスト実行では、フォームに回答しなくても即座に次のノードへ進み、issueも新規作成されずに既存のissue番号が使い回されます。

操作方法

  • ノードを開き、OUTPUTパネル右上の📌アイコンをクリック(過去の実行データがある状態で)
  • または、キャンバスでノードを選択して P キー(トグル)
  • ピン留めされたノードは出力が紫がかった表示になり、📌マークが付く

最大のポイント:ピンは「手動実行」にしか効かない

Pin Dataはエディタからの手動実行のみに適用され、スケジュールトリガーやWebhookによる本番実行では無視されます

つまり「本番稼働前にピンを外し忘れた」としても、本番実行はピンを無視して全ノードを普通に実行します。
テスト専用の安全装置として、外し忘れの事故が構造的に起きません。

公式ドキュメント:Data pinning | n8n Docs

2. 「接続を切る」ことで実行範囲を限定する

「ワークフローの前半だけテストしたい。
後半のCMS更新は絶対に動かしたくない」という場面では、境界のノード間の接続(線)を削除するのが確実です。
実行はそこで正常終了し、以降のノードには到達しません。

「ノードの無効化(Disable)でいいのでは?」と思うかもしれませんが、両者は挙動が違います。

方法 挙動
無効化(Disable) ノードは実行されないが、データは素通りして後続ノードが動く(※複数入力を持つノードでは1番目の入力だけが素通りします)
接続の削除 実行がそこで止まる。後続は完全に不到達

「publishノードだけ無効化してドラフト作成まで流す」のような部分制御には無効化が便利ですが、「この先には何があっても行かせない」という保証が欲しいときは接続を切る方が安全です。
テストが終わったら線を繋ぎ直すだけです。

3. 失敗した実行は「修正後のワークフローで途中から再開」できる

実行が途中のノードでエラーになったとき、原因を修正してから最初からやり直すのは苦痛です。
特に途中に人間の回答待ちがあると、回答者にもう一度入力をお願いすることになります。

n8nの実行履歴(Executions)から失敗した実行を開くと Retry ができ、このとき「Retry with currently saved workflow」を選ぶと、修正済みの最新ワークフロー定義を使って、失敗したノードから再開されます。

それより前のノードの出力は前回実行のデータがそのまま使われます。

エラー修正 → 失敗地点からリトライ、のループが回せると、デバッグの効率が大きく変わります。

4. 実行データはAPIで掘ると速い

UIでノードを1つずつ開いて出力を確認するより、REST API でまとめて取る方が圧倒的に速い場面があります。
セルフホスト版でもAPIは無料で使えます(Settings → API でキーを発行)。

# 失敗した実行の詳細(全ノードの入出力とエラーを含む)
curl -H "X-N8N-API-KEY: $KEY" \
  "https://<n8nのURL>/api/v1/executions/<実行ID>?includeData=true"

レスポンスにはn8n内部の実行データが含まれており、デバッグに使える情報が詰まっています(以下は筆者環境のレスポンスで確認したフィールドです。

内部構造のため、公式APIリファレンスで保証されているものではなく、バージョンにより変わる可能性があります)。

  • data.resultData.runData
    • 実行された全ノードの入出力・開始時刻・エラー詳細
  • data.resultData.lastNodeExecuted
    • 最後に実行されたノード名(=どこで止まったか)
  • HTTP系ノードのエラーでは error.description外部APIのレスポンスボディが含まれていることがあり、UIの汎用メッセージ("Your request is invalid...")より遥かに具体的

「エラーなしで途中終了」の調査には nodeExecutionStack

一度、実行ステータスは success なのに後続ノードが実行されない、という不可解な状態に遭遇しました。
このとき手がかりになったのが executionData.nodeExecutionStack(次に実行される予定のノードのキュー)です。
ここがなら、n8nは「次に実行するものがない」と判断して正常終了しています。エラーではないので、エラーログをいくら探しても何も出ません。

5. Slack連携ワークフローのテスト小ワザ

テスト用チャンネルへ一括差し替え

Slackに投稿するワークフローのテストでは、宛先をテスト用チャンネルに差し替えるのが基本です。

ノードが多いと差し替え漏れが怖いですが、ワークフロー定義のJSONを取得して該当チャンネルIDを機械的に置換すれば漏れがありません(前述のAPI編集が活きる場面です)。

メンション入りメッセージはプライベートチャンネルでテストする

テストメッセージに本番想定のメンション(<@Uxxxx>)が含まれる場合、通知がどう飛ぶかが気になります。

テスト用チャンネルをプライベートチャンネルにして、Botだけを招待しておくのが一番確実です。

プライベートチャンネルなら、非参加者にはメッセージの存在自体が見えません。

6. おまけ: 待機系ノードは「直列」にしか流れない

テクニックというより知っておくべき挙動ですが、Send and Wait for ResponseやWaitのような待機ノードに到達すると、n8nは実行全体を一時停止します。

「2人に同時にフォームを送って両方待つ」のような設計はn8n単体では素直に組めないため、直列で受け入れるか、待ち時間の問題はリマインダーの自動化などの別アプローチで解決するのが現実的です。

まとめ

テクニック 用途
Pin Data 回答待ち・リソース作成などをスキップ。手動実行のみ有効なので外し忘れても本番に影響なし
接続の削除 実行範囲の確実な限定(無効化は素通りする点に注意)
Retry with currently saved workflow 修正後、失敗ノードから再開
実行データのAPI取得 includeData=true でエラーの生レスポンスや停止位置を一気に確認
Slackテスト 宛先をプライベートなテスト用チャンネルに一括差し替え

外部サービスに繋がるワークフローでも、この辺りを押さえておけば「本番を壊すかも」という恐怖なしにテストを回せます。

参考になれば嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?