Skip to main content

n8n統合

概要

n8nは、ユーザーが視覚的なインターフェースを通じて複雑なワークフローを作成、展開、管理できる強力なオープンソース自動化プラットフォームです。300以上のアプリケーションやサービスとの統合をサポートし、webhookやスケジュールトリガーなど多様なトリガー方式を提供します。

OneAIとn8nの双方向統合は、ユーザーに強力な自動化機能を提供します:

  1. OneAIからn8nワークフローの呼び出し:スキルプラグインメカニズムを通じて、n8nワークフローをOneAIの拡張機能として利用し、AIが複雑な自動化フローをトリガー・実行できるようにし、データ処理やシステム統合などの機能を実現します。
  2. n8nからOneAI APIの呼び出し:n8nワークフロー内でOneAIのインテリジェントサービスをシームレスに呼び出し、自動化フローにAI機能(テキスト分析、コンテンツ生成、ナレッジQ&Aなど)を注入します。

この双方向統合は、企業に柔軟な自動化ソリューションを提供し、カスタマーサービス自動化、データ処理フロー、システム間ビジネスプロセスのオーケストレーション、インテリジェント通知などのシナリオで活用でき、運用効率の向上と人件費の削減を支援します。

n8n からOneAI APIの呼び出し

OneAIコミュニティノードのインストール

n8nワークベンチ左下の ... > Setting から設定ページに入り、Community nodesで n8n-nodes-oneai をインストールします:

tip

コミュニティノードのインストール後はn8nサービスを再起動してください。そうしないとノードパネルにOneAIノードが重複して表示される場合があります。

OneAI Credentialの追加

Credential追加画面でOneAIを選択します。

以下の情報を入力してください:

  • Base URL:OneAIサーバーアドレス、末尾に/を付けないでください
  • Client ID:OneAIのClient Managementで作成・取得
  • Client Secret:OneAIのClient Managementで作成・取得
  • User Account:ユーザー管理のUser Nameに対応し、このユーザーとしてAPIを呼び出します。十分なAPI権限があることを確認してください

保存後、Credentialは自動的にテストされ、正しく設定されていればConnection tested successfullyと表示されます:

方法1:One AI NodeでOpenAPIを呼び出す

One AIノードを選択します:

実行したいAction(操作)を選択します:

ノードをテストします:

  1. 適切なパラメータを設定
  2. "Test Step"ボタンをクリックしてテストを実行
  3. 右側パネルで実行結果を確認

具体的なテスト手順:

  • OneAI Credentialが正しく選択されていることを確認
  • 必要な入力パラメータを入力
  • ノードを実行し、返却結果が期待通りか検証
  • 実行失敗時はエラーメッセージを確認し、設定を調整

方法2:HTTP Request NodeでOpenAPIを呼び出す

OneAI Nodeは現在一部のOpenAPI Operationのみ提供しています。必要なAPIがOneAI NodeのOperationリストにない場合は、HTTP Request NodeでAPIを直接呼び出せます。

HTTP Requestノードを選択します:

リクエストパラメータを設定します:

  • Method:適切なHTTPメソッド(GET/POST/PUTなど)を選択
  • URL:OneAI APIの完全なURLパスを入力
  • Headers:必要に応じてリクエストヘッダーを追加
  • Query Parameters/Body:API要件に従って設定
tip

Import cURLでインポートできますが、HeaderのAuthorizationは削除してください。そうしないと下記のAuthentication設定と競合します。

Authenticationの設定:

  • Authentication:Predefined Credential Typeを選択
  • Credential Type:OneAI APIを選択
  • OneAI API:既存のOneAI Credentialを選択または新規作成

ノードをテストします:

  1. すべてのパラメータ設定が正しいことを確認
  2. "Execute Node"ボタンをクリックしてテストを実行
  3. 返却結果が期待通りか確認

OneAI からn8nワークフローの呼び出し

n8nフローの作成

まず、ワークフローを作成し、名前をEchoとし、TriggerをWebhookに設定します。作成後、右上の"Active"ボタンをクリックしてフローを有効化します。

Webhookの設定:

  • HTTP Method:POSTを選択
  • Path:このフローを呼び出すアドレス、デフォルト値を使用可能
  • Authentication:Header Authを選択し、Credentialを作成。HeaderとValueを保存しておき、後でスキルプラグイン設定時に使用します
  • Respond: Using 'Respond to Webhook' Node を選択

