在 Google Cloud Run 上部署及執行 n8n

1. 簡介

在本程式碼研究室中,您將在 Google Cloud Run 上設定 n8n。n8n 是一種開放原始碼工作流程自動化工具,可讓使用者連結不同應用程式和服務,自動執行重複性工作。

本程式碼研究室以 n8n 說明文件指南為基礎,說明如何在 Google Cloud Run 上代管 n8n。我們將安裝及設定 n8n 版本,在 Cloud Run 上部署更耐用的 n8n 生產環境。包括用於保存資料的資料庫,以及用於機密資料的密鑰管理工具等資源。

執行步驟

  • Google Cloud Run 上部署 n8n,這是全代管的無伺服器運算平台,可在 Google 的基礎架構上執行無狀態容器。

課程內容

  • 佈建並填入 PostgreSQL 適用的 Cloud SQL 資料庫,做為 n8n 安裝作業的持久耐用版本。
  • 將 n8n 容器映像檔佈建至 Google Cloud Run。
  • 測試在 Google Cloud Run 安裝 n8n。

軟硬體需求

  • Chrome 網路瀏覽器
  • Gmail 帳戶
  • 已啟用計費功能的 Cloud 專案

2. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  3. 您將使用 Cloud Shell,這是 Google Cloud 中執行的指令列環境,且已預先載入 bq。點選 Google Cloud 控制台頂端的「啟用 Cloud Shell」。

「啟用 Cloud Shell」按鈕圖片

  1. 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
  1. 如果未設定專案,請使用下列指令來設定:
gcloud config set project <YOUR_PROJECT_ID>
  1. 透過下列指令啟用必要的 API。這可能需要幾分鐘的時間,請耐心等候。
gcloud services enable run.googleapis.com \
                       sqladmin.googleapis.com \
                       secretmanager.googleapis.com 

成功執行指令後,您應該會看到類似下方的訊息:

Operation "operations/..." finished successfully.

如果遺漏任何 API,您隨時可以在導入過程中啟用。如要瞭解 gcloud 指令和用法,請參閱說明文件

最後,我們要設定幾個環境變數,這些變數將用於後續步驟中執行的指令碼。在 Cloud Shell 終端機中執行下列兩項指令 (請記得將 GCP_PROJECT_IDGCP_REGION 替換成專案 ID 和區域 (例如 us-central1) 的相應值,您希望在此區域完成部署作業。我們將使用 us-central1 進行部署。

export PROJECT_ID=GCP_PROJECT_ID
export REGION=us-central1

3. 建立 Cloud SQL 執行個體

我們將使用 Google Cloud SQL for PostgreSQL 執行個體,做為儲存 n8n 執行個體和執行資料的持久層。這是為了確保設定的持久性。

PostgreSQL 適用的 Cloud SQL 是一項全代管資料庫服務,可協助您在 Google Cloud Platform 中設定、維護及管理 PostgreSQL 關聯資料庫。

在 Cloud Shell 中執行下列指令,即可建立執行個體:

gcloud sql instances create n8n-db \
--database-version=POSTGRES_15 \
--tier db-g1-small \
--region=us-central1 \
--edition=ENTERPRISE \
--root-password=postgres

執行這項指令大約需要 5 分鐘。指令成功執行後,您應該會看到輸出內容,指出指令已完成,以及 Cloud SQL 執行個體資訊,例如 NAME、DATABASE_VERSION、LOCATION 等。

請注意,我們已將 root-password 值做為 postgres 使用。如果變更為其他名稱,請務必記住。

4. 設定 n8n 資料庫和資料庫使用者憑證

現在 PostgreSQL 適用的 Cloud SQL 執行個體已準備就緒,我們可以在其中建立 n8n 資料庫,並將資料庫密碼和加密金鑰儲存在 Google Cloud Secrets Manager 中。

首先,我們要在建立的 Cloud SQL 執行個體 (n8n-db) 中,建立名為 n8n 的資料庫。下列所有指令都必須在 Google Cloud Shell 終端機中執行。

gcloud sql databases create n8n --instance=n8n-db

成功建立後,您應該會看到如下訊息:

Creating Cloud SQL database...done.                                                                                                                                                                                                           
Created database [n8n].
instance: n8n-db
name: n8n
project: YOUR_GCP_PROJECT_ID

資料庫建立完成後,請為該資料庫建立使用者帳戶。我們將使用下列憑證:

  • 使用者 ID:n8n-user
  • 密碼:n8n

注意:如要使用其他強度更高的密碼 (建議用於正式環境),請改用該密碼,不要使用我們在此選擇的密碼 (即 n8n),但請務必在接下來的幾個指令中也使用該密碼。

建立資料庫使用者的指令如下:

gcloud sql users create n8n-user \
    --instance=n8n-db \
    --password="n8n"

此時,建議將使用者資料庫密碼和加密金鑰的憑證儲存至 Google Cloud Secret Manager,這個安全又便利的儲存系統可儲存 API 金鑰、密碼、憑證和其他機密資料。

首先,請使用下列指令取得我們使用的密碼 (n8n)),並將其管道化至 gcloud secrets create 指令。我們的密鑰為 n8n-db-password

