* 目次 [#j5a28de8]
#contents

** はじめに [#c4ba4950]

n8nは、ローコード/ノーコードでワークフローを作成できるオープンソースの自動化ツールです。今回は、Docker-composeを使ってn8nを立ち上げ、Webhookでリクエストを受け取り、データを処理してファイルに保存するまでの基本的なワークフローを作成してみます。

** 環境構築 [#s86d2559]

*** 1. docker-compose.ymlの準備 [#laa7f11b]

まず、n8nをDockerで起動するための設定ファイルを作成します。

 version: '3.8'
 
 services:
   n8n:
     image: n8nio/n8n:latest
     container_name: n8n-practice
     ports:
       - "5678:5678"
     environment:
       # 基本設定
       - N8N_HOST=0.0.0.0
       - N8N_PORT=5678
       - N8N_RUNNERS_ENABLED=true
       
       # セキュリティ設定
       - N8N_BASIC_AUTH_ACTIVE=false
       - N8N_BASIC_AUTH_USER=admin
       - N8N_BASIC_AUTH_PASSWORD=admin123
       
       # Webhook設定
       - WEBHOOK_URL=http://localhost:5678
       - N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN=true
       
       # その他設定
       - TZ=Asia/Tokyo
       - N8N_LOG_LEVEL=info
       - N8N_METRICS=true
       
     volumes:
       - n8n_data:/home/node/.n8n
       - ./workflows:/home/node/.n8n/workflows
       - ./custom-nodes:/home/node/.n8n/custom
     restart: unless-stopped
     networks:
       - n8n-network
 
 volumes:
   n8n_data:
     driver: local
 
 networks:
   n8n-network:
     driver: bridge

*** 2. .envファイルの設定 [#c231293e]

練習用であれば、最小限の設定で十分です。

 # 基本認証(練習用は false でも OK)
 N8N_BASIC_AUTH_ACTIVE=false
 N8N_BASIC_AUTH_USER=admin
 N8N_BASIC_AUTH_PASSWORD=admin123
 
 # Webhook URL
 WEBHOOK_URL=http://localhost:5678
 
 # ログレベル
 N8N_LOG_LEVEL=info

*** 3. n8nの起動 [#xf993f68]

 # docker-compose.ymlがあるディレクトリで実行
 docker-compose up -d
 
 # ログを確認
 docker-compose logs -f n8n

起動後、ブラウザで http://localhost:5678 にアクセスしてn8nの管理画面を開きます。

** ワークフローの作成 [#g4273f9a]

*** ステップ1: 新しいワークフローを作成 [#c1f27c26]

+ n8nの管理画面で「New workflow」をクリック
+ ワークフロー名を「Webhook to File」などに設定

*** ステップ2: Webhookノードの追加と設定 [#gea17555]

+ 「Add first step」をクリック
+ 「Webhook」を検索して選択
+ Webhookノードの設定:
-- HTTP Method: POST
-- Path: test-webhook
-- Authentication: None
-- Response: When Last Node Finishes

*** ステップ3: Codeノードの追加 [#s037f0bc]

&color(red){※SQLiteノードを探しましたが、n8nには専用のSQLiteノードが提供されていませんでした。そのため、今回はCodeノードでデータ処理を行い、ファイル保存で代替しています。};

+ Webhookノードの右側の「+」ボタンをクリック
+ Code を検索して選択
+ 以下のJavaScriptコードを入力:

 // 受信したWebhookデータを取得
 const webhookData = $input.all()[0].json;
 
 // ログエントリを作成
 const logEntry = {
   id: Date.now(),
   received_at: new Date().toISOString(),
   method: 'POST',
   headers: webhookData.headers || {},
   body: webhookData.body || {},
   webhook_url: webhookData.webhookUrl || '',
   query: webhookData.query || {}
 };
 
 // JSON文字列として準備(改行付き)
 const logText = JSON.stringify(logEntry, null, 2);
 
 // バイナリデータとして準備
 return [{
   json: {
     success: true,
     message: "データをファイル保存用に準備しました",
     log_entry: logEntry
   },
   binary: {
     data: {
       data: Buffer.from(logText).toString('base64'),
       mimeType: 'application/json'
     }
   }
 }];

*** ステップ4: ファイル書き込みノードの追加 [#xc14cb63]

+ Codeノードの右側の「+」ボタンをクリック
+ Read/Write Files from Disk を検索して選択
+ 設定:
-- Operation: Write File to Disk
-- File Path and Name: /tmp/webhook_logs.json
-- Input Binary Field: data

** 外部API呼び出しの実装 [#o9a3fc77]

*** ステップ5: HTTP Requestノードの追加(並列処理) [#xd39ad26]

受信したWebhookデータを外部APIに転送する機能を追加します。

+ Codeノードの右側の「+」ボタンをクリック
+ HTTP Request を検索して選択
+ CodeノードとHTTP Requestノードが並列になるように接続

*** ステップ6: HTTP Requestノードの設定 [#ef630fbc]

HTTP Requestノードをクリックして以下のように設定:

&color(blue){基本設定:};
- Method: POST
- URL: https://httpbin.org/post
- Authentication: None

&color(blue){Body設定:};
- Send Body: ON
- Body Content Type: JSON
- Specify Body: Using JSON

&color(blue){JSON設定(最初は固定値でテスト):};

 {
   "source": "n8n-workflow",
   "webhook_data": "test_data",
   "timestamp": "2025-07-08T07:46:10.803Z",
   "message": "API test from n8n"
 }

*** ステップ7: テストモードでの動作確認 [#udd0770c]

テストモードで外部API呼び出しが正常に動作するか確認:

 curl -X POST http://localhost:5678/webhook-test/test-webhook \
   -H "Content-Type: application/json" \
   -d '{
     "message": "parallel API test",
     "user": "tester",
     "action": "external_api_call"
   }'

&color(green){成功時のhttpbin.orgからの応答例:};

 {
   "data": "{\"webhook_data\":\"test_data\",\"timestamp\":\"2025-07-08T07:46:10.803Z\",\"source\":\"n8n-workflow\",\"message\":\"API test from n8n\"}",
   "json": {
     "message": "API test from n8n",
     "source": "n8n-workflow", 
     "timestamp": "2025-07-08T07:46:10.803Z",
     "webhook_data": "test_data"
   },
   "origin": "59.132.58.38",
   "url": "https://httpbin.org/post"
 }

*** ステップ8: 動的データ連携の実装 [#a5c277e8]

Webhookで受信したデータを外部APIに転送するため、HTTP RequestノードのJSONを動的な設定に変更:

 {
   "source": "n8n-workflow",  
   "webhook_received_data": {{ JSON.stringify($node["Webhook"].json.body) }},
   "webhook_headers": {{ JSON.stringify($node["Webhook"].json.headers) }},
   "timestamp": "{{ new Date().toISOString() }}",
   "processing_id": "{{ Date.now() }}"
 }

*** ステップ9: Productionモードでの動作確認 [#v0a6cc2c]

ワークフローをActiveにして、Production URLで動的データ連携をテスト:

 curl -X POST http://localhost:5678/webhook/test-webhook \
   -H "Content-Type: application/json" \
   -d '{
     "user_id": 12345,
     "action": "purchase",
     "product": "laptop",
     "amount": 999.99,
     "timestamp": "'$(date -Iseconds)'"
   }'

&color(green){成功時の外部API転送データ例:};

 {
   "json": {
     "processing_id": "1751961709628",
     "source": "n8n-workflow", 
     "timestamp": "2025-07-08T08:01:49.628Z",
     "webhook_headers": {
       "accept": "*/*",
       "content-length": "146", 
       "content-type": "application/json",
       "host": "localhost:5678",
       "user-agent": "curl/8.11.0"
     },
     "webhook_received_data": {
       "action": "purchase",
       "amount": 999.99,
       "product": "laptop", 
       "timestamp": "2025-07-08T17:01:48+09:00",
       "user_id": 12345
     }
   }
 }

*** ワークフローをアクティブ化 [#c21c06f2]

+ 画面右上の「Active」トグルをONにする
+ ワークフローを保存

*** curlでテスト [#re8f7d1e]

プロダクションモードになると、URLが以下のように変わります:

 # プロダクション用URL
 curl -X POST http://localhost:5678/webhook/test-webhook \
   -H "Content-Type: application/json" \
   -d '{
     "message": "Hello n8n!",
     "user": "test-user",
     "action": "login"
   }'

*** 複数回テスト [#t49c5740]

 # テスト1
 curl -X POST http://localhost:5678/webhook/test-webhook \
   -H "Content-Type: application/json" \
   -d '{"action": "login", "user": "alice"}'
 
 # テスト2  
 curl -X POST http://localhost:5678/webhook/test-webhook \
   -H "Content-Type: application/json" \
   -d '{"action": "purchase", "user": "bob", "amount": 100}'
 
 # テスト3
 curl -X POST http://localhost:5678/webhook/test-webhook \
   -H "Content-Type: application/json" \
   -d '{"action": "logout", "user": "alice"}'

*** 保存されたファイルの確認 [#b08811da]

 # n8nコンテナ内に入る
 docker-compose exec n8n sh
 
 # 保存されたファイルを確認
 cat /tmp/webhook_logs.json
 
 # ファイル一覧を確認
 ls -la /tmp/webhook*
 
 # コンテナから出る
 exit

** 重要なポイント [#hb0d12bc]

*** テストモードとプロダクションモードの違い [#u67e5931]

- '''テストモード''': 1回のリクエストのみ受け付け(URL: /webhook-test/path)
- '''プロダクションモード''': 継続的にリクエストを受け付け(URL: /webhook/path)

ワークフローを「Active」にすることで、プロダクションモードになります。

*** ファイル書き込み権限の注意点 [#b8895854]

Dockerコンテナ内では、書き込み権限の問題が発生することがあります。/tmpディレクトリは通常、すべてのプロセスが書き込み可能なので、練習用には適しています。

*** 外部API呼び出しとDockerの利点 [#ka5a06c7]

今回の実装で確認できた重要なポイント:

+ '''外部通信の確認''': DockerコンテナからインターネットのAPIへの通信が正常に動作
+ '''IPアドレス取得''': httpbin.orgで確認できた送信元IP(origin: "59.132.58.38")
+ '''データ転送''': Webhookで受信したJSONデータを完全に外部APIに転送
+ '''ヘッダー情報''': リクエストヘッダーも取得・転送可能
+ '''並列処理''': ローカル保存と外部API呼び出しが同時実行

n8nのCodeノードでは、Node.jsのfsモジュールが直接使用できないため、バイナリデータとしてファイル書き込みノードに渡す方法を採用しました。

また、当初はSQLiteノードを使用予定でしたが、n8nにはSQLiteの専用ノードが標準では提供されていませんでした。「Execute a SQL query」ノードはMySQLやPostgreSQL用で、SQLiteファイルには直接対応していません。そのため、今回はJSONファイルでの保存を採用しています。

** まとめ [#lf330b48]

今回の手順で、以下の高機能なワークフローが完成しました:

+ '''Webhookでリクエスト受信''' → データの取得
+ '''Codeノードでデータ処理''' → 構造化されたログの作成
+ '''並列処理の実装''':
-- '''ローカル保存''': JSONファイルとして保存
-- '''外部API転送''': 受信データを外部サービスに送信
+ '''動的データ連携''' → Webhookデータの外部API転送
+ '''Docker環境での外部通信''' → インターネットAPIとの正常な通信確認

この基本的な流れを理解すると、さらに複雑なワークフロー(条件分岐、データベース連携、メール送信、スケジュール実行など)も作成できるようになります。

** 実用的な応用例 [#i313d642]

今回構築したワークフローパターンは、以下のような実用的なシナリオに応用できます:

- '''Webhook受信 + ログ保存 + Slack通知'''
- '''フォーム送信 + データベース保存 + メール送信'''
- '''API受信 + データ変換 + 複数サービス連携'''
- '''IoTセンサーデータ + ファイル保存 + アラート送信'''

** 次のステップ [#xb7088c4]

- 条件分岐(IFノード)の活用
- 外部API呼び出し(HTTP Requestノード)
- データベースとの連携
- スケジュール実行(Cronノード)

n8nは非常に柔軟性が高く、様々な自動化シナリオに対応できる強力なツールです。ぜひ色々な機能を試してみてください!
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS