使用 Playwright 运行时编写 Node.js Canary 脚本
主题
将 Node.js Canary 文件打包用于 Playwright 运行时
Canary 脚本包含一个 .js
(CommonJS 语法)或 .mjs
(ES 语法)文件,其中包含您的 Synthetics 处理程序代码,以及代码所依赖的任何其他包和模块。以 ES(ECMAScript)格式创建的脚本应使用 .mjs 作为扩展名,或者包含一个设置了 "type": "module" 字段的 package.json 文件。与 Node.js Puppeteer 等其他运行时不同,您无需将脚本保存在特定的文件夹结构中。您可以直接打包脚本。使用您的首选 zip
实用工具创建一个 .zip
文件,并将处理程序文件置于根目录中。如果您的 Canary 脚本依赖未包含在 Synthetics 运行时中的其他包或模块,您可以将这些依赖项添加到 .zip
文件中。为此,您可以通过运行 npm install
命令将函数所需的库安装到 node_modules
目录中。以下示例 CLI 命令将创建名为 my_deployment_package.zip
的 .zip
文件,其中包含 index.js
或 index.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
文件并将其保存在与入口点或处理程序文件相同的路径下。
或者,您也可以将入口点文件存储在您选择的文件夹结构中。但是,请确保在您的处理程序名称中指定了文件夹路径。
处理程序名称
请务必将您的金丝雀脚本入口点(处理程序)设置为 myCanaryFilename.functionName
,以匹配脚本入口点的文件名。您也可以选择将 Canary 存储在单独的文件夹中,例如 myFolder/my_canary_filename.mjs
。如果将其存储在单独的文件夹中,请在脚本入口点中指定该路径,例如 myFolder/my_canary_filename.functionName
。
更改现有 Playwright 脚本以将其用作 CloudWatch Synthetics Canary
您可以编辑 Node.js 和 Playwright 的现有脚本以用作 Canary。有关 Playwright 的更多信息,请参阅 Playwright 库
您可以使用保存在文件 exampleCanary.mjs
中的以下 Playwright 脚本。
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();
执行以下步骤转换脚本:
-
创建和导出
handler
函数。处理程序是脚本的入口点函数。您可以为处理程序函数选择任何名称,但脚本中使用的函数应与 Canary 处理程序中的函数相同。如果您的脚本名称为exampleCanary.mjs
,处理程序函数名称为myhandler
,则您的 Canary 处理程序命名为exampleCanary.myhandler
。在以下示例中,处理程序函数的名称为handler
。exports.handler = async () => { // Your script here };
-
将
Synthetics Playwright module
作为依赖项导入。import { synthetics } from '@amzn/synthetics-playwright';
-
使用 Synthetics
Launch
函数启动浏览器。const browser = await synthetics.launch();
-
使用 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 配置
您可以通过提供一个名为 synthetics.json
的可选 JSON 配置文件来配置 Synthetics Playwright 运行时的行为。此文件应与处理程序文件打包在相同的位置。尽管配置文件是可选的,但如果您未提供配置文件或缺少配置密钥,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
指标。对于 Canary 运行,如果步骤成功,步骤的SuccessPercent
指标为100
,如果步骤失败,则为0
。默认值为true
。 -
stepDurationMetric
– 确定是否发出步骤的Duration
指标。Duration
指标以步骤运行的持续时间(以毫秒为单位)发出。默认值为true
。
报告配置
包括 CloudWatch Synthetics 生成的所有报告,例如 HAR 文件和 Synthetics 步骤报告。敏感数据编辑字段 restrictedHeaders
和 restrictedUrlParameters
也适用于 Synthetics 生成的日志。
-
includeRequestHeaders
– 是否在报告中包含请求标头。默认值为false
。 -
includeResponseHeaders
– 是否在报告中包含响应标头。默认值为false
。 -
includeUrlPassword
– 是否包含 URL 中显示的密码。默认情况下,URL 中显示的密码会在日志和报告中进行编辑,以防泄露敏感数据。默认值为false
。 -
includeRequestBody
– 是否在报告中包含请求正文。默认值为false
。 -
includeResponseBody
– 是否在报告中包含响应正文。默认值为false
。 -
restrictedHeaders
– 要忽略的标头值列表(如果包含标头)。这对请求标头和响应标头均适用。例如,您可以通过将includeRequestHeaders
传递为 true 并将restrictedHeaders
传递为['Authorization']
来隐藏您的凭证。 -
restrictedUrlParameters
– 要编辑的 URL 路径或查询参数的列表。这适用于出现在日志、报告和错误中的 URL。此参数区分大小写。您可以传递星号 (*
) 作为值来编辑所有 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 金丝雀,这会记录浏览器发送的每个请求。默认值为false
。 -
logResponse
– 是否将每个响应都记录在 Canary 日志中。对于 UI 金丝雀,这会记录浏览器收到的每个响应。默认值为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
– TRACE、DEBUG、INFO、WARN、ERROR、FATAL -
Default
– INFO