Respond to Webhookノードを追加し、以下のように設定します:

  • Respond With:JSONを選択
  • Response Body:FixedをExpressionに切り替え、以下のjsonを入力:
{
"output": "{{ $json.body.input }}"
}

スキルを追加しn8nフローに関連付け

OneAIプラットフォームで以下の設定を行います:

  • Code:echoを入力
  • Name:echoを入力し、魔法の杖アイコンで自動翻訳
  • Description:echoを入力し、魔法の杖アイコンで自動翻訳
  • Request header:前述のn8n webhookでHeader Authを設定した場合、ここで対応するHeaderとValueを追加し、API認証が通るようにします
  • OpenAPI / Swagger Schema (JSON):以下のテンプレートを基に修正
tip

{n8n_server_url}をn8nサーバーのURLに、{n8n_webhook_path}をn8n webhookノードのpathに置き換えてください

{
"openapi": "3.0.3",
"info": {
"title": "N8N echo example",
"version": "1.0.0"
},
"servers": [
{
"url": "{n8n_server_url}"
}
],
"paths": {
"/webhook/{n8n_webhook_path}": {
"post": {
"operationId": "echo",
"summary": "echo",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Text content from user input"
}
},
"required": [
"input"
]
}
}
}
},
"responses": {
"200": {
"description": "Echo success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"output": {
"type": "string",
"description": "Echo output"
}
},
"required": [
"output"
]
}
}
}
}
}
}
}
}
}

設定完了後、"debug"ボタンをクリックしてテストできます:

Chatbotからスキルを呼び出す

Chatbotにechoスキルを追加します:

ChatbotのPromptを修正し、スキル呼び出しを誘導します。

Prompt例:

# Skill echo

If the user enters the `echo` command, please call the `echo` function and return `output` in the result.

スキルをテストします(echo 1+1=?と入力し、1+1=?が返り、echoスキルが呼び出されたことが確認できます):

n8nフローの実行状況を確認します:

より複雑なフローは、この例を基に拡張できます。

例:n8nでデータベースを検索しデータを返す必要がある場合、WebhookとRespond to Webhookノードの間にDatabaseノードを追加し、データベース接続情報を設定します。 その後、Respond to webhookのBodyの値を調整し、検索結果が正しく返るようにします。

ベストプラクティスとトラブルシューティング

ベストプラクティス

  • 各ワークフローに明確なコメントと説明を記載する
  • 適切なエラーハンドリングでフローの安定性を確保する
  • 定期的にワークフローの実行履歴とログを確認する
  • 複雑なフローはテスト環境で事前検証することを推奨

よくある問題のトラブルシューティング

  1. 認証失敗

    • Credential設定が正しいか確認
    • Client IDとSecretが有効か確認
    • ユーザーアカウントに十分な権限があるか検証
  2. Webhook呼び出し失敗

    • n8nサービスがOneAIサーバーからアクセス可能か確認
    • 認証ヘッダー情報が正しく設定されているか確認
    • webhookパスが正しいか検証
  3. ノード実行エラー

    • 入力データ形式が要件を満たしているか確認
    • APIバージョンの互換性を確認
    • 詳細なエラーログ情報を確認

n8nのデプロイ

n8nは多様な環境向けのデプロイドキュメントを提供しています。n8nセルフホスティングを参考に、最適なデプロイ方法を選択してください。

Azureプラットフォーム上でn8nを迅速にデプロイしたい場合、Terraformに精通していれば、以下のスクリプトを参考にできます:

main.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "4.27.0"
}
}
}

provider "azurerm" {
features {}
subscription_id = var.subscription_id
tenant_id = var.tenant_id
}

# Variable definitions
variable "subscription_id" {
description = "Azure Subscription ID"
type = string
default = "your-subscription-id"
}

variable "tenant_id" {
description = "Azure Tenant ID"
type = string
default = "your-tenant-id"
}

variable "application_name" {
description = "Application name"
type = string
default = "n8n"
}

variable "environment" {
description = "Environment"
type = string
default = "dev"
}

variable "location" {
description = "Azure region"
type = string
default = "eastasia"
}

variable "container_image" {
description = "N8N container image"
type = string
default = "n8nio/n8n:latest"
}

variable "n8n_host" {
description = "N8N URL"
type = string
default = "your-app-url.azurewebsites.net"
}

