# [Cloud Run] OB to GCS ## 使用 Google Cloud Run 定時執行任務 > 使用 Cloud Run,因為它支持容器化部署,可以包含 Playwright 所需的瀏覽器依賴。 Google Cloud Run 本身並不支援內建的排程,但可以結合 Google Cloud Scheduler 設定時間間隔來觸發 Cloud Run,例如每日執行一次。 ## 步驟: ### 1. 部署 Cloud Run 來執行 Playwright 爬蟲並上傳檔案 Google Cloud Run 支持容器化部署,可以包含 Playwright 所需的瀏覽器依賴。 #### 部署至 Cloud Run 的步驟: 1. 撰寫 Dockerfile,定義包含 Playwright 和必要的 Node.js 程式碼的容器。 2. 部署容器到 Cloud Run,並將它設定為公開訪問或僅允許 Cloud Scheduler 的服務帳戶訪問。 以下是 Dockerfile 範例: ``` # 使用 Node.js 的 Playwright 基礎映像檔 FROM mcr.microsoft.com/playwright:v1.27.1-focal # 設定工作目錄 WORKDIR /app # 複製 package.json 並安裝相依套件 COPY package.json package-lock.json ./ RUN npm install # 複製應用程式碼 COPY . . # 暴露服務端口(Cloud Run 預設使用 $PORT 環境變數) EXPOSE 8080 # 啟動指令 CMD ["node", "index.js"] ``` Cloud Run 可以從 Docker Hub 部署。接著在程式碼中,新增一個 HTTP 端點供 Scheduler 呼叫。 ### 2. 設定 Cloud Scheduler 來定時觸發 Cloud Run 1. 開啟 Google Cloud Console,轉到 Cloud Scheduler。 2. 建立新任務,設定頻率(例如,每日一次)。 3. 指定目標為 HTTP,並輸入 Cloud Run 的 URL。 4. 設定認證(如有需要)以允許 Cloud Scheduler 呼叫 Cloud Run 服務。 ### 3. 確保 Cloud Run 的程式碼可執行下載與上傳邏輯 將你原本的 Playwright 登入、下載和 Google Cloud Storage 上傳邏輯放入這個 Cloud Run 專案的 index.js 中。Cloud Run 每次被 Scheduler 觸發時,會自動執行一次該流程。 # 建置 docker 專案步驟: 好的!下面我會詳細說明如何建置 Docker 專案,並把 Playwright 爬蟲和上傳到 Google Cloud Storage 的邏輯整合進去,然後再部署到 Google Cloud Run。 ## 步驟一:建立專案資料夾並安裝必要的檔案 1. 建立資料夾:首先,創建一個新的資料夾來儲存你的專案,例如 playwright-cloudrun。 2. 初始化專案:在該資料夾中執行以下命令來初始化 Node.js 專案並安裝所需套件。 ``` npm init -y npm install @google-cloud/storage playwright ``` 3. 建立主程式檔案:創建一個 index.js 檔案來寫入程式邏輯。 ## 步驟二:撰寫 index.js 程式碼 以下是 index.js 的範例程式碼,這段程式碼會執行以下操作: • 使用 Playwright 登入並下載檔案。 • 上傳檔案到 Google Cloud Storage。 ``` const { chromium } = require('playwright'); const { Storage } = require('@google-cloud/storage'); const path = require('path'); const fs = require('fs'); async function main() { const browser = await chromium.launch(); const context = await browser.newContext({ acceptDownloads: true }); const page = await context.newPage(); // OB 網站登入邏輯 await page.goto('https://example.com/login'); // 替換成 OB 網站的登入頁面 URL await page.fill('#username', 'your-username'); // 替換為實際使用者名稱和選擇器 await page.fill('#password', 'your-password'); // 替換為實際密碼和選擇器 await page.click('#loginButton'); // 替換為登入按鈕的選擇器 // 下載檔案 await page.waitForSelector('#downloadButton'); // 替換為下載按鈕的選擇器 const [download] = await Promise.all([ page.waitForEvent('download'), page.click('#downloadButton') ]); // 儲存下載的檔案 const downloadPath = await download.path(); const localFilePath = path.resolve('/tmp', 'downloaded-file.csv'); await download.saveAs(localFilePath); // 上傳到 Google Cloud Storage const storage = new Storage({ keyFilename: '/app/key.json' }); const bucket = storage.bucket('your-bucket-name'); await bucket.upload(localFilePath, { destination: 'folder-in-bucket/downloaded-file.csv', }); console.log('File uploaded to Google Cloud Storage successfully.'); // 清理 fs.unlinkSync(localFilePath); await browser.close(); } // HTTP 端點讓 Cloud Run 調用 const express = require('express'); const app = express(); app.get('/', async (req, res) => { try { await main(); res.status(200).send('Task completed successfully.'); } catch (error) { console.error(error); res.status(500).send('Task failed.'); } }); const PORT = process.env.PORT || 8080; app.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); }); ``` ## 步驟三:設定 Google Cloud Key 檔案 將 Google Cloud Storage 的服務帳戶金鑰檔案放入專案目錄中,並將檔案命名為 key.json。這個金鑰檔案將在上傳過程中使用。 ## 步驟四:撰寫 Dockerfile 在專案目錄中,創建一個 Dockerfile。這個檔案定義了如何建置 Docker 映像檔。 ``` # 使用 Playwright 的基礎映像檔 FROM mcr.microsoft.com/playwright:v1.27.1-focal # 設定工作目錄 WORKDIR /app # 複製 package.json 並安裝相依套件 COPY package.json package-lock.json ./ RUN npm install # 複製應用程式碼和金鑰檔案 COPY . . # 暴露服務端口 EXPOSE 8080 # 啟動應用程式 CMD ["node", "index.js"] ``` ## 步驟五:建置並部署到 Google Cloud Run 1. 建置 Docker 映像檔:在專案目錄下運行以下命令來建置 Docker 映像檔: ``` docker build -t gcr.io/YOUR_PROJECT_ID/playwright-cloudrun ``` 2. 將映像檔上傳到 Google Container Registry: ``` docker push gcr.io/YOUR_PROJECT_ID/playwright-cloudrun ``` 3. 部署到 Cloud Run: ``` gcloud run deploy playwright-cloudrun \ --image gcr.io/YOUR_PROJECT_ID/playwright-cloudrun \ --platform managed \ --region YOUR_REGION \ --allow-unauthenticated ``` 在部署過程中,指定 Cloud Run URL,稍後可以使用 Cloud Scheduler 來定期觸發該 URL。 ## 步驟六:使用 Cloud Scheduler 設定定時觸發 1. 開啟 Cloud Scheduler 並建立一個新任務。 2. 設定 頻率,如每日一次(0 8 * * * 表示每天 8 點)。 3. 目標 URL:輸入 Cloud Run 部署的 URL。 4. 設定 認證,選擇 不需要認證(如果允許公開訪問)或指定 Cloud Scheduler 的服務帳戶。 完成後,你的 Playwright 任務應該可以定時自動化執行,並將下載的檔案上傳至 Google Cloud Storage!如果有任何問題或需要更詳細的說明,隨時告訴我!