💃

n8nをCloud Runで動かした話

2024/01/28に公開

はじめに

n8nというオートメーションツールをCloud Run上にデプロイし、安価にワークフローを楽に作れる仕組みを手に入れることを目的としています。
Cloud Runを使うということで、Google Cloudに対する知見があることが前提です。

対象とする方は

  • 個人でオートメーションツールを安価に導入することを検討している方
  • n8nは知っているが、セルフホスティングをk8s使わずにGoogle Cloudでやりたい方
  • n8nのドキュメントにCloud Runでもホスティングできると書かれてあるのに、サンプルがなくて泣きそうになっている方(年末年始の私の状態w)

n8nとは

zapierのようなオートメーションツールで、デフォルトで用意されているサービスとの連携をしながら、ワークフローを作っていけるツールになっています。

https://n8n.io/

例えば、NotionやOpenAIとの連携も準備されているものがあり、シュッとやりたいことをいつも使っているサービスを使いながら叶えることができます。
かつ、セルフホスティングであってもユーザー管理が可能です。(2段階認証とかも設定できる。。!)
詳細は、ぜひ公式でご確認ください。
(UIもリッチでwhimsicalっぽくて使いやすいのがお気に入り)

今回はn8nのセルフホスティングをCloud Run上で行うまでがターゲットになります。
ローカル上で試す方法はn8nの公式ドキュメントで書かれており、npx n8nで動くはずなのでnode.jsをインストールしてnpmが使えるようになっていれば、すぐに実行できるはずです。(詳しくは公式を)

今回扱うこと

Google Cloud上でCloud Runにデプロイするまで
※ Google Cloudでの諸々やn8n自体については扱わないです。あくまで、Google Cloudなどの知見がある方を対象とします。

github上で実際に私がデプロイしているコードはこちらです。
https://github.com/ksmsto/n8n-test

Cloud Runを使いたいと思った理由は、単純にDockerfileがあれば、面倒な設定なども不要でバージョニングもArtifact Registryにどんどん入れて、向き先変更すればいいだけなのがお手軽だなと思ったからです。開発体験がめちゃくちゃにいい。だし、安い。

下準備

  • Google Cloudの準備
    • 今回用のプロジェクトを作成
    • Cloud Run・Artifact Registryを有効に
      • Artifact Registryはレポジトリも作ってください
    • gcloudコマンドが対象プロジェクトで使えるように設定
  • コードを上記レポジトリからclone
  • PostgreSQLのインスタンスの準備
    • 下にElephantSQLでタダで用意する方法記載あります。お好みで

流れ

レポジトリからArtifact Registryにデプロイ

下記の内容での

  • region
  • gcp project id
  • artifact registry name
    の部分はご自身の状態に合わせてください

ちなみに、私はregionはus-central1で設定しています。
(最安だし、個人で使う分には全く問題なくサクサク動作している)

ローカルでDockerfileをビルド

$ docker build -t {region}-docker.pkg.dev/{gcp project id}/{artifact registry name}/n8n --platform amd64 .

ビルド物をArtifact Registryにデプロイ

$ docker push {region}-docker.pkg.dev/{gcp project id}/{artifact registry name}/n8n

Cloud Runで操作

サービスを作成から

  1. 既存のコンテナ イメージから1つのリビジョンをデプロイする -> Artifact Registryにあげたものを選択
  2. サービス名・リージョンを適当に
  3. CPU割り当ては「リクエストの処理中にのみCPUを割り当てる」
  4. 自動スケーリングはデフォルトのまま(0 ~ 100) ※追記に詳細
  5. 上り(内向き)の制御は「すべて」
  6. 認証は「未認証の呼び出しを許可」
  7. 「コンテナ、ボリューム、ネットワーキング、セキュリティ」をクリックして開く
  8. コンテナの編集にあるコンテナポートを5678に
  9. コンテナの編集にある変数とシークレットを以下画像のように追加する
  10. 作成ボタンをポチッと!

9の部分だけ補足が必要なので、以下の通りの内容を入力していってください。