printf "n8n" | gcloud secrets create n8n-db-password --replication-policy="automatic" --data-file=-        

同樣地,我們將使用下一組指令產生加密金鑰,然後建立保存該值的密鑰變數 n8n-encryption-key。

openssl rand -base64 -out my-encryption-key 42

gcloud secrets create n8n-encryption-key \
    --data-file=my-encryption-key \
    --replication-policy="automatic"        

5. 為 Google Cloud Run 建立服務帳戶

我們會在下一個步驟中,將 n8n 部署至 Google Cloud Run。為此,我們將建立服務帳戶,供 Cloud Run 執行 n8n 工作流程。為此,我們希望確保建立的服務帳戶在 Google Cloud 上只具備最低必要角色/權限。

根據目前需求,我們需要為建立的服務帳戶指派下列角色:

  • roles/cloudsql.client:服務帳戶必須具備這項權限,才能存取 Cloud SQL 資料庫
  • roles/secretAccessor:我們需要提供這個角色,才能存取 n8n-db-passwordn8n-encryption-key 的 Secret Manager 金鑰。

我們馬上開始!下列所有指令都必須在 Google Cloud Shell 中執行。第一個指令會建立服務帳戶,然後我們提供討論過的必要角色。依序執行每個指令。如果系統要求為下列任一指令指定條件,請選擇 "None"

gcloud iam service-accounts create n8n-service-account \
    --display-name="n8n Service Account"

export SA_NAME=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

gcloud secrets add-iam-policy-binding n8n-db-password \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding n8n-encryption-key \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/cloudsql.client"

我們現在要將 n8n 容器映像檔部署至 Google Cloud Run。

6. 將 n8n 部署至 Google Cloud Run

在 Google Cloud Shell 中執行下列指令:

gcloud run deploy n8n \
    --image=n8nio/n8n:latest \
    --command="/bin/sh" \
    --args="-c,sleep 5;n8n start" \
    --region=$REGION \
    --allow-unauthenticated \
    --port=5678 \
    --memory=2Gi \
    --no-cpu-throttling \
    --set-env-vars="N8N_PORT=5678,N8N_PROTOCOL=https,DB_TYPE=postgresdb,DB_POSTGRESDB_DATABASE=n8n,DB_POSTGRESDB_USER=n8n-user,DB_POSTGRESDB_HOST=/cloudsql/$PROJECT_ID:$REGION:n8n-db,DB_POSTGRESDB_PORT=5432,DB_POSTGRESDB_SCHEMA=public,GENERIC_TIMEZONE=UTC,QUEUE_HEALTH_CHECK_ACTIVE=true" \
    --set-secrets="DB_POSTGRESDB_PASSWORD=n8n-db-password:latest,N8N_ENCRYPTION_KEY=n8n-encryption-key:latest" \
    --add-cloudsql-instances=$PROJECT_ID:$REGION:n8n-db \
    --service-account=$SA_NAME

