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

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

使用 Playwright 執行時間撰寫 Node.js Canary 指令碼

針對 Playwright 執行時間封裝 Node.js Canary 檔案

Canary 指令碼包含 .js(CommonJS 語法) 或 .mjs(ES 語法) 檔案,其中包含您的 Synthetics 處理常式程式碼,以及程式碼所依賴的任何其他套件和模組。以 ES (ECMAScript) 格式建立的指令碼應使用 .mjs 作為副檔名,或包含具有「類型」:「模組」欄位集的 package.json 檔案。與其他執行時間不同,例如 Node.js Puppeteer,您不需要將指令碼儲存在特定的資料夾結構中。您可以直接封裝指令碼。使用您偏好的zip公用程式,在根目錄建立包含處理常式.zip檔案的檔案。如果您的 Canary 指令碼取決於 Synthetics 執行時間中未包含的其他套件或模組,您可以將這些相依性新增至 .zip 檔案。若要這麼做,您可以執行 npm install命令,在 node_modules目錄中安裝函數所需的程式庫。下列範例 CLI 命令會建立名為 .zip的檔案,my_deployment_package.zip其中包含 index.jsindex.mjs 檔案 (Synthetics 處理常式) 及其相依性。在此範例中,您會使用npm套件管理員安裝相依性。

~/my_function ├── index.mjs ├── synthetics.json ├── myhelper-util.mjs └── node_modules ├── mydependency

在根目錄建立包含專案資料夾內容.zip的檔案。使用 r(遞迴) 選項,如下列範例所示,以確保 zip壓縮子資料夾。

zip -r my_deployment_package.zip .

新增 Synthetics 組態檔案來設定 CloudWatch Synthetics 的行為。您可以建立synthetics.json檔案,並將其儲存在與進入點或處理常式檔案相同的路徑。

或者,您也可以將進入點檔案存放在您選擇的資料夾結構中。不過,請確定已在處理常式名稱中指定資料夾路徑。

處理常式名稱

請務必將 Canary 的指令碼進入點 (處理常式) 設定為 myCanaryFilename.functionName,以符合指令碼進入點的檔案名稱。您可以選擇將 Canary 存放在不同的資料夾中,例如 myFolder/my_canary_filename.mjs。如果將其存放在單獨的資料夾中,請在指令碼進入點中指定該路徑,例如 myFolder/my_canary_filename.functionName

將現有的 Playwright 指令碼變更為用作 CloudWatch Synthetics Canary

您可以編輯 Node.js 和 Playwright 的現有指令碼,以用作 Canary。如需 Playwright 的詳細資訊,請參閱 Playwright 程式庫文件。

您可以使用下列儲存在檔案 中的 Playwright 指令碼exampleCanary.mjs

import { chromium } from 'playwright'; import { expect } from '@playwright/test'; const browser = await chromium.launch(); const page = await browser.newPage(); await page.goto('https://example.com', {timeout: 30000}); await page.screenshot({path: 'example-home.png'}); const title = await page.title(); expect(title).toEqual("Example Domain"); await browser.close();

