View a markdown version of this page

使用 Puppeteer 執行時期撰寫 Node.js Canary 指令碼 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Puppeteer 執行時期撰寫 Node.js Canary 指令碼

從頭開始建立 CloudWatch Synthetics Canary

下面是基本 Synthetics Canary 指令碼的範例。此指令碼作為成功執行傳遞,並傳回一個字串。若想查看失敗的 Canary 看起來是什麼樣子,請將 let fail = false; 變更為 let fail = true;

您必須定義 Canary 指令碼的進入點函數。若要檢視檔案如何上傳到指定為 Canary ArtifactS3Location 的 Amazon S3 位置,請在 /tmp 資料夾下建立這些檔案。所有 Canary 成品都應儲存在 /tmp 中,因為它是唯一可寫入的目錄。對於指令碼建立的任何螢幕擷取畫面或其他檔案,請確定螢幕擷取畫面路徑設定為 /tmp。Synthetics 會自動將 /tmp 中的檔案上傳至 S3 儲存貯體。

/tmp/<name>

指令碼執行之後,通過/失敗狀態和持續時間指標會發布到 CloudWatch,且 /tmp 下的檔案會上傳到 S3 儲存貯體。

const basicCustomEntryPoint = async function () { // Insert your code here // Perform multi-step pass/fail check // Log decisions made and results to /tmp // Be sure to wait for all your code paths to complete // before returning control back to Synthetics. // In that way, your canary will not finish and report success // before your code has finished executing // Throw to fail, return to succeed let fail = false; if (fail) { throw "Failed basicCanary check."; } return "Successfully completed basicCanary checks."; }; exports.handler = async () => { return await basicCustomEntryPoint(); };

接下來,我們將展開指令碼以使用 Synthetics 記錄,並使用 AWS SDK 進行呼叫。為了示範,此指令碼會建立一個 Amazon DynamoDB 用戶端,並呼叫 DynamoDB listTables API。它會記錄對請求的回應,並根據請求是否成功,記錄通過或是失敗。

const log = require('@aws/synthetics-logger'); const AWS = require('aws-sdk'); // Require any dependencies that your script needs // Bundle additional files and dependencies into a .zip file with folder structure // nodejs/node_modules/additional files and folders const basicCustomEntryPoint = async function () { log.info("Starting DynamoDB:listTables canary."); let dynamodb = new AWS.DynamoDB(); var params = {}; let request = await dynamodb.listTables(params); try { let response = await request.promise(); log.info("listTables response: " + JSON.stringify(response)); } catch (err) { log.error("listTables error: " + JSON.stringify(err), err.stack); throw err; } return "Successfully completed DynamoDB:listTables canary."; }; exports.handler = async () => { return await basicCustomEntryPoint(); };

封裝 Node.js Canary 檔案

對於 syn-nodejs-puppeteer-11.0 及更高版本

較新的版本仍然支援較舊的封裝結構 (適用於 syn-nodejs-puppeteer-10.0 及更高版本)。

使用以下選項之一建立指令碼:

  • .js 檔案 (CommonJS 語法)

  • .mjs 檔案 (ES 模組語法)

對於 ES 模組,請使用下列其中一個選項:

  • .js 檔案 (CommonJS 語法)

  • .mjs 檔案 (ES 模組語法)

套件結構定義如下:

  • 根層級處理常式檔案 (index.js/index.mjs)

  • 選用設定檔 (synthetics.json)

  • node_modules 中的其他相依項 (如有需要)

封裝結構範例:

my_function/ ├── index.mjs ├── synthetics.json ├── helper-utils.mjs └── node_modules/ └── dependencies

若要執行封裝,請依照以下步驟進行:

  1. 安裝相依項 (如果有)。

    npm install
  2. 建立 .zip 套件。

    zip -r my_deployment_package.zip

對於 syn-nodejs-puppeteer-11.0 及更低版本

使用 Amazon S3 時需遵循以下結構:

nodejs/ └── node_modules/ └── myCanaryFilename.js

若要在 syn-nodejs-puppeteer-3.4+ 中新增選用的子資料夾支援:

nodejs/ └── node_modules/ └── myFolder/ └── myCanaryFilename.js
注意

組態中的處理常式路徑必須與您的檔案位置相符。

處理常式名稱

請務必將 Canary 的指令碼進入點 (處理常式) 設定為 myCanaryFilename.functionName,以符合指令碼進入點的檔案名稱。如果您使用的執行時間早於 syn-nodejs-puppeteer-3.4,則 functionName 必須為 handler。如果您使用的是 syn-nodejs-puppeteer-3.4 或更高版本,您可以選擇任何函數名稱作為處理常式。如果您使用的是 syn-nodejs-puppeteer-3.4 或更高版本,您還可以選擇將 Canary 存放在單獨的資料夾 (例如 nodejs/node_modules/myFolder/my_canary_filename) 中。如果將其存放在單獨的資料夾中,請在指令碼進入點中指定該路徑,例如 myFolder/my_canary_filename.functionName

變更現有的 Puppeteer 指令碼以作為 Synthetics Canary 使用

本節介紹如何採用 Puppeteer 指令碼和修改它們以作為 Synthetics Canary 指令碼執行。如需 Puppeteer 的詳細資訊,請參閱 Puppeteer API v1.14.0

我們將從這個 Puppeteer 指令碼範例開始:

const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'example.png'}); await browser.close(); })();

轉換步驟如下:

  • 建立和匯出 handler 函數。處理常式是指令碼的進入點函數。如果您使用的執行時間早於 syn-nodejs-puppeteer-3.4,則處理常式函數必須命名為 handler。如果您使用的是 syn-nodejs-puppeteer-3.4 或更高版本,函數可以具有任何名稱,但其必須與指令碼中使用的名稱相同。另外,如果您使用的是 syn-nodejs-puppeteer-3.4 或更高版本,您可以將指令碼存放在任何資料夾下,並將該資料夾指定為處理常式名稱的一部分。

    const basicPuppeteerExample = async function () {}; exports.handler = async () => { return await basicPuppeteerExample(); };
  • 使用 Synthetics 相依性。

    var synthetics = require('@aws/synthetics-puppeteer');
  • 使用 Synthetics.getPage 函數來取得 Puppeteer Page 物件。

    const page = await synthetics.getPage();

    Synthetics.getPage 函數傳回的頁面物件具有 page.on requestresponse和用於記錄 requestfailed的事件。Synthetics 也會針對頁面上的請求和回應設定 HAR 檔案產生,並將 Canary ARN 新增至頁面上傳出請求的 user-agent 標頭。

指令碼現在已準備好作為 Synthetics Canary 執行。這是更新後的指令碼:

var synthetics = require('@aws/synthetics-puppeteer'); // Synthetics dependency const basicPuppeteerExample = async function () { const page = await synthetics.getPage(); // Get instrumented page from Synthetics await page.goto('https://example.com'); await page.screenshot({path: '/tmp/example.png'}); // Write screenshot to /tmp folder }; exports.handler = async () => { // Exported handler function return await basicPuppeteerExample(); };