Gravar um script de canário Node.js usando o runtime do Puppeteer
Tópicos
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 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(); };
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:
-
Instale dependências (se houver).
npm install -
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 asyn-nodejs-puppeteer-3.4, a função do manipulador deverá ser nomeadahandler. Se estiver usandosyn-nodejs-puppeteer-3.4ou posterior, a função poderá ter qualquer nome, mas deverá ser o mesmo nome usado no script. Além disso, se você estiver usandosyn-nodejs-puppeteer-3.4ou 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.getPagepara obter um objetoPagedo Puppeteer.const page = await synthetics.getPage();O objeto de página retornado pela função Synthetics.getPage tem os eventos page.on
request,responseerequestfailedinstrumentados 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(); };