brandonlim-hs/wkhtmltopdf-aws-lambda-layer

libjpeg.so.62: cannot open shared object file

Closed this issue · 5 comments

This is fantastic. Thank you!

I'm running into one issue while replicating what's going on in the tests locally:

index.js

let { execSync } = require('child_process');

exports.handler = async (event, context, callback) => {
  execSync("ldd /opt/bin/wkhtmltopdf", { encoding: "utf8", stdio: "inherit" });
  execSync("wkhtmltopdf -V", { encoding: "utf8", stdio: "inherit" });

  callback(null, {'foo': 'bar'});
};
$ sam build myFunction
...Build Succeeded...
$ sam local invoke -e event.json myFunction
Invoking index.handler (nodejs12.x)
arn:aws:lambda:us-east-1:347599033421:layer:wkhtmltopdf:1 is already cached. Skipping download
Requested to skip pulling images ...

Mounting /Users/stevenspiel/mobile/wkhtmltopdf-lambda/.aws-sam/build/myFunction as /var/task:ro,delegated inside runtime container
START RequestId: c361ad4f-866a-1450-c1dc-6a3e0f8318fe Version: $LATEST
	linux-vdso.so.1 (0x00007fff643f0000)
	libjpeg.so.62 => not found
	libpng15.so.15 => not found
	libXrender.so.1 => not found
	libfontconfig.so.1 => not found
	libfreetype.so.6 => not found
	libXext.so.6 => not found
	libX11.so.6 => not found
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f7dc8912000)
	libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f7dc84bd000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f7dc82a8000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f7dc80a4000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f7dc7e9c000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7dc7c7e000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f7dc78fc000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f7dc75bc000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7dc73a6000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f7dc6ffb000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f7dc8b81000)
	libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f7dc6daf000)
	libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f7dc6acb000)
	libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f7dc68c7000)
	libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f7dc6696000)
	libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f7dc6487000)
	libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f7dc6283000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f7dc606d000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f7dc5e46000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f7dc5be2000)
wkhtmltopdf: error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory
2020-05-08T10:18:33.445Z	c361ad4f-866a-1450-c1dc-6a3e0f8318fe	ERROR	Invoke Error 	{"errorType":"Error","errorMessage":"Command failed: wkhtmltopdf -V","status":127,"signal":null,"output":[null,null,null],"pid":31,"stdout":null,"stderr":null,"stack":["Error: Command failed: wkhtmltopdf -V","    at checkExecSyncError (child_process.js:630:11)","    at execSync (child_process.js:666:15)","    at Runtime.exports.handler (/var/task/index.js:21:3)","    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"]}

It appears to be finding most of the libraries, but a few are missing. Do you know what might be the issue?

Hi @stevenspiel,

I am unable to produce this using the AWS SAM NodeJS template.

Could you try removing the docker images for nodejs12.x from samcli/lambda and lambci/lambda then run sam local invoke -e event.json myFunction again?
Otherwise, are you be able to share a sample project that can reproduce this?

@brandonlim-hs That did it! Thank you!

Ok, so it worked once right after I removed the docker images, but all subsequent attempts have returned the original error.

$ docker rmi $(docker images -a -q)
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
$ sam build myFunction
...Build Succeeded...
$ sam local invoke -e event.json myFunction
Invoking index.handler (nodejs12.x)
arn:aws:lambda:us-east-1:347599033421:layer:wkhtmltopdf:1 is already cached. Skipping download
Image was not found.
Building image...
Requested to skip pulling images ...

Mounting /Users/stevenspiel/mobile/myFunction.aws-sam/build/animalReport as /var/task:ro,delegated inside runtime container
START RequestId: 80d477de-e87b-18ab-ae6b-d6be7a9543f8 Version: $LATEST
	linux-vdso.so.1 (0x00007ffc607f8000)
	libjpeg.so.62 => not found
	libpng15.so.15 => not found
	libXrender.so.1 => not found
	libfontconfig.so.1 => not found
	libfreetype.so.6 => not found
	libXext.so.6 => not found
	libX11.so.6 => not found
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f5a3819f000)
	libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f5a37d4a000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f5a37b35000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f5a37931000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f5a37729000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5a3750b000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f5a37189000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f5a36e49000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5a36c33000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f5a36888000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5a3840e000)
	libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f5a3663c000)
	libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f5a36358000)
	libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f5a36154000)
	libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f5a35f23000)
	libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f5a35d14000)
	libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f5a35b10000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5a358fa000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5a356d3000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f5a3546f000)
wkhtmltopdf: error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory
2020-05-08T16:33:23.098Z	80d477de-e87b-18ab-ae6b-d6be7a9543f8	ERROR	Invoke Error 	{"errorType":"Error","errorMessage":"Command failed: wkhtmltopdf -V","status":127,"signal":null,"output":[null,null,null],"pid":28,"stdout":null,"stderr":null,"stack":["Error: Command failed: wkhtmltopdf -V","    at checkExecSyncError (child_process.js:630:11)","    at execSync (child_process.js:666:15)","    at Runtime.exports.handler (/var/task/index.js:23:3)","    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"]}
END RequestId: 80d477de-e87b-18ab-ae6b-d6be7a9543f8
REPORT RequestId: 80d477de-e87b-18ab-ae6b-d6be7a9543f8	Init Duration: 1141.15 ms	Duration: 28.33 ms	Billed Duration: 100 ms	Memory Size: 256 MB	Max Memory Used: 57 MB

{"errorType":"Error","errorMessage":"Command failed: wkhtmltopdf -V"}

$ docker images -a
REPOSITORY          TAG                                    IMAGE ID            CREATED             SIZE
samcli/lambda       nodejs12.x-13b47fd036d464fd1322449e9   9a469e9410ff        2 minutes ago       471MB
lambci/lambda       nodejs12.x                             f71293a4a833        38 hours ago        380MB

I'm not sure why lambci/lambda says it was created 38 hours ago, when it was just deleted and recreated. I'm also unsure why it would work once and not again. Any thoughts/ideas would be really appreciated!

Ok, I found the original issue. When dependencies were directly inside the lambda function, I had to use a workaround to include them

process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'] + '/bin';
process.env['LD_LIBRARY_PATH'] = process.env['LAMBDA_TASK_ROOT'] + '/bin';

When that is present, some of the libraries could no longer be found and required deleting the images and starting over. Once I removed those lines, everything was good 👍

Glad that you've got it sorted! 👍