Escritura de un script de canario de Node.js mediante el tiempo de ejecución de Puppeteer
Temas
Creación de un valor controlado de CloudWatch Synthetics desde cero
Aquí hay un ejemplo de script mínimo de valor controlado de Synthetics. Este script pasa como una ejecución correcta y devuelve una cadena. Para ver el aspecto de un valor controlado erróneo, cambie let
fail = false; a let fail = true;.
Debe definir una función de punto de entrada para el script de valor controlado. Para ver cómo se cargan los archivos en la ubicación de Amazon S3 especificada como ArtifactS3Location del canario, cree estos archivos en la carpeta /tmp. Todos los artefactos de canarios deben almacenarse en el directorio /tmp, ya que es el único en el que se puede escribir. Asegúrese de que la ruta de la captura de pantalla esté establecida en /tmp para todas las capturas de pantalla u otros archivos creados por el script. Synthetics carga los archivos automáticamente de
/tmp en un bucket de S3.
/tmp/<name>
Después de que el script se ejecuta, el estado superado o no superado y las métricas de duración se ejecutan en CloudWatch y los archivos bajo /tmp se cargan en un bucket de 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(); };
A continuación, expandimos el script para usar el registro de Synthetics y realizar una llamada usando AWS SDK. A modo de demostración, este script creará un cliente de Amazon DynamoDB y realizará una llamada a las listTables DynamoDB de la API. Registra la respuesta a la solicitud y los registros se superan o no en función de si la solicitud se realizó correctamente.
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(); };
Empaquetado de los archivos de valores controlados de Node.js
Para syn-nodejs-puppeteer-11.0 y versiones posteriores
La estructura de empaquetado anterior (para syn-nodejs-puppeteer-10.0 y versiones anteriores) sigue siendo compatible con las versiones más recientes.
Cree un script utilizando una de las siguientes opciones:
-
Archivo .js (sintaxis de CommonJS)
-
Archivo .mjs (sintaxis de los módulos de ES)
Para los módulos de ES, utilice una de las siguientes opciones:
-
Archivo .js (sintaxis de CommonJS)
-
Archivo .mjs (sintaxis de los módulos de ES)
La estructura de los paquetes se define a continuación:
-
Archivo de controlador a nivel raíz (index.js/index.mjs)
-
Archivo de configuración opcional (synthetics.json)
-
Dependencias adicionales en node_modules (de ser necesarias)
Ejemplo de estructura de empaquetado:
my_function/ ├── index.mjs ├── synthetics.json ├── helper-utils.mjs └── node_modules/ └── dependencies
Para empaquetar, siga los pasos que se indican a continuación:
-
Instale las dependencias (si las hay).
npm install -
Cree un paquete .zip.
zip -r my_deployment_package.zip
Para syn-nodejs-puppeteer-11.0 y versiones anteriores
Cuando se usa Amazon S3, se requiere la siguiente estructura:
nodejs/ └── node_modules/ └── myCanaryFilename.js
Para añadir compatibilidad opcional para subcarpetas en syn-nodejs-puppeteer-3.4+:
nodejs/ └── node_modules/ └── myFolder/ └── myCanaryFilename.js
nota
La ruta del controlador en la configuración debe coincidir con la ubicación del archivo.
Nombre del controlador
Asegúrese de establecer el punto de entrada del script (controlador) del canario como
myCanaryFilename.functionName para que coincida con el nombre del archivo del punto de entrada del script. Si utiliza un tiempo de ejecución anterior a syn-nodejs-puppeteer-3.4, el functionName debe ser handler. Si utiliza
syn-nodejs-puppeteer-3.4 o uno posterior, puede elegir cualquier nombre de función como el controlador. Si utiliza syn-nodejs-puppeteer-3.4 o uno posterior, también puede almacenar el valor controlado en una carpeta independiente, como
nodejs/node_modules/myFolder/my_canary_filename. Si lo almacena en una carpeta independiente, especifique esa ruta en el punto de entrada del script, como
myFolder/my_canary_filename.functionName.
Cambio de un script de Puppeteer existente para usarlo como valor controlado de Synthetics
En esta sección se explica cómo tomar scripts de Puppeteer y modificarlos para que se ejecuten como scripts de valor controlado de Synthetics. Para obtener más información acerca de Puppeteer, consulte Puppeteer API v1.14.0
Comencemos con este ejemplo de script de 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(); })();
Los pasos de conversión son los siguientes:
-
Crear y exportar una función de
handler. El controlador es la función de punto de entrada para el script. Si utiliza un tiempo de ejecución anterior asyn-nodejs-puppeteer-3.4, la función del controlador debe denominarsehandler. Si utilizasyn-nodejs-puppeteer-3.4o uno posterior, la función puede tener cualquier nombre, pero debe ser el mismo nombre que se usa en el script. Además, si utilizasyn-nodejs-puppeteer-3.4o uno posterior, puede almacenar los scripts en cualquier carpeta y especificar dicha carpeta como parte del nombre del controlador.const basicPuppeteerExample = async function () {}; exports.handler = async () => { return await basicPuppeteerExample(); }; -
Use la dependencia de
Synthetics.var synthetics = require('@aws/synthetics-puppeteer'); -
Utilice la función de
Synthetics.getPagepara obtener un objetoPagede Puppeteer.const page = await synthetics.getPage();El objeto de página devuelto por la función Synthetics.getPage tiene instrumentados para el registro los eventos
request,responseyrequestfailedde page.on. Synthetics también configura la generación de archivos HAR para las solicitudes y respuestas en la página y agrega el ARN del valor controlado a los encabezados del agente de usuario de las solicitudes salientes en la página.
El script ya está listo para ser ejecutado como un valor controlado de Synthetics. Aquí está el script actualizado:
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(); };