Search code examples
node.jsamazon-web-servicesaws-lambdahighchartsphantomjs

Need help setting up a Highcharts Export Server through an aws lambda


I'm trying to create a lambda that hosts an Highcharts server to be called as a service. I've followed some guides that have attempted this in the past but none seem to work anymore. So I've started working the problem my self.

I built a docker container to run the lambda through and have attempted to get it to parse json chart but phantomjs keeps throwing an error.

UPDATE--- I discovered that I needed to force the export server to use a downgraded version of highcharts. The below code has been edited to include this and should work.

What I have: Docker file -

FROM public.ecr.aws/lambda/nodejs:18

COPY exports.js package.json  ${LAMBDA_TASK_ROOT}/

ENV ACCEPT_HIGHCHARTS_LICENSE YES
ENV HIGHCHARTS_VERSION 9.2.2  #added the highcharts version
ENV PHANTOMJS_PLATFORM "linux"  #missed a P here
ENV PHANTOMJS_ARCH "x64"
RUN yum install -y tar bzip2
RUN yum install -y vim-minimal

# Install NPM dependencies for function
RUN npm install

CMD [ "exports.handler" ]

package.json-

{
    "name": "highchart_export_server",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "dependencies": {
      "highcharts-export-server": "^2.1.0"
    },
    "devDependencies": {},
    "author": ""
  }

export.js -

const exporter = require('highcharts-export-server');

exports.handler = async (event) => {

    console.log(event);

    const promise = new Promise(function(resolve, reject) {

        // Export settings
        var exportSettings = {
        type: 'png',
        options: event
        };

        // Set up a pool of PhantomJS workers
        exporter.initPool({maxWorkers: 2});

        // Perform an export
        exporter.export(exportSettings, function (err, res) {
            
            // Kill the pool when we're done with it
            exporter.killPool();

            if (res) {
                resolve(res, 200);
            } else {
                reject(err);
            }

        });
    })

    // Return the results of the image
    return promise;

};

After building and running the container, I call it using a basic chart: curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d {"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}

I receive this error: {"errorType":"string","errorMessage":"an error occured when rendering the chart: SyntaxError: Unexpected token S in JSON at position 0","trace":[]}

The JSON chart seems formatted correctly and error seems to be coming from phantompool.js when parsing workers incoming data

If I get the error to print out what it was trying to parse I get:

SyntaxError: Use of reserved word 'let' in strict mode\n\n  phantomjs://code/worker.js:658 in loop\n{\"data\":\"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shYZ8P1XJsYm/YZUKpv2J48JuIfJz6Pam5yzC8h5dQh5VMNlQ8LWlv+16bddmFr8Q8qCd1bhvpPE0U+YHMcPJ4Pmb2HiBp0XFOvpEr+1Ue4iLMuifmmmfsbWA4rpP2LyRddK1XzHtYRV0nJmQ1Jgdxlou7z6IpPH4gzzcpLJPm5mgiNJku5NVictQy8grQX7kC6qG0grmNr9gzxcc5jHkMHIV5BHGEiSpOXAKuThiteQ5vr6SdzjHNezPDuFxOuvGe/ztSRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRpufT/AcVl+viQN4l3AAAAAElFTkSuQmCC

The data itself appears to be a base64 encoded string as expected but phantomjs is prepending an error?


Solution

  • Upon reviewing your code, I noticed that you are passing the JSON chart data directly as the payload to the Lambda function in the curl command. However, you missed enclosing the JSON data within quotes, resulting in an unexpected token error.

    To fix this issue, modify your curl command to properly enclose the JSON data within quotes:

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}'
    

    Make sure to wrap the entire JSON payload within single quotes.

    Additionally, I noticed a typo in your Dockerfile where you have set the environment variable HANTOMJS_PLATFORM instead of PHANTOMJS_PLATFORM. Correct that line to:

    ENV PHANTOMJS_PLATFORM "linux"
    

    After making these changes, rebuild your Docker container and test the setup again. Hopefully, this should resolve the JSON parsing issue you encountered and allow your Highcharts Export Server to function correctly.