Skip to main content

n8n統合

概要

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

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

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

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

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操作のみ提供しているため、必要な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

cURLのインポートも可能ですが、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」ボタンをクリックしてテスト可能:

Agentからスキルを呼び出す

Agentにechoスキルを追加:

Agentの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関連リソース