View a markdown version of this page

Ein Node.js Canary-Skript mit der Puppeteer-Laufzeit schreiben - Amazon CloudWatch

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ein Node.js Canary-Skript mit der Puppeteer-Laufzeit schreiben

Einen CloudWatch Synthetics-Kanarienvogel von Grund auf neu erstellen

Hier ist ein Beispiel für die Minimalversion eines Canary-Skripts für Synthetics. Dieses Skript wird als erfolgreiche Ausführung übergeben und gibt eine Zeichenfolge zurück. Um zu sehen, wie ein fehlerhaftes Canary aussieht, ändern Sie let fail = false; zu let fail = true;.

Sie müssen eine Eintrittspunkt-Funktion für das Canary-Skript definieren. Um zu sehen, wie Dateien in den Amazon-S3-Speicherort hochgeladen werden, der als ArtifactS3Location des Canary angegeben ist, erstellen Sie diese Dateien unter dem Ordner /tmp. Alle Canary-Artefakte sollten in /tmp gespeichert werden, da es das einzige beschreibbare Verzeichnis ist. Vergewissern Sie sich, dass der Screenshot-Pfad auf /tmp für alle Screenshots oder andere Dateien, die mit dem Skript erstellt wurden, festgelegt ist. Synthetics lädt Dateien in /tmp automatisch in einen S3-Bucket hoch.

/tmp/<name>

Nach der Ausführung des Skripts werden der pass/fail Status und die Dauer in einem S3-Bucket veröffentlicht CloudWatch und die darunter liegenden Dateien /tmp werden in einen S3-Bucket hochgeladen.

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

Als Nächstes erweitern wir das Skript, um die Synthetics-Protokollierung zu verwenden und mithilfe des AWS SDK einen Anruf zu tätigen. Zu Demonstrationszwecken erstellt dieses Skript einen Amazon-DynamoDB-Client und ruft die DynamoDB-listTables-API auf. Es protokolliert die Antwort auf die Anforderung und protokolliert entweder „pass“ (erfolgreich) oder „fail“ (nicht erfolgreich), je nachdem, ob die Anforderung erfolgreich war.

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

Verpacken Sie Ihre Node.js kanarischen Dateien

Für syn-nodejs-puppeteer-11.0 und höher

Die ältere Bündelstruktur (für syn-nodejs-puppeteer-10.0 und niedriger) wird in neueren Versionen immer noch unterstützt.

Erstellen Sie ein Skript mit einer der folgenden Optionen:

  • .js-Datei (CommonJS-Syntax)

  • .mjs-Datei (Syntax der ES-Module)

Verwenden Sie für ES-Module eine der folgenden Optionen:

  • .js-Datei (CommonJS-Syntax)

  • .mjs-Datei (Syntax der ES-Module)

Die Paketstruktur ist unten definiert:

  • Root-level Handler-Datei (Index). js/index.mjs)

  • Optionale Konfigurationsdatei (synthetics.json)

  • Zusätzliche Abhängigkeiten in node_modules (falls erforderlich)

Beispiel für eine Paketstruktur:

my_function/ ├── index.mjs ├── synthetics.json ├── helper-utils.mjs └── node_modules/ └── dependencies

Führen Sie zum Bündeln die folgenden Schritte aus:

  1. Installieren Sie Abhängigkeiten (falls vorhanden).

    npm install
  2. Erstellen Sie ein .zip-Paket.

    zip -r my_deployment_package.zip

Für syn-nodejs-puppeteer-11.0 und niedriger

Für die Nutzung von Amazon S3 ist die folgende Struktur erforderlich:

nodejs/ └── node_modules/ └── myCanaryFilename.js

So fügen Sie eine optionale Unterordner-Unterstützung in syn-nodejs-puppeteer-3.4+ hinzu:

nodejs/ └── node_modules/ └── myFolder/ └── myCanaryFilename.js
Anmerkung

Der Handler-Pfad in der Konfiguration muss mit dem Dateispeicherort übereinstimmen.

Handlername

Stellen Sie sicher, dass der Script-Einstiegspunkt (Handler) Ihres Canary-Skripts so eingestellt ist myCanaryFilename.functionName, dass er dem Dateinamen des Einstiegspunkts Ihres Skripts entspricht. Wenn Sie eine Laufzeit vor syn-nodejs-puppeteer-3.4 verwenden, muss functionName handler sein. Wenn Sie syn-nodejs-puppeteer-3.4 oder neuer verwenden, können Sie einen beliebigen Funktionsnamen als Handler auswählen. Wenn Sie syn-nodejs-puppeteer-3.4 oder neuer verwenden, können Sie den Canary auch in einem separaten Ordner (z. B. nodejs/node_modules/myFolder/my_canary_filename) ablegen. Wenn Sie ihn in einem separaten Ordner speichern, geben Sie den entsprechenden Pfad in Ihrem Skript-Eintrittspunkt an (z. B. myFolder/my_canary_filename.functionName).

Ändern eines vorhandenen Puppeteer-Skripts zur Verwendung als Synthetics-Canary

In diesem Abschnitt wird erläutert, wie Puppeteer-Skripte so geändert werden, dass sie als Synthetics-Canary-Skripte ausgeführt werden können. Weitere Informationen zu Puppeteer finden Sie unter Puppeteer API v1.14.0.

Wir beginnen mit diesem Puppeteer-Beispielskript:

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

Für die Konvertierung sind die folgenden Schritte durchzuführen:

  • Erstellen und exportieren Sie eine handler-Funktion. Der Handler ist die Eintrittsfunktion für das Skript. Wenn Sie eine Laufzeit vor syn-nodejs-puppeteer-3.4 verwenden, muss die Handler-Funktion den Namen handler haben. Wenn Sie syn-nodejs-puppeteer-3.4 oder neuer verwenden, kann die Funktion einen beliebigen Namen haben. Dieser Name muss jedoch mit dem Namen im Skript übereinstimmen. Wenn Sie syn-nodejs-puppeteer-3.4 oder neuer verwenden, können Sie Ihre Skripte außerdem in einem beliebigen Ordner ablegen und diesen Ordner als Teil des Handlernamens angeben.

    const basicPuppeteerExample = async function () {}; exports.handler = async () => { return await basicPuppeteerExample(); };
  • Verwenden Sie die Synthetics-Abhängigkeit.

    var synthetics = require('@aws/synthetics-puppeteer');
  • Verwenden Sie die Synthetics.getPage-Funktion, um ein Puppeteer-Page-Objekt zu erhalten.

    const page = await synthetics.getPage();

    Das von der Synthetics.getPage Funktion zurückgegebene Seitenobjekt hat den Wert page.on response und requestfailed Ereignisserequest, die für die Protokollierung instrumentiert sind. Synthetics richtet auch die Generierung von HAR-Dateien für Anforderungen und Antworten auf der Seite ein und fügt den Benutzeragenten-Headern der ausgehenden Anforderungen auf der Seite den Canary-ARN hinzu.

Das Skript kann nun als Synthetics-Canary ausgeführt werden. Nachfolgend finden Sie das aktualisierte Skript:

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