全部產品
Search
文件中心

Function Compute:官方公用層使用樣本

更新時間:Dec 10, 2024

在一些常見情境下,您可以使用Function Compute提供的官方公用層減少您的程式碼封裝體積。與自訂層相比,Function Compute官方公用層更便捷,針對各種程式設計語言預置了內建運行時環境和常見依賴包,您無需關注底層環境配置,直接選擇適用的公用層綁定到函數即可。本文介紹使用官方公用層的典型樣本。

使用說明

關於官方公用層的最新版本和使用說明,請參見awesome-layers

樣本一:基於Node.js 16和Puppeteer實現網頁截圖樣本程式

Puppeteer可以控制Chrome(或Chromium)實現很多自動化流程,例如網頁截圖、PDF產生、表單的自動認可、UI自動化測試或鍵盤輸入類比等。實際上,Puppeteer實現了一個基於Node.js的headless Chrome瀏覽器。

本樣本使用Puppeteer完成一個網頁截圖樣本程式。

  1. 建立事件函數。

    建立函數頁面,設定以下配置項,其餘配置項保持預設值即可。具體操作,請參見建立事件函數

    • 建立函數方式選擇事件函數

    • 運行環境選擇Node.js 16

    • 記憶體規格選擇1024 MB。

  2. 編輯函數代碼。在函數詳情頁面,單擊代碼頁簽,編輯index.js檔案中的函數代碼,然後單擊部署代碼

    程式碼範例如下。

    const fs = require('fs');
    const puppeteer = require('puppeteer');
    
    function autoScroll(page) {
      return page.evaluate(() => {
          return new Promise((resolve, reject) => {
              var totalHeight = 0;
              var distance = 100;
              var timer = setInterval(() => {
                  var scrollHeight = document.body.scrollHeight;
                  window.scrollBy(0, distance);
                  totalHeight += distance;
                  if (totalHeight >= scrollHeight) {
                      clearInterval(timer);
                      resolve();
                  }
              }, 100);
          })
      });
    }
    
    exports.handler = async (event, context, callback) => {
      console.log('Node version is: ' + process.version);
    
      try {
        const browser = await puppeteer.launch({
            headless: true,
            args: [
                '--disable-gpu',
                '--disable-dev-shm-usage',
                '--disable-setuid-sandbox',
                '--no-first-run',
                '--no-zygote',
                '--no-sandbox'
            ]
        });
    
        let url = 'https://www.serverless-devs.com';
        if (event.queryStringParameters && event.queryStringParameters.url) {
            url = event.queryStringParameters.url;
        }
        if (!url.startsWith('https://') && !url.startsWith('http://')) {
            url = 'http://' + url;
        }
    
        const page = await browser.newPage();
        await page.emulateTimezone('Asia/Shanghai');
        await page.goto(url, { waitUntil: 'networkidle2' });
        await page.setViewport({ width: 1200, height: 800 });
        await autoScroll(page);
    
        let path = '/tmp/example';
        let contentType = 'image/png';
        await page.screenshot({ path: path, fullPage: true, type: 'png' });
    
        await browser.close();
    
        const screenshot = fs.readFileSync(path);
    
        const response = {
            statusCode: 200,
            headers: {
                'Content-Type': contentType
            },
            body: screenshot.toString('base64'),
            isBase64Encoded: true
        };
    
        callback(null, response);
    } catch (err) {
        const errorResponse = {
            statusCode: 500,
            headers: {
                'Content-Type': 'text/plain'
            },
            body: err.message
        };
        callback(null, errorResponse);
      }
    };

    上述範例程式碼解析如下:

    1. 解析query參數擷取需要截圖的URL地址,如果解析失敗則預設使用Serverless Devs官網首頁。

    2. 使用Puppeteer對該網頁進行截圖,並儲存到運行執行個體的/tmp/example檔案夾中,然後將該路徑作為HTTP請求的返回體直接返回。

  3. 為函數配置Puppeteer公用層。

    具體操作,請參見通過控制台配置官方公用層。選擇官方公用層Puppeteer17x。

    image

  4. 建立HTTP觸發器,在觸發器配置資訊列查看公網訪問地址,單擊複製該地址,然後在瀏覽器中使用該測試地址進行測試。

    關於建立HTTP觸發器的詳細操作,請參見建立觸發器

    image

    測試成功後,將Serverless Devs官網進行截圖並自動下載該png檔案到本地。

樣本二:基於公用層快速實現.NET 6自訂運行時

  1. 建立Web函數。

    建立函數頁面,設定以下配置項,其餘配置項保持預設值即可。具體操作,請參見建立Web函數

    image

    建立完成後,您可以在Web IDE介面查看範例程式碼Program.cs。範例程式碼解析如下:program.cs

    • ①:該樣本監聽了0.0.0.0的9000連接埠。自訂運行時啟動的服務一定要監聽0.0.0.0:CAPort*:CAPort連接埠,不能監聽127.0.0.1localhost。更多資訊,請參見自訂運行時基本原理

    • ②:添加路由/,直接返回字串"Hello World!"

    • ③:添加路由/invoke,該路由為使用事件請求處理常式的路徑。更多資訊,請參見Web函數

    • ④:添加路由/initialize,該路由為函數初始化回調程式對應的路徑。該回調程式的方法會在樣本初始化時執行一次。更多資訊,請參見函數執行個體生命週期回調

  2. 測試函數。

    1. 在觸發器配置資訊列查看公網訪問地址,單擊複製該地址,然後在瀏覽器中使用該測試地址進行測試。此時,不添加任何PATH資訊。

      image

      執行成功後,自動下載附件到本地。

    2. 使用Curl工具,在上一步擷取的公網訪問地址後添加/invoke/initialize路徑進行測試。該路由方法為POST,支援直接使用curl -XPOST命令測試。

      執行結果如下所示。

      image