三分鐘學會如何在函式計算中使用 puppeteer

暖夏未眠丶發表於2018-06-19

摘要:
使用 puppeteer 結合函式計算,可以快速的構建彈性的服務完成各種功能,包括:生成網頁截圖或者 PDF、高階爬蟲,可以爬取大量非同步渲染內容的網頁、模擬鍵盤輸入、表單自動提交、登入網頁等,實現 UI 自動化測試和捕獲站點的時間線,以便追蹤你的網站,幫助分析網站效能問題

簡介

使用 puppeteer 結合函式計算,可以快速的構建彈性的服務完成各種功能,包括:

  • 生成網頁截圖或者 PDF
  • 高階爬蟲,可以爬取大量非同步渲染內容的網頁
  • 模擬鍵盤輸入、表單自動提交、登入網頁等,實現 UI 自動化測試
  • 捕獲站點的時間線,以便追蹤你的網站,幫助分析網站效能問題

接下來,將基於一個腳手架專案開發我們自己 puppeteer 專案。

下載專案

>>> git clone -o starter-kit https://github.com/awesome-fc/puppeteer-fc-starter-kit.git your_project_name複製程式碼

專案結構

├── lib                         chrome headless 依賴的共享庫,打包的時候,拷貝到打包專案的根目錄下
├── chrome                           
│   ├── buildChrome.sh          編譯 chrome headless shell 指令碼,基於它,可以編譯最新的版本
│   └── headless_shell.tar.gz   編譯後的 chrome headless 二進位制打包檔案
├── src
│   ├── index.js                函式呼叫入口檔案,函式 handler 為 index.handler,您的業務程式碼寫在這裡
│   └── starter-kit
│       ├── config.js           通過環境變數,獲取相關配置屬性,如:chrome 執行目錄和安裝目錄等配置
│       ├── local.js            本地測試操作 chrome headless 的 API 是否正確,通過執行命令:npm run local
│       └── setup.js            安裝 chrome headless 相關邏輯程式碼,如:基於 OSS 安裝或者本地目錄安裝
├── package.json
└── package.zip                 輸出函式計算打包檔案,通過命令:npm run package 或 npm run package-nochrome 複製程式碼

如何寫業務程式碼

index.js 檔案

const setup = require('./starter-kit/setup');

exports.handler = async (event, context, callback) => {
  const browser = await setup.getBrowser(context);
  exports.run(browser).then(
    (result) => callback(null, result)
  ).catch(
    (err) => callback(err)
  );
};

exports.run = async (browser) => {
  // 實現您自己的業務程式碼
  // 下面是一個示例程式碼,需要替換成您自己的業務程式碼
  // 示例實現了對固定網頁截圖並返回圖片的功能
  const page = await browser.newPage();
  await page.goto('https://fc.console.aliyun.com');
  return page.screenshot({
    clip: {
      x: 200,
      y: 60,
      width: 780,
      height: 450,
    },
  });
};複製程式碼

本地測試

執行命令: npm run local 。測試您操作 chrome headless 的相關 api 是否正確執行。

編譯打包

包含 chrome headless

執行命令:npm run package 。命令會將 chrome headless 檔案一起打包進專案,放在專案根目錄,函式執行的時候,預設將 chrome headless 安裝到 /tmp 目錄。

不包含 chrome headless

執行命令:npm run package-nochrome 。命令不會將 chrome headless 檔案一起打包進專案,你需要額外將 chrome-headless 上傳到 OSS,通過環境變數告訴函式如何從 OSS 下載並安裝,預設將 chrome headless 安裝到 /tmp 目錄。為函式計算設定環境變數:

  • CHROME_BUCKET(必填): chrome headless 上傳到 OSS 的 bucket
  • CHROME_REGION(必填): chrome headless 上傳到 OSS 的 region
  • CHROME_KEY(必填): chrome headless 上傳到 OSS 的 key. 預設值: headless_shell.tar.gz

部署

編譯打包輸出的檔案:package.zip,通過函式計算控制檯或者 fcli 命令工具上傳已打包檔案。fcli 上傳已打包檔案命令:

# 在相應 service 目錄下
>>> mkf myFunction -h index.handler -f package.zip -t nodejs8 # 程式碼在本地的 package.zip 中複製程式碼

為什麼要使用函式計算

