はじめに
n8n(nodemation)は、公式ページにもある通り、Zapierの代わりとなるオープンソースのワークフロー自動化ツールです。
以下youtubeにデモ動画がある通り、各種ツールの連携を比較的容易に出来るようになります。
構成
OpenShift on IBM Cloud上のアプリケーションとしてn8nをデプロイします。
OKDやminishiftでも同様の手順でデプロイ出来るかと思います。
手順
n8nアプリケーションのデプロイ
n8nをOpenshift上で普通に動かそうとすると、permissionが足りないためPodが立ち上がりません。
$ oc new-app n8nio/n8n
--> Found Docker image bec8c96 (24 hours old) from Docker Hub for "n8nio/n8n"
* An image stream tag will be created as "n8n:latest" that will track this image
* This image will be deployed in deployment config "n8n"
* The image does not expose any ports - if you want to load balance or send traffic to this component
you will need to create a service with 'expose dc/n8n --port=[port]' later
* WARNING: Image "n8nio/n8n" runs as the 'root' user which may not be permitted by your cluster administrator
--> Creating resources ...
imagestream.image.openshift.io "n8n" created
deploymentconfig.apps.openshift.io "n8n" created
--> Success
Run 'oc status' to view your app.
### Successしたように見えて、、、CrashLoopBackOffとなっています。
$ oc get pod
NAME READY STATUS RESTARTS AGE
n8n-1-flprw 0/1 CrashLoopBackOff 6 6m
イベントログを確認すると、
UserSettings got generated and saved to: /.n8n/config
(node:1) UnhandledPromiseRejectionWarning: Error: EACCES: permission denied, mkdir '/.n8n'
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:1) UnhandledPromiseRejectionWarning: Error: There was an error: EACCES: permission denied, mkdir '/.n8n'
at Object.error (/usr/local/lib/node_modules/n8n/node_modules/@oclif/errors/lib/index.js:22:17)
at Start.error (/usr/local/lib/node_modules/n8n/node_modules/@oclif/command/lib/command.js:57:23)
at /usr/local/lib/node_modules/n8n/dist/commands/start.js:112:22
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
OpneShiftはルート権限でのコンテナ操作を禁止しており、n8nはそれに引っかかってしまいます。
そのため、Security Context Constraintsとそれを割り当てたService Accountを用いて動かします。
まず以下コマンドでService Accountを作成します。
$ oc create sa with-anyuid
次にService Accountに、「anyuid」を付与しましょう。
$ oc adm policy add-scc-to-user anyuid -z with-anyuid --as system:admin
scc "anyuid" added to: ["system:serviceaccount:sandbox:with-anyuid"]
このService Accountを使って、Security Context Constraintsをコンテナに適用してみます。
先程起動に失敗したアプリケーションに対して以下コマンドでService Accountを適用します。
oc patch dc/n8n --patch '{"spec":{"template":{"spec":{"serviceAccountName": "with-anyuid"}}}}'
これで正しく起動するはずです。
Webブラウザ経由でアクセスするためのルート作成
アプリケーションが起動してきたら外部アクセス出来るように、以下コマンドでServiceとRouteを作成します。
$ oc expose dc/n8n --name=n8n --port=5678
service/n8n exposed
$ oc expose service n8n
route.route.openshift.io/n8n exposed
作成できたら、以下コマンドでアクセス用URLが確認できます。
$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
n8n n8n-default.testcluster-xxxxxxxxxyyyyyyyyyyzzzzzzzzzzz-0001.jp-tok.containers.appdomain.cloud n8n 5678 None
上記URLにhttpアクセスするとn8nのコンソール画面が表示されます。
http://n8n-default.testcluster-xxxxxxxxxyyyyyyyyyyzzzzzzzzzzz-0001.jp-tok.containers.appdomain.cloud
まだまだ連携出来るツールは少ないので、今後に期待です!