Contents
n8n とは?
n8n(「Node‑RED」+「automation」)は、プログラミング不要で多数の SaaS やデータベースを連携できるオープンソースのワークフロー自動化ツールです。 現在(2024 年 11 月時点)の安定版は v1.46 系列で、公式が提供する Docker イメージや npm パッケージ、SaaS(n8n.cloud)を利用できます。本稿では、実務での導入に必要な環境構築手順と、LLM(大規模言語モデル)を組み合わせた AI エージェントの具体的な実装例をご紹介します。
- 対象読者:システム管理者、開発者、業務部門の自動化担当者
- 目的:安全かつスケーラブルに n8n をデプロイし、OpenAI・Anthropic などの LLM と連携したワークフローを作成できるようになること
環境構築とインストール方法
このセクションでは、Docker、npm(CLI)、n8n.cloud の三つの導入パターンを比較し、それぞれの推奨設定例を示します。選択肢は運用コスト・保守体制・スケーラビリティ要件に応じて決定してください。
Docker でのデプロイ
Docker は OS の違いを吸収し、短時間で本番レベルの環境を構築できる点が最大のメリットです。以下は公式ドキュメント(2024‑10‑15)に基づく最小構成例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# docker-compose.yml (n8n v1.46) version: "3.9" services: n8n: image: n8nio/n8n:1.46 restart: unless-stopped ports: - "5678:5678" environment: # データベースは SQLite(開発向け)または PostgreSQL(本番推奨) - DB_TYPE=sqlite - SQLITE_DATABASE=/home/node/.n8n/database.sqlite # ベーシック認証で UI アクセスを保護 - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=${N8N_USER} - N8N_BASIC_AUTH_PASSWORD=${N8N_PASS} - NODE_ENV=production volumes: - ~/.n8n:/home/node/.n8n # 永続化ディレクトリ |
ポイント解説
docker compose up -dで数十秒以内に起動します。- 環境変数
N8N_USER/ N8N_PASSは強固なランダム文字列を使用し、.envファイルで管理してください(例:openssl rand -base64 32)。 - データ永続化はホスト側の
~/.n8nに保存されるため、定期的にバックアップするだけでデータ保全が可能です。
参考: n8n ドキュメント「Running n8n with Docker」(2024‑10‑15) https://docs.n8n.io/hosting/docker/
npm / CLI 版のインストール
ローカル開発や軽量テスト環境では、npm パッケージとしてインストールする方法が手早くて便利です。Node.js のバージョンは 20 系以上 が必要です(公式推奨)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 1. グローバルに n8n をインストール npm install -g n8n # 2. 環境変数を .env に定義(Git 管理外が前提) cat > .env <<'EOF' DB_TYPE=postgresdb POSTGRES_DB=n8n POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_USER=n8n_user POSTGRES_PASSWORD=StrongP@ssw0rd! N8N_BASIC_AUTH_ACTIVE=true N8N_BASIC_AUTH_USER=admin N8N_BASIC_AUTH_PASSWORD=AdminSecret123 EOF # 3. デバッグモードで起動(ngrok が自動生成され外部アクセスが可能) n8n start --tunnel --debug |
ポイント解説
--tunnelオプションは内部的に ngrok を呼び出し、ローカル環境でも Webhook のテストができます(2024‑09‑30)。- デバッグモード (
--debug) はすべてのノード実行ログを標準出力に流すため、開発中のトラブルシューティングが容易です。
参考: n8n CLI ガイド (2024‑09‑30) https://docs.n8n.io/cli/
n8n.cloud(SaaS)利用時の基本設定
公式 SaaS はインフラ管理を完全に委託でき、スモールスタートに適しています。無料プランは 14 日間のトライアルが提供され、全機能へアクセス可能です。
| 項目 | 推奨設定 |
|---|---|
| 認証方式 | UI の Credentials 画面で API キーや OAuth2 トークンを暗号化保存 |
| ワークフロー実行上限 | 無料プランは月間 1,000 実行、プロプランは無制限(2024‑11‑01) |
| AI ノード利用料金 | LLM 呼び出しは外部サービスの従量課金に準拠。n8n.cloud 自体には追加課金なし |
参考: n8n.cloud プライシングページ (2024‑11‑01) https://www.n8n.io/cloud
LLM API キー(Credential)の安全な登録手順
AI エージェントが外部 LLM と通信する際は、認証情報を n8n の Credential 機能に保存し、ワークフローから参照させることが推奨されます。以下では代表的な OpenAI と Anthropic の設定例を示します。
1. OpenAI API キーの取得と登録
| 手順 | 内容 |
|---|---|
| ① | OpenAI ポータル(https://platform.openai.com)にログインし、API Keys → Create new secret key をクリックしてキーを生成。 |
| ② | n8n の左サイドバー Credentials → New Credential → OpenAI を選択。 |
| ③ | 「API Key」欄に先ほどコピーしたシークレットキーを貼り付け、任意の名前(例:OpenAI‑ChatGPT)で保存。 |
注意: OpenAI の最新モデルは
gpt-4o-miniが利用可能ですが、2024 年 10 月時点では 追加料金が発生 するため、コストを抑える場合はgpt-3.5-turboを選択してください(OpenAI Pricing, 2024‑10‑12)。
2. Anthropic Claude の認証設定
| 手順 | 内容 |
|---|---|
| ① | Anthropic コンソール(https://console.anthropic.com)で API Keys → Generate new key を作成。 |
| ② | n8n の Credentials から Anthropic を選択し、キーを貼り付ける。 |
| ③ | 「Model」欄に claude-3-opus-20240229 など、使用したいバージョン名を入力(公式ドキュメント参照)。 |
補足: Claude 系列は コンテキスト保持が高速 な点で評価が高く、短文生成や要約タスクに適しています(Anthropic Docs, 2024‑09‑20)。
複数 LLM を安全に管理するベストプラクティス
- 名前空間化:Credential 名は「サービス―用途」の形式で統一し、誤使用を防止。
- 環境変数連携:
process.env.OPENAI_API_KEYのようにコード側でも参照できるようにすると CI/CD パイプラインがシンプルになる。 - レートリミット対策:HTTP 429 エラーは n8n の Error Trigger と Retry Policy(最大 3 回)でハンドリングし、突発的なスパイクに備える。
AI エージェントワークフロー実装例 ― メール自動返信シナリオ
以下では「受信メールを要約し、適切な返信文を生成」する一連のフローを、コード不要で GUI 操作だけで構築できる手順と、バックエンド的に必要になる JSON 定義を併せて示します。
1. 全体像と主要ノード
| ノード | 役割 |
|---|---|
| IMAP Email Trigger | 未読メールを検知し、件名・本文を取得 |
| OpenAI (Chat Completion) | メール内容の要約・返信文生成 |
| IF | 返信に「謝罪」や「緊急」キーワードが含まれるか判定 |
| SMTP Send | 条件分岐ごとに異なるテンプレートでメール送信 |
| SQLite (or PostgreSQL) Insert | 送信履歴を永続化 |
| Error Trigger → Slack | エラー時に通知 |
2. ワークフロー JSON(インポート用)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
{ "name": "メール自動返信エージェント", "nodes": [ { "type": "n8n-nodes-base.imapEmail", "position": [250, 300], "parameters": { "host": "imap.example.com", "port": 993, "secure": true, "email": "support@example.com", "password": "{{ $env.IMAP_PASSWORD }}", "folder": "INBOX", "markAsRead": true, "filter": { "unseen": true } }, "name": "IMAP Trigger" }, { "type": "n8n-nodes-base.openAi", "position": [600, 300], "parameters": { "operation": "chatCompletion", "model": "gpt-3.5-turbo", "messages": [ { "role": "system", "content": "You are a polite customer‑support agent in Japanese." }, { "role": "user", "content": "以下のメール本文を要約し、返信文を作成してください。\n---\n{{ $json[\"text\"] }}" } ], "temperature": 0.3, "maxTokens": 500 }, "credentials": { "openAiApi": { "id": "OpenAI-ChatGPT", "name": "OpenAI‑ChatGPT" } }, "name": "LLM 生成" }, { "type": "n8n-nodes-base.if", "position": [950, 300], "parameters": { "conditions": { "boolean": [ { "value1": "{{ $json[\"choices\"][0][\"message\"][\"content\"] }}", "operation": "contains", "value2": "謝罪" } ] } }, "name": "謝罪判定" }, { "type": "n8n-nodes-base.smtp", "position": [1300, 200], "parameters": { "operation": "send", "fromEmail": "support@example.com", "toEmail": "{{ $json[\"from\"] }}", "subject": "Re: {{ $json[\"subject\"] }}", "text": "{{ $json[\"choices\"][0][\"message\"][\"content\"] }}\n\n---\n※自動返信です。" }, "name": "SMTP 送信(謝罪)" }, { "type": "n8n-nodes-base.smtp", "position": [1300, 400], "parameters": { "operation": "send", "fromEmail": "support@example.com", "toEmail": "{{ $json[\"from\"] }}", "subject": "Re: {{ $json[\"subject\"] }}", "text": "{{ $json[\"choices\"][0][\"message\"][\"content\"] }}\n\n---\nご確認ください。" }, "name": "SMTP 送信(通常)" }, { "type": "n8n-nodes-base.sqlite", "position": [1650, 300], "parameters": { "operation": "executeQuery", "query": "INSERT INTO email_log (msg_id, subject, reply, created_at) VALUES ({{ $json[\"messageId\"] }}, {{ $json[\"subject\"] }}, {{ $json[\"choices\"][0][\"message\"][\"content\"] }}, datetime('now'))" }, "name": "履歴保存" }, { "type": "n8n-nodes-base.errorTrigger", "position": [250, 600], "parameters": {}, "name": "エラー捕捉" }, { "type": "n8n-nodes-base.slack", "position": [600, 600], "parameters": { "operation": "sendMessage", "channel": "#ops-alerts", "text": "⚠️ n8n メール自動返信フローでエラーが発生しました: {{ $json[\"error\"] }}" }, "name": "Slack 通知" } ], "connections": { "IMAP Trigger": { "main": [ [{ "node": "LLM 生成", "type": "main", "index": 0 }] ] }, "LLM 生成": { "main": [ [{ "node": "謝罪判定", "type": "main", "index": 0 }] ] }, "謝罪判定": { "main": [ [{ "node": "SMTP 送信(謝罪)", "type": "main", "index": 0 }], [{ "node": "SMTP 送信(通常)", "type": "main", "index": 0 }] ] }, "SMTP 送信(謝罪)": { "main": [ [{ "node": "履歴保存", "type": "main", "index": 0 }] ] }, "SMTP 送信(通常)": { "main": [ [{ "node": "履歴保存", "type": "main", "index": 0 }] ] }, "エラー捕捉": { "main": [ [{ "node": "Slack 通知", "type": "main", "index": 0 }] ] } } } |
インポート手順:n8n エディタ上部の「Import」→JSON貼り付けでワークフローが生成されます。
3. 実装時に意識すべきポイント
- コンテキスト保持:同一顧客から複数メールが届くケースでは、
JSON Storeノードに会話履歴(配列)を保存し、次回呼び出す際にmessagesに付与すると自然な対話が実現できます。 - レートリミット:OpenAI の 60 秒あたりのリクエスト上限はプランによって異なるため、
Rate Limitノードで制御しつつRetry Policy(maxAttempts: 3)を設定してください。 - デバッグ:実行ログは UI の「Execution」タブから確認でき、ステップごとの入力/出力がハイライト表示されます。エラー時は自動で Slack に通知する仕組みを入れておくと運用負荷が減ります。
本番運用・スケーリングとセキュリティベストプラクティス
AI エージェントを業務に組み込む際の安全性・拡張性は、単なる機能実装以上に重要です。以下では自己ホスト版と SaaS 版それぞれに共通する対策をまとめます。
API キーやシークレットの管理
| 方法 | 特徴 |
|---|---|
| Docker Secrets(Swarm) | キーは暗号化されたファイルとして保存、--secret オプションでコンテナに注入。 |
| Kubernetes Secret | kubectl create secret generic openai-key --from-literal=key=$(cat ./openai.key) で作成し、Pod の環境変数またはマウントファイルとして使用。 |
| n8n.cloud Credential Vault | UI 上で暗号化保存され、アクセス権はロールベースで制御可能(2024‑11‑01)。 |
推奨:Git リポジトリにキーや
.envを絶対にコミットしない。.gitignoreに必ず追加する。
プライバシー保護とデータマスキング
- 個人情報除去:メール本文から氏名・電話番号を正規表現で置換した上で LLM に送信(例:
{{ $json["text"] | replace(/\\d{2,4}-?\\d{2,4}-?\\d{3,4}/g, "***") }})。 - オンプレミス DB:顧客情報は社内ネットワークのみからアクセスできる PostgreSQL インスタンスに格納し、外部へのデータ送信は最小限に抑える。
- TLS/HTTPS:Nginx リバースプロキシで
ssl_certificateとssl_certificate_keyを設定し、全トラフィックを暗号化。
スケーリング戦略(Docker Swarm / Kubernetes)
Docker Swarm の例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# docker-stack.yml version: "3.9" services: n8n: image: n8nio/n8n:1.46 deploy: replicas: 4 # 高可用性のため複数レプリカ resources: limits: memory: 1024M secrets: - openai_key environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=${N8N_USER} - N8N_BASIC_AUTH_PASSWORD_FILE=/run/secrets/n8n_pass |
Kubernetes(Helm Chart)
|
1 2 3 4 5 6 7 8 9 |
# 公式 Helm リポジトリの追加とインストール例(2024‑10‑20) helm repo add n8n https://charts.n8n.io helm install prod-n8n n8n/n8n \ --set replicaCount=5 \ --set persistence.enabled=true \ --set env.N8N_BASIC_AUTH_ACTIVE=true \ --set env.N8N_BASIC_AUTH_USER=$(echo $N8N_USER) \ --set secret.openaiKey=$(cat ./openai.key) |
- Horizontal Pod Autoscaler(HPA)を有効にすると、CPU 使用率が 70% 超えたときに自動でポッド数が増加します。
- ログは EFK スタック(Elasticsearch‑Fluentd‑Kibana)へ集約し、監査証跡として保持することが推奨されます。
運用モニタリングと障害対応
| 項目 | 監視手段 |
|---|---|
| ワークフロー実行失敗率 | n8n UI の「Execution Statistics」 + Prometheus Exporter(/metrics エンドポイント) |
| API キー漏洩リスク | Secret Management の定期ローテーションスクリプト(例:30日ごとに新キー生成) |
| レイテンシー | 外部 LLM 呼び出しは CloudWatch / Stackdriver で測定、閾値超過時にアラート送信 |
参考文献・リンク一覧
| No. | タイトル | 出典元 | 公開日 |
|---|---|---|---|
| 1 | n8n ドキュメント – Running n8n with Docker | https://docs.n8n.io/hosting/docker/ | 2024‑10‑15 |
| 2 | n8n CLI ガイド | https://docs.n8n.io/cli/ | 2024‑09‑30 |
| 3 | OpenAI Pricing(公式) | https://openai.com/pricing | 2024‑10‑12 |
| 4 | Anthropic Documentation – Claude Models | https://docs.anthropic.com/claude | 2024‑09‑20 |
| 5 | n8n.cloud プライシング | https://www.n8n.io/cloud | 2024‑11‑01 |
| 6 | Docker Secrets のベストプラクティス | https://docs.docker.com/engine/swarm/secrets/ | 2024‑08‑05 |
| 7 | Kubernetes Secrets 管理ガイド | https://kubernetes.io/docs/concepts/configuration/secret/ | 2024‑07‑22 |
| 8 | EFK スタック構築手順(公式) | https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html | 2024‑06‑30 |
まとめ
- n8n はオープンソースでありながら、Docker・npm・SaaS のいずれでも簡単に導入できることが本稿の中心テーマです。
- LLM と連携する際は Credential に安全に保存し、環境変数やシークレット機構と併用してキー管理を徹底してください。
- 提示した メール自動返信ワークフロー は、トリガー → LLM 生成 → 条件分岐 → 永続化 → エラーハンドリング の全工程が GUI 操作だけで完結します。JSON インポート例を活用すれば、同様のパターンを他業務にも展開しやすくなります。
- 本番運用では Docker Secrets / Kubernetes Secret によるキー暗号化、TLS 設定による通信保護、そして 水平スケーリング(Swarm/K8s)とモニタリング を組み合わせることが成功の鍵です。
上記手順とベストプラクティスに沿って構築すれば、2024 年時点でも安定・安全な AI エージェントを n8n 上で実装でき、業務効率化や顧客対応品質向上につながります。ご不明点は公式フォーラムや GitHub Issue で質問すると、開発者コミュニティから迅速にフィードバックが得られます。