オープンソースで利用できるノーコード・ワークフロー自動化ツール:エヌ・エイト・エヌ~ n8n:2回目

2022.02.16

一回目の記事では、エヌ・エイト・エヌを使って、

  • Googleシートからメールアドレスを拾う
  • SMTPメールサーバに対して送信を行う

ということをやってみました。メールアドレスを拾うだけの単純なテストですが、件名や本文も Googleシートからの値を使うことが出来ますので、ちょっとした自動メール送信機能などを作ることも出来ます。

300個もあるノードを使って、様々な連携を、ノーコードで実現出来るのは魅力ですが、それだけならば、Zapierで十分です。自社のサーバにわざわざエヌ・エイト・エヌ(n8n)をインストールする必要もありません。

しかし、エヌ・エイト・エヌの本当の実力は、ノーコード・ローコードツール「だけじゃない」ところにあります。

PexelsTima Miroshnichenkoによる写真

ノーコードツール エヌ・エイト・エヌ(n8n)でコードを書いくメリット

ノーコードツールですが、コードを書くことが出来ます。コードが書けると何が良いのでしょうか?

データ連携用のノードが提供されていないシステムも連携出来る

自社で開発したシステムや、ツールがある場合、Zapier などのクラウドサービスの恩恵を受けるのが難しくなります。自前主義でシステムを開発してきてしまったことが、日本では今、批判の的になっていますが、クラウドサービスの活用が広がらなかった原因の一つも、自社開発のシステムでした。

しかし、自社の業務に特化したシステムを、すぐに切り替えるのは困難です。最適化されたシステムが常に悪い訳ではありません。

エヌ・エイト・エヌは、そうした、クラウドネイティブではない環境で強みを発揮してくれます。

エヌ・エイト・エヌをどのように使うと便利なのか?

エヌ・エイト・エヌはソースを取得して自由にどこでもインストールできます。また、デスクトップアプリもあります。

社内にエヌ・エイト・エヌを動かすことが出来る環境がありさえすれば、動かすことが出来ます。

社内でエヌ・エイト・エヌを動かせると、どのようなメリットがあるのでしょうか?

  1. 社外に繋がっていないシステムと連係することが出来る
  2. 社外に持ち出せないデータを扱うことが出来る
  3. 社内と社外の間を取り持つことが出来る

社外に繋がっていないシステムと連係することが出来る

社内にあるコンピュータシステムには、会計管理、在庫管理、顧客管理、工場のライン管理、受発注管理、営業管理などなど、様々なものがあり得ます。これらがクラウド上にないことは、問題でしょうか?

在宅勤務が日常になりつつある今では、確かに、クラウド上にあれば便利ではありますが、基本的には社内で使えれば十分なものです。

エヌ・エイト・エヌを使うと、このようなクラウド環境にないシステムにも繋ぐことが出来るので、社内システム内の連携が出来ます。

社外に持ち出せないデータを扱うことが出来る

クラウドサービスはとても便利ですが、どうしてもクラウドサービスを使えないこともあります。例えば、データのセキュリティが重要な場合、簡単にクラウド上へ持ち出すことは出来ません。セキュリティを担保するためには、専門知識も必要ですし、専用のインフラが必要なこともあります。

セキュリティが問題になる場合は、インターネット上にデータを持ち出さない、というのが、原則です。

その点、エヌ・エイト・エヌは、社内のネットワーク内で動かすことが出来るので、データが不用意にインターネットに出ることもありません。完全にローカルネットワークの中で動かすことも可能です。

社内と社外の間を取り持つことが出来る

逆に、社内のネットワークから、社外に出る必要がある場合にも、エヌ・エイト・エヌは、間を繋ぐ役目を果たすことが出来ます。

システム間の連携は、通常、必ず専用のシステム開発や、システム改修が必要になります。システム間のインターフェースを作る必要があるからです。

しかし、エヌ・エイト・エヌには、300以上のアプリ用のインターフェースがあり、その中には特定のアプリに依存しないものがあります。1つの例は、第一回でみた、「Send Email」ノードです。SMTPサーバへ接続するためのノードを使うことで、メール送信のプログラムを作ることなく、メール送信が出来ました。

システム間連携の実現に便利なノード

エヌ・エイト・エヌのノードのうち、独自開発された社内システムを他システムと連係するのに便利なノードを紹介します。

CRON ノード

地味なノードですが、タスクの定期実行を行うためのノードです。Linuxの cron と同じ設定が出来るため、柔軟な定期実行を設定できます。

データベース接続ノード

自社システムの保持するデータに直接接続出来れば、インターフェースの開発の手間が一つ減らせます。エヌ・エイト・エヌはローカルネットワーク内に構築して、データベースに直接接続することが出来ます。

