簡易セルフホスト版n8nのWebhook問題

何故か公開すると動作しない??

AWS-ec2上などでn8nを簡易セルフホストしていると、作成したワークフローが管理画面上のテストでは動作するのに、公開するとAPIエラーになって動作しない場合があります。
例えば、前回作成した簡易チャットボットでは、チャットボットへのアクセスはできるものの、以下のようにメッセージを投げかけたタイミングでAPIのレスポンスエラーになります。

原因はWebhook

これは、n8nのWebhookがデフォルトではlocalhostになっている事に起因します。
ローカルPC上のバーチャルマシンなどで起動していて、localhostでアクセスできる場合には問題になりません。
一方で、試作段階でn8nをクラウド上のdockerで単純に起動し、https設定などを行わずにIPなどで簡易的にアクセスする場合には問題になります。


ブラウザの開発ツールなどでリクエスト先を見てみると、localhostでAPIへのアクセスを試みていることが分かります。
また、そもそもとして、管理画面で提供されるChatURLも、以下のように、デフォルトではlocalhostで示されます。このURLのlocalhostは本来のIPやドメインに置き換えるだけでチャットボットにはアクセスが可能です。ただし、Webhookの対処をしない限り、APIへのリクエストがlocalhostから切り替わらず、APIコールが全てエラーになります。

Webhookとは?

Webhookとは、データ連携の方式の1つです。
Webアプリケーション上で、特定のイベントが発生した際に、別のサービスやアプリに通知を送る仕組みです。
今回の例でいうと、ChatBot上でメッセージが入力されたら(イベント発生)、n8nで設定されたWebhookのルールに従って、目的のAPIに対してリクエストが発生します。

解決策

n8nの起動時にWebhookのデフォルト値を明示的に指定することで解決できます。 

[root@ip-xx.xx.xx.xx]# docker run -it --rm \
    --name n8n \
    -p
5678:5678 \
    -e WEBHOOK_URL=http://XX.XX.XX.XXX:5678      ← n8nが稼働しているec2等のIP
    -e N8N_SECURE_COOKIE=
false \
    -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=
true \
    -e GENERIC_TIMEZONE=
"Asia/Tokyo" \
    -e TZ=
"Asia/Tokyo" \
    -v n8n_data:
/home/node/.n8n \
docker.n8n.io/n8nio/n8n

ドメインを取得している場合(あるいはhostsで擬似的にドメインを指定する場合)はWEBHOOKにドメインを指定することもできます。

このように起動することで、管理画面で提供される公開用URLにも、指定したIP等が反映されます。

チャット側でも下記のようにメッセージに応答してくれるようになります。

意外とハマることがあるので、何かの参考にしていただければと思います。