* 目次 [#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は非常に柔軟性が高く、様々な自動化シナリオに対応できる強力なツールです。ぜひ色々な機能を試してみてください!