Function ノード

「Function」ノードは、JavaScriptのコードを実行するノードです。このノードの中には、JavaScriptのコードを書くことが出来ます。このノードは強力なツールで、ノーコードツールであるエヌ・エイト・エヌの中で、実際にプログラミングが出来るというノードです。

エヌ・エイト・エヌ上でJavaScriptのコードが書けることの便利さは、エヌ・エイト・エヌを自社サーバにインストール出来ることで、更に便利になります。なぜなら、サーバ上にインストールした JavaScriptのライブラリが、エヌ・エイト・エヌ上で使うことが出来るからです。

EmailReadIMAP ノード

このノードはメールサーバである IMAP にメールが届いた時に実行されます。未読のメールをトリガーにして、ワークフローを開始することが出来ます。受信したメールが次のノードに渡されます。

サンプルコードを書いてみる

下図のようなワークフローを作ってみます:

前提とやりたいこと

ここでは、既存のシステムからエラーログがデータベースに記録されることと想定しています。

実現したいことは、10分置きにエラーログをまとめてメールで送信することです。

ノード毎の設定

各ノードの設定をみてみます。

CRON

10分毎に実行する CRON ノードを最初に作成します。

MySQL

MySQLノードで、エラーの登録されているテーブルよりデータを取得します。実際には既読のデータは読み込まないようにフラグ制御が必要ですが、ここでは簡便に全件を取得しています。

Queryの欄には、実行するSQLを登録できます。

Function

次のノードは、JavaScriptのコードです。SQLで取得したデータをループで処理しながら、1つのメッセージにまとめます。

returnで返却するオブジェクトが次のノードに渡されます。エヌ・エイト・エヌが期待する形で渡さないといけないので、ここは多少試行錯誤が必要でした。

  • 配列にする
  • JSONオブジェクトを1つ作成し、項目 ‘json’ を持たせる
  • ‘json’ の中に、実際に次のノードで利用できるオブジェクトを記述する。ここでは、’message’ 項目をもつ1つだけのJSONオブジェクトにしていますので、次のノードでは常に1件だけ受け取ります。

Function

ここで作成された ‘message’ を、メールで送信するのが次のノードです。