函式計算是一個相對較新的事物,可能大部分開發人員或架構師對它很陌生。微服務架構是當下很流行的一種系統架構,微服務架構有沒有不夠完美的地方?答案是肯定的。基於微服務架構,我們需要考慮使用什麼微服務框架來架構系統、需要多少臺伺服器、如何有效減輕運維負擔等一些列問題。另外,按照《福布斯》雜誌的統計,在商業和企業資料中心的典型伺服器僅提供 5%~15% 的平均最大處理能力的輸出。這無疑是一種資源的巨大浪費。

有沒有辦法解決上面的不足?答案也是肯定的,阿里雲函式計算就是在這樣的背景下應運而生的。如果把雲端計算理解成一個執行環境,那麼,在這個環境裡,函式(即業務邏輯的載體)+ 資料(即跟業務相關的輸入與輸出)就是應用的核心,有了函式、資料、事件這三者,其它任何程式碼和框架,無非是整個應用的膠水和UI罷了。那麼,最理想的情況就是用最少的時間寫膠水,將更多的時間投入到核心應用的開發中,甚至,徹底實現整個軟體棧的微服務化。函式計算就是這裡的膠水。

開發效率

專案開發效率傳統微服務方式函式計算方式
採購伺服器等基礎設施需要不需要
管理伺服器等基礎設施需要不需要
開發業務服務模組需要需要
部署業務服務模組需要需要,但是很簡單,提供了很多工具
通過 nginx 搭建反向代理、https 和負載均衡需要不需要,通過阿里雲 API 閘道器或函式 HTTP 觸發器可以實現
搭建相關日誌服務需要不需要,通過日誌開關開啟日誌服務
配置安全訪問規則需要不需要,自帶基礎安全訪問配置,API 閘道器提供更多的配置
運維負擔
開發效率高,通常幾天就能完成

可靠性

專案可靠性傳統微服務方式函式計算方式
峰值壓力當峰值壓力突增時,計算資源擴容不及時容易導致服務過載彈性伸縮,面對峰值壓力
錯誤處理需要自行處理伺服器當機,程式崩潰等問題無需處理伺服器等故障,函式計算實現基礎設施的容錯
專案架構基礎設施管理比較複雜系統架構經過大量專案的驗證和長時間的打磨,相對穩定可靠很多

成本

專案成本傳統微服務方式函式計算方式
採購伺服器等基礎設施成本成本高,利用率低
程式碼開發成本成本高,包含基礎架構程式碼和業務程式碼成本低,只需關注業務程式碼開發
函式計算成本成本低,按需付費,每月還有一定免額
運維成本成本高,難度大成本低,難度很小,甚至可以不需要專門的運維人員
整合阿里雲其他產品成本,如 OSS 和RDS 等成本高成本低,提供對阿里雲其他產品無縫整合

安全

專案安全傳統微服務方式函式計算方式
身份認證和訪問控制需自行實現除非您顯式的允許匿名呼叫函式,函式計算將對每一個 API 呼叫進行身份驗證。只有獲得您的顯式授權(藉助於阿里雲訪問控制服務,RAM),您的函式才可以訪問其他雲服務資源或者被其他使用者/雲服務呼叫。藉助阿里雲 API 閘道器,您也可以使用 OpenID 等機制對函式呼叫進行身份驗證
操作追蹤和審計需自行實現需自行實現
資料安全需自行實現通過使用訪問控制授權和函式計算環境變數等功能,您不必再將訪問憑證等敏感資訊儲存在程式碼中。所有您藉助函式計算服務持久化儲存的資料,包括程式碼、環境變數等等,都被加密儲存。系統在執行程式碼之前,將對程式碼進行完整性檢測
執行時安全需自行實現每個函式都在獨立的、隔離的環境中被執行。函式計算提供與阿里雲彈性計算(ECS)相同的隔離強度。函式計算會週期性的重置執行時環境,並自動更新作業系統以及執行時依賴軟體的安全補丁
異常響應需自行實現函式計算允許您設定資源使用的上限,確保您的費用消耗可控。同時,函式計算提供函式呼叫次數,流控次數,錯誤率等指標。藉助雲監控,您可以為相關指標設定監控報警,快速響應異常情況

總結

函式計算有如下優勢:

  • 無需採購和管理伺服器等基礎設施
  • 專注業務邏輯的開發
  • 提供日誌查詢、效能監控、報警等功能快速排查故障
  • 以事件驅動的方式觸發應用響應使用者請求
  • 毫秒級別彈性伸縮,快速實現底層擴容以應對峰值壓力
  • 按需付費。只需為實際使用的計算資源付費,適合有明顯波峰波谷的使用者訪問場景
  • 原文連結


相關文章