View a markdown version of this page

使用 Puppeteer 运行时编写 Node.js Canary 脚本 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Puppeteer 运行时编写 Node.js Canary 脚本

从 Scratch 创建 CloudWatch Synthetics 金丝雀

这里是一个极简 Synthetics 金丝雀脚本示例。此脚本将成功通过一次运行,并返回一个字符串。要查看失败的金丝雀示例,请将 let fail = false; 更改为 let fail = true;

您必须为金丝雀脚本定义入口点函数。要查看如何将文件上传到指定作为 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 日志记录并使用 Amazon 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 金丝雀文件打包

对于 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
注意

配置中的处理程序路径必须与文件位置匹配。

处理程序名称

请务必将金丝雀脚本入口点(处理程序)设置为 myCanaryFilename.functionName,以匹配脚本入口点的文件名。如果您使用 syn-nodejs-puppeteer-3.4 之前版本的运行时,则 functionName 必须是 handler。如果您使用 syn-nodejs-puppeteer-3.4 或之后版本,您可以选择任何函数名称作为处理程序。如果您使用 syn-nodejs-puppeteer-3.4 或之后版本,您也可以选择将金丝雀存储在单独的文件夹中,例如 nodejs/node_modules/myFolder/my_canary_filename。如果将其存储在单独的文件夹中,请在脚本入口点中指定该路径,例如 myFolder/my_canary_filename.functionName

更改现有 Puppeteer 脚本以将其用作 Synthetics 金丝雀

本节介绍如何对 Puppeteer 脚本进行修改,以将其作为 Synthetics 金丝雀脚本运行。有关 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 文件生成,并将金丝雀 ARN 添加到页面上的传出请求的 user-agent 标头。

该脚本现已准备好作为 Synthetics 金丝雀运行。更新的脚本如下:

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(); };