n8n統合
概要
n8nは、ユーザーが視覚的なインターフェースを通じて複雑なワークフローを作成、展開、管理できる強力なオープンソース自動化プラットフォームです。300以上のアプリケーションやサービスとの統合をサポートし、webhookやスケジュールトリガーなど多様なトリガー方式を提供します。
OneAIとn8nの双方向統合は、ユーザーに強力な自動化機能を提供します:
- OneAIからn8nワークフローの呼び出し:スキルプラグインメカニズムを通じて、n8nワークフローをOneAIの拡張機能として利用し、AIが複雑な自動化フローをトリガー・実行できるようにし、データ処理やシステム統合などの機能を実現します。
- n8nからOneAI APIの呼び出し:n8nワークフロー内でOneAIのインテリジェントサービスをシームレスに呼び出し、自動化フローにAI機能(テキスト分析、コンテンツ生成、ナレッジQ&Aなど)を注入します。
この双方向統合は、企業に柔軟な自動化ソリューションを提供し、カスタマーサービス自動化、データ処理フロー、システム間ビジネスプロセスのオーケストレーション、インテリジェント通知などのシナリオで活用でき、運用効率の向上と人件費の削減を支援します。
n8n からOneAI APIの呼び出し
OneAIコミュニティノードのインストール
n8nワークベンチ左下の ... > Setting
から設定ページに入り、Community nodesで n8n-nodes-oneai
をインストールします:
コミュニティノードのインストール後は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(操作)を選択します:
ノードをテストします:
- 適切なパラメータを設定
- "Test Step"ボタンをクリックしてテストを実行
- 右側パネルで実行結果を確認
具体的なテスト手順:
- 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要件に従って設定
Import cURLでインポートできますが、HeaderのAuthorization
は削除してください。そうしないと下記のAuthentication設定と競合します。
Authenticationの設定:
- Authentication:Predefined Credential Typeを選択
- Credential Type:OneAI APIを選択
- OneAI API:既存のOneAI Credentialを選択または新規作成
ノードをテストします:
- すべてのパラメータ設定が正しいことを確認
- "Execute Node"ボタンをクリックしてテストを実行
- 返却結果が期待通りか確認
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):以下のテンプレートを基に修正
{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の値を調整し、検索結果が正しく返るようにします。
ベストプラクティスとトラブルシューティング
ベストプラクティス
- 各ワークフローに明確なコメントと説明を記載する
- 適切なエラーハンドリングでフローの安定性を確保する
- 定期的にワークフローの実行履歴とログを確認する
- 複雑なフローはテスト環境で事前検証することを推奨
よくある問題のトラブルシューティング
-
認証失敗
- Credential設定が正しいか確認
- Client IDとSecretが有効か確認
- ユーザーアカウントに十分な権限があるか検証
-
Webhook呼び出し失敗
- n8nサービスがOneAIサーバーからアクセス可能か確認
- 認証ヘッダー情報が正しく設定されているか確認
- webhookパスが正しいか検証
-
ノード実行エラー
- 入力データ形式が要件を満たしているか確認
- APIバージョンの互換性を確認
- 詳細なエラーログ情報を確認
n8nのデプロイ
n8nは多様な環境向けのデプロイドキュメントを提供しています。n8nセルフホスティングを参考に、最適なデプロイ方法を選択してください。
Azureプラットフォーム上でn8nを迅速にデプロイしたい場合、Terraformに精通していれば、以下のスクリプトを参考にできます:
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}"
}