以下postgresqlでのデータベースの情報
DB_POSTGRESDB_DATABASE:DB名
DB_POSTGRESDB_HOST: ホスト
DB_POSTGRESDB_PORT: ポート(postgresなら5432が多そう)
DB_POSTGRESDB_USER: ユーザー名
DB_POSTGRESDB_SCHEMA: スキーマ
DB_POSTGRESDB_PASSWORD: パスワード
(elephantSQLを例にしたものは追記に記載)

あとは、別途でこれも
N8N_ENCRYPTION_KEY: n8n内での認証情報を暗号化するためのキー
(ないと認証情報が読み込めないというエラーが普通に出てくる)
特段どこかに紐付けるべき情報でもないと思うので、任意の文字列を生成してブッこめばOKです。

作成後

一番最初にアクセスすると、「n8n is starting up. Please wait」という文字が出てくると思います。
そして、n8nの準備が終わるまで「Cannot GET /」のような文言が出ます。
1分以内には動くようになり、ユーザー設定画面が表示されるようになるので、そこでアカウント情報を入れてください。
あとは、n8nの世界を楽しむだけです!!

追記

ElephantSQLについて

https://www.elephantsql.com/

クラウド上のPostgreSQLデータベースのホスティングを提供するサービスで無料で20MB使えます。
1ヶ月使って、8MB使用している状態なのですが全然問題ないですし、$5払えば500MB使えるので十分じゃないかな〜と思っています。

ちなみに、登録してDB生成すると、下記画像とCloud Runの環境変数がこの通りで設定することで適応されます。
DB_POSTGRESDB_DATABASE:「User & Default database」
DB_POSTGRESDB_HOST: 「Server」
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: 「User & Default database」
DB_POSTGRESDB_SCHEMA: public
DB_POSTGRESDB_PASSWORD: 「Password」

(諸々雑に消しています。。!)

自動スケーリングについて

0 ~ 100がデフォルトなのですが、1 ~で設定するとn8nは基本起動し続けるのですが課金され続けてしまいます。個人利用レベルで問題ないのであれば、0 ~の方がお得だと思います。
上限はよしなにお好みで。

どのくらい課金あるか


現状こんな感じで、いっても500円は越えなさそう。


最初にCloudSQLを試そうとした結果分も乗っかっているので、実質200円程ですかね。
(CloudSQL高いいいい。使用ごとに停止するもいいが、不便になるので諦め)

1日だけ数時間ガッツリ使ったのでその日だけ伸びているけど、という感じ。
多分、しっかり使ったとしても個人レベルだと1,000円ちょいで収まるんじゃないかなと。

n8nのStarterの料金が30ユーロからなので、1/3くらいのコスト感で使えそう。
ElephantSQLを500MB使えるようにしても半額程度なので、結構いいのではと思っています。

なぜ、n8nのDockerhubにあるものを使わないのか

多分、動くとは思うんですけど、postgresの設定を同じようにしたところ反映されてなさそうだったんですよね。
すでに記載のレポジトリのDockerfileを作って検証完了していたので、やる気が起きずにこのままにしています。あと、起動が若干作ったものの方が早いです。体感で1分なのが、Dockerhubのをまま使うと2,3分はかかる感覚。

n8nのバージョンについて

Dockerfile内の

ARG N8N_VERSION="1.23.0"

を任意のものに変更してください。

現状(2024/01/28)は1.26.0なので、変更してもいいかもしれません。
バージョンについては、こちら参照ください。
https://docs.n8n.io/release-notes/

実際の使い道

HTTP Requestをしてデータをとってきて加工して、Notion DBにぶっ込んでいくみたいなことはかなり試してみました。それをGPTにぶっ込んだりして、聞きたいことの精度をあげています。

他には、discordでbotを作っていて、そいつの命令をn8nに渡して実行するようなワークフローを運用していたりします。

n8nのインテグレーションはかなり量もあるので、これできないかな?ベースで色々見ていくと面白いです!

次の記事では、n8nを通してスクレイピングする方法をお伝えします〜〜!

Discussion