本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 foldersconst 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
若要執行封裝,請依照以下步驟進行:
-
安裝相依項 (如果有)。
npm install -
建立 .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函數來取得 PuppeteerPage物件。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(); };