メール送信には 「Send Mail」ノードを使うべきなのですが、ここでは「Function」ノードを利用して、JavaScriptでメールを送信しています。JavaScriptの「nodemailer.js」を利用するサンプルになっています。nodemailer.js は、事前にエヌ・エイト・エヌのインストールしてあるサーバで使えるようにしておく必要があります(https://nodemailer.com/)。

また、エヌ・エイト・エヌにも、外部ライブラリの利用を許可する必要があります。

(詳しくはドキュメント参照: https://docs.n8n.io/getting-started/installation/advanced/configuration.html#use-built-in-and-external-modules-in-function-nodes )

コードが長いので引用しておきます:

// nodemailerの読み込み
const NodeMailer = require('nodemailer')

let message = '担当者各位\n\n' + 
              'エラーログを送付します。\n\n' +
              '※本メールは10分置きにシステムのエラーログをまとめて送信します。\n\n' +
              '---------------------------------------------------------- \n'

// SMTP情報を格納
const smtpData = {
  host: 'smtp.my-company.com', // SMTPサーバ
  port: '587',            // ポート
  secure: atrue,           // true = SSL
  auth: {
    user: 'admin@my-company.com',  // メールアドレス(自身のアドレスを指定)
    pass: 'MYPASSWORD'            // パスワード(自身のパスワードを指定)
  },
  tls: {
      rejectUnauthorized: false
  }
}
console.log(items[0].json.message)

// 送信内容を作成
const mailData = {
  from: 'admin@my-company.com',
  to: 'team-members@my-company.com',         // 送信先
  subject: 'システム警告発生メール',          // 件名
  text: message + items[0].json.message,    // 通常のメール本文
  html: message + items[0].json.message,    // HTMLメール
}

// メールを送信
// SMTPサーバの情報をまとめる
const smtp = NodeMailer.createTransport(smtpData)

let result

// メール送信
let sendEmail = async() => {
  return new Promise((resolve, reject) => {
    smtp.sendMail(mailData, function (error, info) {
      if (error) {
        // エラー処理
        console.log(error)
        reject(error)
        result = error
      } else {
        // 送信時処理
        console.log('Email sent: ' + info.response)
        resolve(info)
        result = info
      }
    })
  })
}

await sendEmail()

// メール送信結果を返す
return [ { json: { result: result.response }} ]

MySQL

最後のノードは、メールを送信した後にデータを削除する部分です。前述したとおり、実際には送信済みのデータのみ削除する工夫が必要ですが、ここでは単に全件削除のSQLを登録してあります。

エヌ・エイト・エヌでしか出来ないこともある

エヌ・エイト・エヌのコミュニティを見ていると、エヌ・エイト・エヌでしか出来ないこと、として、秒単位での繰り返しタスクの話題があがります。Zapierはクラウドサービスなので、一社でリソースを自由に使うということが難しく、それなりのお金を出さないと実現出来ませんが、エヌ・エイト・エヌならば自社サーバに入れるだけなので、自由に使えます。

また、Nodeの外部ライブラリを使うことも出来るので、便利なJavaScriptを使って、業務改善を企画することも出来ます。

(まだ使ったことがありませんが、「SSH」というノードもあります。リモートサーバへSSHでログインして定期作業をする、といったことも出来るのかもしれません。)

他にも便利な機能として、エヌ・エイト・エヌでは作成したスクリプトを、エクスポートしてソースファイルとして保存しておくことも出来ます。内容はテキストエディタで参照出来るJSON形式なので、読みやすく、テキストファイルなのでバージョン管理も簡単です。

作成したスクリプトをJSON形式で保存できる

本稿の最後に、エヌ・エイト・エヌの苦手な部分も触れてみます。オープンソースで日々開発が進んでいる状況なので、まだまだ実用に耐えない部分もあるかもしれませんが、サイロ化したシステム間の連携が、DXやCXの必要に押されて急激に進む中、

自由にコードを追加出来ることで、可能性が広がるエヌ・エイト・エヌ(n8n)によるワークフロー自動化

以上、サンプルなので最低限度の機能にしましたが、

  • 10分ごとに
  • 自社内のデータベースに接続して
  • 必要な情報を取得し
  • 外部システム(今回はメールサーバ)と連係してメールを送信する

というワークフローを、エヌ・エイト・エヌで構築してみました。これだけだとわざわざエヌ・エイト・エヌを使わなくても、実現出来るかもしれませんが、こうしたワークフローに、他のノードを追加することで、様々な連携を実現出来ます。例えば:

  • Slasckノードを追加して、データベースの値をチャットメッセージに送信
  • 他システムからのログ・データベースの値によって、Google Task にタスクを作成
  • 受注伝票データベースをモニタリングして、特定の商品を購入された顧客のCRMを更新してキャンペーンメールを送信

といったことも、エヌ・エイト・エヌと多少のコーディングで、実現出来そうです。

ITシステムの、ちょっとした改善に、エヌ・エイト・エヌがあれば、気軽に取り組むことが出来ます。

エヌ・エイト・エヌ(n8n)に足りない機能

Zapierと比べると見劣りはするものの、エヌ・エイト・エヌならではの機能もあるというご紹介をさせて頂きました。

しかし、エヌ・エイト・エヌが万全な訳では勿論ありません。苦手とすることもあります。導入前に押さえて置きたい制約事項をいくつか紹介します。

ユーザ管理と認証機能がない

エヌ・エイト・エヌはWebアプリとして登場しましたが、ユーザ管理と認証機能が、未だありません。

開発チームも十分認識はしているようですし、n8n.cloud というベータ版のクラウドサービスも開始しているので、認証機能の開発も進んではいると思いますが、オープンソース版ではまだ実装されていません。

デスクトップアプリを個人的に使う場合や、自社内サーバで使うだけならば、運用で管理出来ますが、外部サーバで本格的に利用しようとすると、対策を考えておく必要があります。

  • IPアドレスによる制限
  • BASIC認証

などがすぐに導入出来る対策でしょう。

複数のワークフローをモニタする機能がない

説明出来ていませんが、エヌ・エイト・エヌには実行履歴の機能があります。

ワークフローの実行時にエラーが発生した場合、エラーの内容を後から確認出来ます。エラーの状態を調べたりするには、非常に便利な機能です。

しかし、「現在全てのワークフローが問題なく機能しているかどうか」を、一覧ですぐに把握することが出来ません。今後改善されると良いと思う点の一つです。

日本語によるサポートやコミュニティがない

アプリ自体は英語メニューになっていますし、コミュニティも英語主体になっています。ノーコード・ツールとはいえ、何か調べようとすると、英語で調べる必要があるのが現状です。

まとめ

オープンソースかつ、フェア・コードなワークフロー自動化ツール、エヌ・エイト・エヌ(n8n)を、ご紹介させて頂きました。

ちょっとした自動化や、既存システムの改善、システム間連携の促進、といったことを実験的に行ったり、スピード感もって実装したりといったケースでは、面白いツールだと思います。

試してみたい、または、導入を検討してみたい、けれども自分たちだけでは難しい、という場合には、ご相談頂ければ、エヌ・エイト・エヌを使ったDXや業務改善のお手伝いをさせて頂きます。