執行下列步驟來轉換指令碼:

  1. 建立和匯出 handler 函數。處理常式是指令碼的進入點函數。您可以為處理常式函數選擇任何名稱,但指令碼中使用的函數應與 Canary 處理常式中的函數相同。如果您的指令碼名稱為 exampleCanary.mjs,且處理常式函數名稱為 myhandler,則您的 Canary 處理常式會命名為 exampleCanary.myhandler。在下列範例中,處理常式函數名稱為 handler

    exports.handler = async () => { // Your script here };
  2. 將 匯入Synthetics Playwright module為相依性。

    import { synthetics } from '@amzn/synthetics-playwright';
  3. 使用 Synthetics Launch函數啟動瀏覽器。

    const browser = await synthetics.launch();
  4. 使用 Synthetics newPage函數建立新的 Playwright 頁面。

    const page = await synthetics.newPage();

您的指令碼現在已準備好以 Synthetics Canary 執行。以下是更新的指令碼:

以 ES6 格式更新指令碼

.mjs副檔名儲存的指令碼檔案。

import { synthetics } from '@amzn/synthetics-playwright'; import { expect } from '@playwright/test'; export const handler = async (event, context) => { try { // Launch a browser const browser = await synthetics.launch(); // Create a new page const page = await synthetics.newPage(browser); // Navigate to a website await page.goto('https://www.example.com', {timeout: 30000}); // Take screenshot await page.screenshot({ path: '/tmp/example.png' }); // Verify the page title const title = await page.title(); expect(title).toEqual("Example Domain"); } finally { // Ensure browser is closed await synthetics.close(); } };

更新 CommonJS 格式的指令碼

.js副檔名儲存的指令碼檔案。

const { synthetics } = require('@amzn/synthetics-playwright'); const { expect } = require('@playwright/test'); exports.handler = async (event) => { try { const browser = await synthetics.launch(); const page = await synthetics.newPage(browser); await page.goto('https://www.example.com', {timeout: 30000}); await page.screenshot({ path: '/tmp/example.png' }); const title = await page.title(); expect(title).toEqual("Example Domain"); } finally { await synthetics.close(); } };

CloudWatch Synthetics 組態

您可以提供名為 的選用 JSON 組態檔案,來設定 Synthetics Playwright 執行時間的行為synthetics.json。此檔案應與處理常式檔案封裝在相同的位置。雖然組態檔案是選用的,但如果您未提供組態檔案,或組態金鑰遺失,CloudWatch 會假設預設值。

封裝您的組態檔案

以下是支援的組態值及其預設值。

{ "step": { "screenshotOnStepStart": false, "screenshotOnStepSuccess": false, "screenshotOnStepFailure": false, "stepSuccessMetric": true, "stepDurationMetric": true, "continueOnStepFailure": true, "stepsReport": true }, "report": { "includeRequestHeaders": true, "includeResponseHeaders": true, "includeUrlPassword": false, "includeRequestBody": true, "includeResponseBody": true, "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these url parameters are redacted from logs and reports }, "logging": { "logRequest": false, "logResponse": false, "logResponseBody": false, "logRequestBody": false, "logRequestHeaders": false, "logResponseHeaders": false }, "httpMetrics": { "metric_2xx": true, "metric_4xx": true, "metric_5xx": true, "failedRequestsMetric": true, "aggregatedFailedRequestsMetric": true, "aggregated2xxMetric": true, "aggregated4xxMetric": true, "aggregated5xxMetric": true }, "canaryMetrics": { "failedCanaryMetric": true, "aggregatedFailedCanaryMetric": true }, "userAgent": "", "har": true }

步驟組態

  • screenshotOnStepStart – 決定 Synthetics 是否應在步驟開始之前擷取螢幕擷取畫面。預設值為 true

  • screenshotOnStepSuccess – 決定 Synthetics 是否應在步驟成功後擷取螢幕擷取畫面。預設值為 true

  • screenshotOnStepFailure – 判斷 Synthetics 是否應在步驟失敗後擷取螢幕擷取畫面。預設值為 true

  • continueOnStepFailure – 判斷指令碼是否應該在步驟失敗後繼續。預設值為 false

  • stepSuccessMetric – 判斷是否發出步驟的SuccessPercent指標。如果步驟成功,且0如果步驟失敗,則步驟的SuccessPercent指標100適用於 Canary 執行。預設值為 true

  • stepDurationMetric – 判斷是否發出步驟的Duration指標。Duration 指標會以步驟執行的持續時間,以毫秒為單位發出。預設值為 true

報告組態

包括 CloudWatch Synthetics 產生的所有報告,例如 HAR 檔案和 Synthetics 步驟報告。敏感資料修訂欄位 restrictedHeadersrestrictedUrlParameters也適用於 Synthetics 產生的日誌。

  • includeRequestHeaders – 是否要在報告中包含請求標頭。預設值為 false

  • includeResponseHeaders – 是否要在報告中包含回應標頭。預設值為 false

  • includeUrlPassword – 是否包含顯示在 URL 中的密碼。根據預設,URLs中出現的密碼會從日誌和報告中修訂,以防止洩露敏感資料。預設值為 false

  • includeRequestBody – 是否要在報告中包含請求內文。預設值為 false

  • includeResponseBody – 是否要在報告中包含回應內文。預設值為 false

  • restrictedHeaders – 如果包含標頭,則要忽略的標頭值清單。這適用於請求和回應標頭。例如,您可以透過將 傳遞includeRequestHeaders為 true 和 restrictedHeaders來隱藏您的登入資料['Authorization']

  • restrictedUrlParameters – 要修訂的 URL 路徑或查詢參數清單。這適用於出現在日誌、報告和錯誤的 URLs。參數區分大小寫。您可以傳遞星號 (*) 做為值,以修訂所有 URL 路徑和查詢參數值。預設為空陣列。

  • har – 判斷是否應產生 HTTP 封存 (HAR)。預設值為 true

以下是報告組態檔案的範例。

"includeRequestHeaders": true, "includeResponseHeaders": true, "includeUrlPassword": false, "includeRequestBody": true, "includeResponseBody": true, "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these URL parameters are redacted from logs and reports

記錄組態

適用於 CloudWatch Synthetics 產生的日誌。控制請求和回應日誌的詳細資訊。

  • logRequest – 是否要在 Canary 日誌中記錄每個請求。對於 UI Canary,這會記錄瀏覽器傳送的每個請求。預設值為 false

  • logResponse – 是否要在 Canary 日誌中記錄每個回應。對於 UI Canary,這會記錄瀏覽器收到的每個回應。預設值為 false

  • logRequestBody – 是否在 Canary 日誌中記錄請求內文與請求。此組態只有在 logRequest 為 true 時才適用。預設值為 false

  • logResponseBody – 是否要在 Canary 日誌中記錄回應內文與請求。此組態只有在 logResponse 為 true 時才適用。預設值為 false

  • logRequestHeaders – 是否在 Canary 日誌中記錄請求標頭和請求。此組態只有在 logRequest 為 true 時才適用。預設值為 false

  • logResponseHeaders – 是否要在 Canary 日誌中記錄回應標頭和回應。此組態只有在 logResponse 為 true 時才適用。預設值為 false

HTTP 指標組態

CloudWatch Synthetics 針對此 Canary 發出的具有不同 HTTP 狀態碼之網路請求計數相關的指標組態。

  • metric_2xx – 是否要發出此 Canary 2xx 的 指標 (含 CanaryName維度)。預設值為 true

  • metric_4xx – 是否要發出此 Canary 4xx 的 指標 (含 CanaryName維度)。預設值為 true

  • metric_5xx – 是否要發出此 Canary 5xx 的 指標 (含 CanaryName維度)。預設值為 true

  • failedRequestsMetric – 是否要發出此 Canary failedRequests 的 指標 (含 CanaryName維度)。預設值為 true

  • aggregatedFailedRequestsMetric – 是否要發出此 Canary failedRequests 的 指標 (不含 CanaryName維度)。預設值為 true

  • aggregated2xxMetric – 是否要發出此 Canary 2xx 的 指標 (不含 CanaryName維度)。預設值為 true

  • aggregated4xxMetric – 是否要發出此 Canary 4xx 的 指標 (不含 CanaryName維度)。預設值為 true

  • aggregated5xxMetric – 是否要發出此 Canary 5xx 的 指標 (不含 CanaryName維度)。預設值為 true

Canary 指標組態

CloudWatch Synthetics 發出之其他指標的組態。

  • failedCanaryMetric – 是否要發出此 Canary Failed 的 指標 (含 CanaryName維度)。預設值為 true

  • aggregatedFailedCanaryMetric – 是否要發出此 Canary Failed 的 指標 (不含 CanaryName維度)。預設值為 true

其他組態

  • userAgent – 要附加至使用者代理程式的字串。使用者代理程式是包含在請求標頭中的字串,當您使用無頭瀏覽器時, 會將您的瀏覽器識別為您造訪的網站。CloudWatch Synthetics 會自動新增 CloudWatchSynthetics/canary-arn to the user agent。指定的組態會附加到產生的使用者代理程式。要附加的預設使用者代理程式值是空字串 ("")。

CloudWatch Synthetics 環境變數

使用環境變數設定記錄層級和格式。

日誌格式

CloudWatch Synthetics Playwright 執行時間會為每個 Canary 執行建立 CloudWatch 日誌。日誌是以 JSON 格式撰寫,方便查詢。或者,您可以將日誌格式變更為 TEXT

  • Environment variable name – CW_SYNTHETICS_LOG_FORMAT

  • Supported values – JSON、TEXT

  • Default – JSON

日誌層級

雖然啟用Debug模式會增加詳細程度,但對於故障診斷非常有用。

  • Environment variable name – CW_SYNTHETICS_LOG_LEVEL

  • Supported values – 追蹤、偵錯、資訊、警告、錯誤、嚴重

  • Default – INFO