Contents
1. 本記事の概要と対象読者
本稿では、業務フロー自動化ツール n8n の導入から実装までを体系的に解説します。
- Docker・Kubernetes・マネージド SaaS(n8n.cloud)のそれぞれのデプロイ方法と選定ポイント
- OAuth2 や API キーなど主要認証方式の設定手順、Dynamic Credentials の活用例
- HTTP Request/Webhook ノードを使った実務シナリオ別サンプルワークフロー
自前環境での運用に不安がある方や、初めて n8n を触る開発者・IT 担当者を対象としています。
2. インストール方法の全体像
2.1 デプロイ選択肢と比較
| 項目 | Docker(単一ノード) | Kubernetes(Helm) | n8n.cloud(マネージド SaaS) |
|---|---|---|---|
| 初期ハンドリング | 手軽に開始でき、ローカル開発や小規模テスト向き | 高可用性・自動スケールが必要な本番環境に最適 | インフラ管理不要で即時利用可能 |
| 運用コスト | サーバー/クラウド費用は自己負担 | クラスター運用とリソース管理が必要 | サブスクリプション費用のみ |
| カスタマイズ性 | コンテナ内部の設定変更が自由 | Helm の values で細かく調整可能 | プラグインは Marketplace に限定 |
実務的な指針:PoC や開発段階は Docker、安定運用とスケール要件がある場合は Kubernetes、インフラ保守コストを最小化したいケースは n8n.cloud を選択してください。
2.2 前提条件
| 必須ツール | 推奨バージョン |
|---|---|
| Docker Engine | 24.x 以上 |
| docker‑compose(CLI) | 2.20 以上 |
| kubectl | 1.28 以上 |
| Helm | 3.14 以上 |
| Node.js (カスタムイメージ作成時) | 20.x |
3. Docker 環境でのセットアップ
3.1 手順概要
Docker はローカル開発や小規模本番に最もシンプルです。公式イメージ n8nio/n8n(Node.js 20 ベース)を利用します。
3.1.1 イメージ取得と環境変数の準備
|
1 2 3 |
# 最新安定版タグを取得 docker pull n8nio/n8n:latest |
.env ファイルに認証情報や DB 接続設定を書き出すことで、機密情報がコードに残りません。
|
1 2 3 4 5 6 7 8 |
# .env(例) N8N_USER=admin N8N_PASS=StrongPassword123! POSTGRES_HOST=db.example.com POSTGRES_DB=n8n POSTGRES_USER=n8n_user POSTGRES_PASSWORD=SecretPwd! |
3.1.2 docker‑compose.yml の構成
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: "3.9" services: n8n: image: n8nio/n8n:latest restart: unless-stopped ports: - "5678:5678" env_file: - .env environment: DB_TYPE: postgres # 本番は外部 DB 推奨 N8N_BASIC_AUTH_ACTIVE: "true" NODE_FUNCTION_ALLOW_BUILTIN: fs,crypto # 必要に応じて追加 volumes: - n8n_data:/home/node/.n8n # 永続化 volumes: n8n_data: |
ポイント:
DB_TYPE=postgresにすると外部データベースを利用でき、SQLite より信頼性が向上します。
3.1.3 コンテナ起動と確認
|
1 2 3 4 |
docker compose up -d # 起動ログの確認(任意) docker compose logs -f n8n |
ブラウザで http://localhost:5678 にアクセスし、Basic Auth が要求されることを確認してください。
4. Kubernetes(Helm Chart)での本番デプロイ
4.1 Helm チャートの取得とカスタマイズ
公式 Helm リポジトリ https://charts.n8n.io を追加し、values.yaml に必要項目を記述します。
|
1 2 3 |
helm repo add n8n https://charts.n8n.io helm repo update |
4.1.1 values.yaml の主要設定例
|
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 |
replicaCount: 3 # 水平スケール数(自動スケーリングは別途設定) image: repository: n8nio/n8n tag: latest # 最新安定版タグ service: type: LoadBalancer port: 80 env: - name: DB_TYPE value: "postgres" - name: POSTGRES_HOST valueFrom: secretKeyRef: name: n8n-db-secret key: host - name: POSTGRES_USER valueFrom: secretKeyRef: name: n8n-db-secret key: user - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: n8n-db-secret key: password # Dynamic Credentials を有効化(外部シークレットストア連携) env: - name: N8N_DYNAMIC_CREDENTIALS value: "true" resources: limits: cpu: "500m" memory: "512Mi" requests: cpu: "250m" memory: "256Mi" autoscaling: enabled: true minReplicas: 2 maxReplicas: 8 targetCPUUtilizationPercentage: 70 |
留意点:機密情報は
Secretリソースとして管理し、env.valueFrom.secretKeyRefで参照します。
4.1.2 デプロイ実行
|
1 2 |
helm install n8n-release n8n/n8n -f values.yaml |
インストール後は kubectl get svc で外部 IP を取得し、ブラウザからアクセスできます。
5. マネージド SaaS(n8n.cloud)の活用
5.1 基本的な利用フロー
- n8n.cloud の公式サイトにサインアップ
- 無料トライアルでワークスペースが自動作成され、URL がメールで通知される
- UI 上で API キーや OAuth2 クレデンシャルを Secrets に登録し、ノードから参照
5.2 選定時のチェックリスト
| 項目 | 自前デプロイ | n8n.cloud |
|---|---|---|
| インフラ保守 | 必要(OS・ミドルウェア) | 不要(全自動) |
| スケーリング | 手動または HPA 設定が必要 | 自動水平スケール |
| カスタムプラグイン | 完全自由にビルド可能 | Marketplace のみ利用可 |
| セキュリティ機能 | 自己責任で構築(TLS・IP 制限) | 標準で TLS + IP ホワイトリスト |
6. 認証設定と Dynamic Credentials の活用
6.1 Dynamic Credentials の概要
Dynamic Credentials は 外部シークレットストア(AWS Secrets Manager、HashiCorp Vault、Google Secret Manager 等)から認証情報を取得し、ノード実行時に自動で注入する機能です。これにより、平文のクレデンシャルがコードや UI に残らない安全な運用が可能になります。
6.2 OAuth2 認証の設定手順
- シークレット作成(例:AWS Secrets Manager)
-
client_idとclient_secretを格納したシークレットを作成。 -
n8n の Credential 登録
- UI → Credentials → OAuth2 API → 「Dynamic Credentials」をオンにし、環境変数名(例:
${OAUTH_CLIENT_ID})で参照させます。
|
1 2 3 4 5 6 7 8 9 10 |
credentials: myServiceOAuth2: type: oauth2Api clientId: ${OAUTH_CLIENT_ID} clientSecret: ${OAUTH_CLIENT_SECRET} authUri: https://example.com/oauth/authorize tokenUri: https://example.com/oauth/token scope: read write dynamicCredentials: true |
ポイント:
dynamicCredentials: trueがキーです。設定後は n8n がトークンの自動リフレッシュとシークレット更新をハンドリングします。
6.3 API キー・Bearer トークンの管理
|
1 2 3 4 5 6 7 |
credentials: myServiceApiKey: type: apiKey name: X-API-KEY key: ${MY_SERVICE_API_KEY} dynamicCredentials: true |
外部シークレットが更新されるたびに、次回実行時に新しいキーが自動的に反映されます。
6.4 Basic Auth の安全な扱い方
|
1 2 3 4 5 6 7 |
credentials: legacyBasicAuth: type: httpBasicAuth user: ${LEGACY_USER} password: ${LEGACY_PASS} dynamicCredentials: true |
注意:user と password は必ず Secret に格納し、環境変数として n8n に渡すようにします。
7. HTTP Request と Webhook ノードでの基本連携
7.1 HTTP Request ノードの構成要素
| 要素 | 説明 |
|---|---|
| URL | 呼び出したいエンドポイント |
| Method | GET / POST / PUT / DELETE 等 |
| Headers | Authorization など認証ヘッダー。Dynamic Credentials を参照可 |
| Query Params | クエリ文字列パラメータ |
| Body | JSON、FormData、RAW など送信データ形式 |
実装例(在庫 API の GET)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
- name: Get Inventory type: n8n-nodes-base.httpRequest parameters: url: https://inventory.example.com/api/v2/products method: GET authentication: credential headerParametersUi: parameter: - name: Authorization value: Bearer {{ $credentials.inventoryBearer.token }} queryParametersUi: parameter: - name: status value: active - name: limit value: 200 |
7.2 Webhook ノードの基本設定
| 項目 | 推奨設定 |
|---|---|
| HTTP Method | POST(JSON 受信が多い) |
| Path | /webhook/<サービス名> のように一意にする |
| Response Mode | onReceived(即時 200 応答) |
CRM 更新通知 → Slack 転送シナリオ
|
1 2 3 4 5 6 7 |
- name: CRM Webhook Trigger type: n8n-nodes-base.webhook parameters: httpMethod: POST path: crm/customer-updated responseMode: onReceived |
テストは curl コマンドで疑似ペイロードを送信し、実行履歴にデータが記録されることを確認します。
8. 実務シナリオ別サンプルワークフロー
8.1 CRM → Slack のリアルタイム通知
- Webhook(CRM)
-
パス
/webhook/crm/updateが受信した JSON を$jsonに格納。 -
Function ノードでメッセージ生成
|
1 2 3 4 5 6 |
const { id, name, stage } = $json; return [{ text: `顧客 *${name}*(ID:${id})がステージ ${stage} に変更されました。`, channel: "#sales-updates" }]; |
- Slack ノード
- OAuth2 Dynamic Credentials を使用し、
Message Textに{{$json.text}}、Channelは Function の出力から取得。
ベストプラクティス:失敗時は IF ノードでステータスコードを判定し、Slack へエラーメッセージまたはメール通知へ分岐させます。
8.2 在庫 API ↔ Google スプレッドシート の同期
| トリガー | 処理フロー |
|---|---|
| Cron(毎日 02:00) | HTTP Request → Function(CSV 変換) → Google Sheets(Append) |
主なノード設定例
- Cron
yaml -
name: Daily Trigger
type: n8n-nodes-base.cron
parameters:
cronExpression: "0 2 * * *"
-
Function(CSV 変換)
|
1 2 3 4 5 |
const items = $json.items; // [{sku, qty, location}, ...] const header = "SKU,Quantity,Location"; const rows = items.map(i => `${i.sku},${i.qty},${i.location}`).join("\n"); return [{ csv: `${header}\n${rows}` }]; |
- Google Sheets(Append)
- スプレッドシート ID とシート名は環境変数
GSHEET_ID、GSHEET_SHEETに格納。
|
1 2 3 4 5 6 |
options: sheetId: {{ $env.GSHEET_ID }} range: {{ $env.GSHEET_SHEET }}!A1 valueInputOption: USER_ENTERED values: {{$json.csv}} |
ポイント:HTTP Request のリトライ設定(3 回、指数バックオフ)を有効にするとレートリミット対策になります。
8.3 JSON ↔ XML 変換(Code ノードでの実装)
前提条件:xml2js を利用したい場合
カスタム Docker イメージを作成し、npm install xml2js を組み込みます。Dockerfile の例:
|
1 2 3 |
FROM n8nio/n8n:latest RUN npm install --save xml2js |
このイメージでコンテナをビルド・デプロイすれば、Code ノード内で require('xml2js') が使用可能です。
変換スニペット
- JSON → XML
|
1 2 3 4 |
const json = $json; // { orderId:123, amount:5000 } const xml = `<order><id>${json.orderId}</id><amount>${json.amount}</amount></order>`; return [{ xml }]; |
- XML → JSON(xml2js 使用)
|
1 2 3 4 5 6 7 |
const xml2js = require('xml2js'); const parser = new xml2js.Parser({ explicitArray: false }); await parser.parseStringPromise($json.xml).then(result => { return [{ json: result }]; }); |
留意点:
Codeノードは非同期関数をサポートしているため、awaitが利用可能です。
9. エラーハンドリング・リトライ戦略
9.1 IF ノードでのステータスコード分岐
|
1 2 3 4 5 6 7 8 9 |
- name: Check HTTP Status type: n8n-nodes-base.if parameters: conditions: boolean: - value1: "{{$json.statusCode}}" operation: equal value2: 200 |
- True → 正常処理へ
- False → エラーログ出力 + Slack 通知ノード
9.2 HTTP Request のリトライ設定例
| パラメータ | 推奨値 |
|---|---|
| Retry Count | 3 回 |
| Delay (ms) | 5000(5 秒) |
| Backoff Type | Exponential |
|
1 2 3 4 5 |
retryOnFail: true maxTries: 3 delayBetweenAttemptsMs: 5000 backoffStrategy: exponential |
9.3 タイムアウトの最適化
- リクエスト単体:
options.timeoutを 10,000(10 秒)程度に設定 - ワークフロー全体:n8n の
Maximum execution timeを 300 秒(5 分)に制限し、長時間ブロックを防止
|
1 2 3 |
options: timeout: 10000 # ミリ秒単位 |
10. デプロイ・運用とセキュリティ対策
10.1 スケーリング手法
| 手段 | 説明 |
|---|---|
Docker Compose の --scale オプション |
単一ノード上で複数インスタンスを起動(永続化は外部 DB が必須) |
Helm の replicaCount と HPA 設定 |
K8s クラスタ全体で水平スケールと自動負荷分散を実現 |
Docker Compose スケーリング例
|
1 2 |
docker compose up -d --scale n8n=3 |
Helm の Autoscaling 例(values.yaml)
|
1 2 3 4 5 6 |
autoscaling: enabled: true minReplicas: 2 maxReplicas: 8 targetCPUUtilizationPercentage: 70 |
10.2 機密情報の管理ベストプラクティス
| 方法 | 特徴 |
|---|---|
.env ファイル(開発) |
手軽だがリポジトリにコミットしないよう注意 |
| Kubernetes Secret | Base64 エンコードで保存、Pod の環境変数として注入 |
| 外部シークレットストア(AWS Secrets Manager 等) | ローテーションとアクセス制御が容易 |
K8s Secret 作成例
|
1 2 3 4 |
kubectl create secret generic n8n-secrets \ --from-literal=POSTGRES_PASSWORD='${PG_PASS}' \ --from-literal=N8N_OAUTH_CLIENT_ID='${OAUTH_ID}' |
10.3 ネットワークと TLS の設定
- IP アクセス制御
- Docker:
--publishに IP フィルタを付与(例:-p 192.168.0.0/24:5678:5678) -
K8s:
NetworkPolicyまたは Ingress のipWhitelistを利用 -
HTTPS 終端
- 自前環境では Nginx リバースプロキシで TLS 終端し、
SECURE_COOKIE=trueを有効化 - n8n.cloud は Let’s Encrypt が自動適用されます
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 443 ssl; server_name n8n.example.com; ssl_certificate /etc/letsencrypt/live/n8n.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem; location / { proxy_pass http://localhost:5678; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } |
10.4 運用チェックリスト
- [ ] 機密情報はすべて Secret または外部シークレットに保管されているか
- [ ] TLS が有効で証明書の期限が切れていないか
- [ ] IP ホワイトリスト/NetworkPolicy が期待通りに機能しているか
- [ ] リトライ・バックオフ設定が適切に行われ、レートリミット対策になっているか
11. まとめと次のステップ
この記事では、n8n のインストールから本番運用まで を一通り網羅しました。
- 導入方法:Docker は開発・PoC、Kubernetes は本格本番、n8n.cloud はインフラ不要で即時利用。
- 認証と Dynamic Credentials:外部シークレットストアと連携すれば、クレデンシャルを安全に自動更新できます。
- 主要ノードの実装例:HTTP Request と Webhook を組み合わせた API 連携パターンを提示。
- 実務サンプル:CRM→Slack、在庫↔Google Sheets、JSON↔XML の変換フローをコード付きで紹介。
- エラーハンドリングとリトライ:IF 分岐・指数バックオフ・タイムアウト設定のベストプラクティス。
- 運用とセキュリティ:スケーリング、Secret 管理、TLS/IP 制限の具体手順を提供。
今すぐできること
- ローカルで Docker コンテナを起動し、簡単な HTTP Request ワークフローを作成
- Dynamic Credentials 用に外部シークレット(例:AWS Secrets Manager) を 1 件作り、OAuth2 Credential に紐付けてみる
- Kubernetes クラスタがある場合は Helm Chart を
values.yamlカスタマイズしてデプロイし、水平スケールと HPA の動作を確認
これらのステップを踏むことで、n8n を安全かつ拡張性の高い形で業務システムに組み込めるようになります。次は実際のビジネス要件に合わせて カスタムノード や プラグイン の開発を検討してみましょう。 Happy automating!