View a markdown version of this page

Puppeteer 런타임을 사용하여 Node.js 카나리 스크립트 작성 - Amazon CloudWatch

Puppeteer 런타임을 사용하여 Node.js 카나리 스크립트 작성

Scratch에서 CloudWatch Synthetics canary 생성

다음은 최소 Synthetics canary 스크립트 예입니다. 이 스크립트는 성공적인 실행으로 전달되고 문자열을 반환합니다. 실패한 canary가 어떻게 보이는지 확인하려면 let fail = false;let fail = true;로 변경합니다.

canary 스크립트의 진입점 함수를 정의해야 합니다. 파일이 카나리의 ArtifactS3Location으로 지정된 Amazon S3 위치에 어떻게 업로드되는지 보려면 /tmp 폴더 아래에 이러한 파일을 생성합니다. 모든 카나리 아티팩트는 유일하게 쓰기 가능한 디렉터리인 /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 로깅을 사용하도록 스크립트를 확장하고 AWS 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 canary 파일 패키징

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 이전 버전의 런타임을 사용하는 경우 functionNamehandler여야 합니다. syn-nodejs-puppeteer-3.4 이상을 사용 중인 경우 함수 이름을 핸들러로 선택할 수 있습니다. syn-nodejs-puppeteer-3.4 이상을 사용 중인 경우 canary를 별도의 폴더에 저장할 수도 있습니다(예: nodejs/node_modules/myFolder/my_canary_filename). 별도의 폴더에 저장하는 경우 스크립트 진입점에 해당 경로를 지정합니다(예: myFolder/my_canary_filename.functionName).

기존 Puppeteer 스크립트를 변경하여 Synthetics canary로 사용

이 섹션에서는 Puppeteer 스크립트를 가져와서 Synthetics canary 스크립트로 실행하도록 수정하는 방법에 대해 설명합니다. 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 request, response requestfailed 이벤트가 있습니다. 또한 Synthetics에서는 페이지의 요청 및 응답에 대한 HAR 파일 생성을 설정하고 canary ARN을 페이지의 발신 요청의 사용자 에이전트 헤더에 추가합니다.

이제 스크립트를 Synthetics canary로 실행할 준비가 되었습니다. 다음은 업데이트된 스크립트입니다.

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