variable "random_suffix" {
description = "Random string"
type = string
default = "suffix"
}

variable "app_service_sku" {
description = "App Service Plan SKU"
type = string
default = "B2"
}

# Account and password variables
variable "n8n_encryption_key" {
description = "N8N encryption key"
type = string
default = "your-encryption-key"
sensitive = true
}

variable "n8n_basic_auth_user" {
description = "N8N basic auth username"
type = string
default = "admin"
}

variable "n8n_basic_auth_password" {
description = "N8N basic auth password"
type = string
default = "your-secure-password"
sensitive = true
}

variable "postgresql_admin_username" {
description = "PostgreSQL admin username"
type = string
default = "psqladmin"
}

variable "postgresql_admin_password" {
description = "PostgreSQL admin password"
type = string
default = "your-secure-password"
sensitive = true
}

# Resource Group
resource "azurerm_resource_group" "n8n" {
name = "rg-${var.application_name}-${var.environment}"
location = var.location
}

# App Service Plan
resource "azurerm_service_plan" "n8n" {
name = "asp-${var.application_name}-${var.environment}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
os_type = "Linux"
sku_name = var.app_service_sku
}

# App Service (Web App for Containers)
resource "azurerm_linux_web_app" "n8n" {
name = "app-${var.application_name}-${var.environment}-${var.random_suffix}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
service_plan_id = azurerm_service_plan.n8n.id

app_settings = {
"N8N_ENCRYPTION_KEY" = var.n8n_encryption_key
"N8N_HOST" = "${var.n8n_host}"
"N8N_PORT" = "443"
"N8N_PROTOCOL" = "https"
"N8N_WEBHOOK_URL" = "https://${var.n8n_host}/"
"GENERIC_TIMEZONE" = "Asia/Shanghai"
"N8N_BASIC_AUTH_ACTIVE" = "true"
"N8N_BASIC_AUTH_USER" = var.n8n_basic_auth_user
"N8N_BASIC_AUTH_PASSWORD" = var.n8n_basic_auth_password
"EXECUTIONS_DATA_PRUNE" = "true"
"EXECUTIONS_DATA_MAX_AGE" = "336"
"WEBSITES_PORT" = "443"

# DB Config
"DB_TYPE" = "postgresdb"
"DB_POSTGRESDB_HOST" = "${azurerm_postgresql_flexible_server.postgresql_server.fqdn}"
"DB_POSTGRESDB_PORT" = "5432"
"DB_POSTGRESDB_DATABASE" = "${azurerm_postgresql_flexible_server_database.postgresql_database.name}"
"DB_POSTGRESDB_USER" = var.postgresql_admin_username
"DB_POSTGRESDB_PASSWORD" = var.postgresql_admin_password
"DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED" = "false"
}

site_config {
always_on = true
websockets_enabled = true

application_stack {
docker_image_name = "${var.container_image}"
docker_registry_url = "https://docker.n8n.io"
}
}
}

# PostgreSQL database server
resource "azurerm_postgresql_flexible_server" "postgresql_server" {
name = "psql-${var.application_name}-${var.environment}"
resource_group_name = azurerm_resource_group.n8n.name
location = azurerm_resource_group.n8n.location
administrator_login = var.postgresql_admin_username
administrator_password = var.postgresql_admin_password

version = "16"
sku_name = "B_Standard_B1ms"
# 128GB
storage_mb = 131072

backup_retention_days = 35
geo_redundant_backup_enabled = true

public_network_access_enabled = true

lifecycle {
ignore_changes = [
zone,
]
}
}

# PostgreSQL firewall rule
resource "azurerm_postgresql_flexible_server_firewall_rule" "postgresql_firewall_rule" {
name = "AllowAzureServicesAccessPGSQL"
server_id = azurerm_postgresql_flexible_server.postgresql_server.id
start_ip_address = "0.0.0.0"
end_ip_address = "0.0.0.0"
}

# PostgreSQL database instance
resource "azurerm_postgresql_flexible_server_database" "postgresql_database" {
name = "psqldb-${var.application_name}-${var.environment}"
server_id = azurerm_postgresql_flexible_server.postgresql_server.id
charset = "UTF8"
collation = "en_US.utf8"
}

# Output
output "n8n_url" {
description = "N8N access url"
value = "https://${azurerm_linux_web_app.n8n.default_hostname}"
}

参考資料

n8n関連リソース

OneAI関連リソース