View a markdown version of this page

Gravar um script de canário Node.js usando o runtime do Puppeteer - Amazon CloudWatch

Gravar um script de canário Node.js usando o runtime do Puppeteer

Criar um canário do CloudWatch Synthetics do zero

Veja a seguir um exemplo de script do canário mínimo do Synthetics. Esse script é executado com êxito e retorna uma string. Para ver como é um canário com falha, altere let fail = false; para let fail = true;.

É necessário definir uma função de ponto de entrada para o script do canário. Para ver como os arquivos são carregados no local do Amazon S3 especificado como o ArtifactS3Location do canário, crie esses arquivos na pasta /tmp. Todos os artefatos do canário devem ser armazenados em /tmp, pois é o único diretório gravável. Certifique-se de que o caminho da captura de tela esteja definido como /tmp para todas as capturas de tela ou outros arquivos criados pelo script. O Synthetics faz upload automático dos arquivos em /tmp para um bucket do S3.

/tmp/<name>

Após a execução do script, o status de sucesso/falha e as métricas de duração são publicados no CloudWatch, e os arquivos em /tmp são carregados em um bucket do 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(); };

Depois, expanda o script para usar o registro em log do Synthetics e fazer uma chamada usando o AWS SDK. Para fins de demonstração, esse script criará um cliente do Amazon DynamoDB e fará uma chamada para a API listTables do DynamoDB. Ele registra a resposta à solicitação e os logs são aprovados ou falham dependendo se a solicitação foi bem-sucedida.

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

Empacotamento dos arquivos do canário para Node.js

Para syn-nodejs-puppeteer-11.0 e superior

A estrutura de empacotamento mais antiga (para syn-nodejs-puppeteer-10.0 e versões anteriores) ainda tem suporte em versões mais recentes.

Crie um script usando uma das seguintes opções:

  • arquivo .js (sintaxe CommonJS)

  • arquivo. mjs (sintaxe dos módulos ES)

Para módulos ES, use uma destas opções:

  • arquivo .js (sintaxe CommonJS)

  • arquivo. mjs (sintaxe dos módulos ES)

A estrutura do pacote é definida abaixo:

  • Arquivo manipulador de nível raiz (index.js/index.mjs)

  • Arquivo de configuração opcional (synthetics.json)

  • Dependências adicionais em node_modules (se necessário)

Exemplo de estrutura de empacotamento:

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

Para empacotar, siga as etapas abaixo:

  1. Instale dependências (se houver).

    npm install
  2. Crie um pacote .zip.

    zip -r my_deployment_package.zip

Para syn-nodejs-puppeteer-11.0 e inferior

A seguinte estrutura é necessária ao usar o Amazon S3:

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

Para adicionar um suporte opcional para subpastas no syn-nodejs-puppeteer-3.4+:

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

O caminho do manipulador na configuração deve corresponder ao local do arquivo.

Nome do manipulador

Defina o ponto de entrada do script do canário (manipulador) como myCanaryFilename.functionName para corresponder ao nome do arquivo do ponto de entrada do script. Se estiver usando um runtime anterior a syn-nodejs-puppeteer-3.4, então functionNamedeverá ser handler. Se estiver usando syn-nodejs-puppeteer-3.4 ou posterior, você poderá escolher qualquer nome de função como manipulador. Se estiver usando syn-nodejs-puppeteer-3.4 ou posterior, você também poderá armazenar o canário em uma pasta separada, como nodejs/node_modules/myFolder/my_canary_filename. Se você armazenar em uma pasta separada, especifique esse caminho no ponto de entrada do script, como myFolder/my_canary_filename.functionName.

Alterar um script existente do Puppeteer para ser usado como canário do Synthetics

Esta seção explica como modificar scripts do Puppeteer para executá-los como scripts do canário do Synthetics. Para obter mais informações sobre o Puppeteer, consulte API do Puppeteer v1.14.0.

Comece com este exemplo de script do 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(); })();

As etapas de conversão são as seguintes:

  • Crie e exporte uma função handler. O manipulador é a função de ponto de entrada para o script. Se estiver usando um runtime anterior a syn-nodejs-puppeteer-3.4, a função do manipulador deverá ser nomeada handler. Se estiver usando syn-nodejs-puppeteer-3.4 ou posterior, a função poderá ter qualquer nome, mas deverá ser o mesmo nome usado no script. Além disso, se você estiver usando syn-nodejs-puppeteer-3.4 ou posterior, poderá armazenar scripts em qualquer pasta e especificar essa pasta como parte do nome do manipulador.

    const basicPuppeteerExample = async function () {}; exports.handler = async () => { return await basicPuppeteerExample(); };
  • Use a dependência Synthetics.

    var synthetics = require('@aws/synthetics-puppeteer');
  • Use a função Synthetics.getPage para obter um objeto Page do Puppeteer.

    const page = await synthetics.getPage();

    O objeto de página retornado pela função Synthetics.getPage tem os eventos page.on request, response e requestfailed instrumentados para registro em log. O Synthetics também define a geração de arquivos HAR para solicitações e respostas na página e adiciona o ARN do canário aos cabeçalhos do atendente do usuário de solicitações de saída na página.

O script agora está pronto para ser executado como um canário do Synthetics. Veja a seguir o script atualizado:

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