部署作業大約需要一分鐘。部署成功後,您應該會看到類似下方的訊息:

Deploying container to Cloud Run service [n8n] in project [YOUR_PROJECT_ID] region [us-central1]
Deploying new service...                                                                                                                                                                                                                      
  Setting IAM Policy...done                                                                                                                                                                                                                   
  Creating Revision...done                                                                                                                                                                                                                    
  Routing traffic...done                                                                                                                                                                                                                      
Done.                                                                                                                                                                                                                                         
Service [n8n] revision [n8n-00001-8nh] has been deployed and is serving 100 percent of traffic.
Service URL: https://n8n-<SOME_ID>.us-central1.run.app

請記下上述輸出內容中的服務網址,因為您會在下一個步驟中使用該網址啟動 n8n 控制台。

7. 執行 n8n 工作流程

啟動瀏覽器,然後前往上一步取得的服務網址。您也可以從 Cloud Run 首頁取得服務網址,該頁面會將 n8n 列為其中一項服務。

注意:如果系統顯示 Cannot GET / 畫面或 n8n is starting up 錯誤,通常表示 n8n 仍在啟動中。你可以重新整理頁面,系統最終應會載入。

最後您會看到如下所示的畫面,可在此設定擁有者帳戶:

5a3b1d60d02b13ec.png

填寫必要詳細資料,記下密碼並完成設定。您可以略過部分步驟,包括要求傳送授權金鑰的步驟。

如果一切順利,您應該會看到 n8n 的首頁,如下所示:

3e072e9189ff9464.png

如果您熟悉 n8n,應該可以順利完成本實驗室。

如要試用 n8n,可以嘗試下列工作流程:

  1. 按一下「憑證」,然後點選「新增第一個憑證」

14a1f3d2098a266c.png

  1. 我們會設定 Gemini API 金鑰憑證。輸入「gemini」叫出 Google Gemini (PaLM) API 選項,然後點選「繼續」

7f48bfe35e5d9e98.png

  1. 你可以前往 https://aistudio.google.com/app/api-keys 取得 Gemini API 金鑰。
  2. 取得金鑰後,請貼上金鑰。n8n 會驗證金鑰,憑證現在已設定完成。

3f31cbfc5072f113.png 5. 現在前往「工作流程」選項,然後按一下「從頭開始」或建立新的工作流程。這時會顯示空白畫布,您可以在其中建立下列兩個節點:一個是觸發條件 (簡單對話),另一個是代理程式。我們將設定建立的憑證,讓代理程式模型成為 Google Gemini。最後,您應該會看到如下所示的工作流程:

8f394e456ae7d1a.png

  1. 你可以透過即時通訊窗格執行這項工作流程,如果一切順利,系統就會回覆你的提示。執行畫面範例如下所示:

aec85c84f65d0da1.png

這樣就完成了 Google Cloud Run 上 n8n 部署作業的驗證。

8. 清除

如果您選擇使用本程式碼研究室,瞭解如何在 Google Cloud Run 上安裝及執行 n8n,而非用於正式環境 / 永久需求,請務必刪除本研討會期間建立的資源,以免系統持續向您的 Google Cloud 帳戶收取費用。

我們將刪除 Cloud SQL 執行個體,以及已部署的 Cloud Run 服務。

請根據專案和區域,確認下列環境變數是否設定正確:

export PROJECT_ID="YOUR_PROJECT_ID"
export REGION="YOUR_REGION"

下列兩個指令會刪除我們部署的 Cloud Run 服務:

gcloud run services delete n8n --platform=managed --region=${REGION} --project=${PROJECT_ID} --quiet

下列指令會刪除 Cloud SQL 執行個體:

gcloud sql instances delete n8n-db

下列兩個指令會刪除我們建立的 Secret Manager 金鑰:

gcloud secrets delete n8n-db-password

gcloud secrets delete n8n-encryption-key

9. 恭喜

恭喜!您已成功在 Google Cloud Run 部署 n8n,並透過範例工作流程驗證設定。

參考文件