google-chrome-devtoolsaws-lambdachromeless

RESTful Chromless implementation


I am looking for a way to use headless chrome similar to what chromeless does but instead of being implemented as a nodejs endpoint, allowing restful requests with the html content as a payload.

I want to run this service on aws lambda being triggered through API Gateway. Does anyone have experience with this usecase?


Solution

  • There's nothing keeping you from using Chromeless in your use-case. Chromeless can be used within an AWS Lambda function. You can take a (RESTful) request coming from AWS API Gateway and then do something with it and Chromeless. You can combine the @serverless-chrome/lambda package with Chromeless to get headless Chrome running within Lambda so that Chrome is available to Chromeless. The Chromeless Proxy works in a similar way. For example, your Lambda function's code might look like (this is untested code I just cobbled together, but should convey the idea):

    const launchChrome = require('@serverless-chrome/lambda')
    const Chromeless = require('chromeless').Chromeless
    
    module.exports.handler = function handler (event, context, callback) {
      const body = JSON.parse(event.body) // event.body coming from API Gateway
      const url = body.url
      const evaluateJs = body.evaluateJs
    
      launchChrome({
        flags: ['--window-size=1280x1696', '--hide-scrollbars'],
      })
        .then((chrome) => {
          // Chrome is now running on localhost:9222
    
          const chromeless = new Chromeless({
            launchChrome: false,
          })
    
          chromeless
            .goto(url)
            .wait('body')
            .evaluate(() => `
              // this will be executed in headless chrome
              ${evaluateJs}
            `)
            .then((result) => {
              chromeless
                .end()
                .then(chrome.kill) // https://github.com/adieuadieu/serverless-chrome/issues/41#issuecomment-317989508
                .then(() => {
                  callback(null, {
                    statusCode: 200,
                    body: JSON.stringify({ result })
                  })
                })
            })
            .catch(callback)
        })
        .catch((error) => {
          // Chrome didn't launch correctly
          callback(error)
        })
    }
    

    You'll find a similar thread on the Chromeless Issue tracker here.

    Disclosure: I'm a collaborator/author of these packages.