adieuadieu / serverless-chrome

🌐 Run headless Chrome/Chromium on AWS Lambda
MIT License
2.86k stars 280 forks source link

Fail to start chromium on AWS with 1.0.0-57.2 #282

Open HanXHX opened 3 years ago

HanXHX commented 3 years ago

Hi,

I can't start chromium on AWS Lambda. It seems, the shipped chromium version is not statically compiled with libnss3.so.

Used code:

const launchChrome = require('@serverless-chrome/lambda');
const request = require('superagent');

module.exports.getChrome = async () => {
    const chrome = await launchChrome({
        flags: ['--no-sandbox', '--headless']
    });

    const response = await request
        .get(`${chrome.url}/json/version`)
        .set('Content-Type', 'application/json');

    const endpoint = response.body.webSocketDebuggerUrl;

    return {
        endpoint,
        instance: chrome,
    };
};

Logs under AWS:

INFO    @serverless-chrome/lambda: Spawning headless shell
INFO    @serverless-chrome/lambda: ChromeLauncher No debugging port found on port 9222, launching a new Chrome.
INFO    @serverless-chrome/lambda: Launcher Chrome running with pid 25 on port 9222.
INFO    @serverless-chrome/lambda: Waiting for Chrome 0
INFO    @serverless-chrome/lambda: Waiting for Chrome 1
...
INFO    @serverless-chrome/lambda: Waiting for Chrome 10
INFO    @serverless-chrome/lambda: Error trying to spawn chrome: Error: connect ECONNREFUSED 127.0.0.1:9222
INFO    @serverless-chrome/lambda: stderr log: /var/task/node_modules/@serverless-chrome/lambda/dist/headless-chromium: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

Environement:

Best,

EM

mikkopori commented 3 years ago

Hello,

while trying to make chromium run on aws I found this: https://aws.amazon.com/blogs/compute/upcoming-changes-to-the-python-sdk-in-aws-lambda/

to solve the above problem. Not fully succesfull yet, but I thought I would post it anyway if it helps anyone.

Br,

Mikko

bdombro commented 3 years ago

Did y'all figure this out?

fprochazka commented 3 years ago

I've solved it by using a custom docker image for lambda :shrug:

ariel-frischer commented 3 years ago

@fprochazka How exactly? Did you use this package?

fprochazka commented 3 years ago

You can find all the required info here: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-image.html

my Dockerfile is derived from the AWS documentation:

ARG BUILD_IMAGE_BASE
FROM ${BUILD_IMAGE_BASE} as builder

RUN set -ex \
 && yarn install --non-interactive --frozen-lockfile --no-progress \
 && yarn run package

FROM docker.cogvio.dev/cogvio/dev/node-js:12-alpine

RUN set -ex \
 && apk --no-cache upgrade \
 && apk add --no-cache --update chromium unzip nss curl

ENV LAMBDA_TASK_ROOT=/var/task
ENV LAMBDA_RUNTIME_DIR=/var/runtime
ENV PATH="${LAMBDA_TASK_ROOT}/node_modules/.bin:${PATH}"

WORKDIR ${LAMBDA_TASK_ROOT}

# override global config to ensure local repository is at predictable path
ENV YARN_CACHE_FOLDER=/var/cache/yarn
RUN mkdir -p $YARN_CACHE_FOLDER

COPY --from=builder /srv/.serverless/pdf.zip ${LAMBDA_TASK_ROOT}
RUN set -ex \
 && unzip -q pdf.zip \
 && rm -f pdf.zip \
 && du -sh ${LAMBDA_TASK_ROOT} \
 && chmod -R 0777 /tmp

ENTRYPOINT ["/usr/local/bin/npx", "/var/task/node_modules/aws-lambda-ric/bin/index.js"]
CMD [ "src/handlers/pdf.default" ]

The builder step just builds the nodejs app, nothing special there. And as you can see, I'm then installing chromium directly from alpine repositories, as I was able to test locally, that it works in headless correctly.

In the app itself, I'm still using serverless, but I've removed the dependency on this package, as it's not needed anymore and I can just start the chromium in headless directly and can get rid of a bunch of the workarounds for Amazon Linux. But it was a pain in the butt to get it working smoothly, not gonna lie.