AWS Lambda용 Weasyprint 52.5의 모든 종속성을 구축하려고 합니다. Python 라이브러리임에도 불구하고 Weasyprint는 광범위한 운영 체제 종속성을 가지고 있습니다.
yum에서 필요한 모든 rpm을 다운로드하고 공유 라이브러리를 추출하여 람다 계층을 만들었습니다. 거의 작동하지만 libgio로는 이 오류를 해결할 수 없는 것 같습니다.
운영체제는 Amazon Linux 2인데 패키지 관리에 yum을 사용하는데 CentOS 7과 일치하는 것으로 보입니다.
다음은 yum 호출 명령입니다.
yumdownloader libffi pixman freetype fontconfig libglvnd libglvnd-glx libglvnd-egl mesa-libglapi libpng libxcb libXrender libX11 libXext libXau libXdamage libXfixes libXxf86vm expat libuuid libxshmfence libdrm libwayland-client libwayland-server glib2 fribidi libthai harfbuzz graphite2 gdk-pixbuf2 cairo pango
다음 패키지 버전을 가져옵니다.
cairo-1.15.12-4.amzn2.x86_64
expat-2.1.0-12.amzn2.x86_64
fontconfig-2.13.0-4.3.amzn2.x86_64
freetype-2.8-14.amzn2.1.x86_64
fribidi-1.0.2-1.amzn2.1.x86_64
gdk-pixbuf2-2.36.12-3.amzn2.x86_64
glib2-2.56.1-9.amzn2.0.1.x86_64
graphite2-1.3.10-1.amzn2.0.2.x86_64
harfbuzz-1.7.5-2.amzn2.x86_64
libdrm-2.4.97-2.amzn2.x86_64
libffi-3.0.13-18.amzn2.0.2.x86_64
libglvnd-1.0.1-0.1.git5baa1e5.amzn2.0.1.x86_64
libglvnd-egl-1.0.1-0.1.git5baa1e5.amzn2.0.1.x86_64
libglvnd-glx-1.0.1-0.1.git5baa1e5.amzn2.0.1.x86_64
libpng-1.5.13-8.amzn2.x86_64
libthai-0.1.14-9.amzn2.0.2.x86_64
libuuid-2.30.2-2.amzn2.0.4.x86_64
libwayland-client-1.17.0-1.amzn2.x86_64
libwayland-server-1.17.0-1.amzn2.x86_64
libX11-1.6.7-3.amzn2.0.2.x86_64
libXau-1.0.8-2.1.amzn2.0.2.x86_64
libxcb-1.12-1.amzn2.0.2.x86_64
libXdamage-1.1.4-4.1.amzn2.0.2.x86_64
libXext-1.3.3-3.amzn2.0.2.x86_64
libXfixes-5.0.3-1.amzn2.0.2.x86_64
libXrender-0.9.10-1.amzn2.0.2.x86_64
libxshmfence-1.2-1.amzn2.0.2.x86_64
libXxf86vm-1.1.4-1.amzn2.0.2.x86_64
mesa-libglapi-18.3.4-5.amzn2.0.1.x86_64
pango-1.42.4-4.amzn2.x86_64
pixman-0.34.0-1.amzn2.0.2.x86_64
rpmdev-extract를 실행하여 다음 공유 라이브러리에서 rpm 결과를 추출합니다.
libcairo-script-interpreter.so.2.11512.0
libcairo.so.2.11512.0
libdrm_amdgpu.so.1.0.0
libdrm_intel.so.1.0.0
libdrm_nouveau.so.2.0.0
libdrm_radeon.so.1.0.1
libdrm.so.2.4.0
libEGL.so.1.1.0
libexpat.so.1.6.0
libffi.so.6.0.1
libfontconfig.so.1.11.1
libfreetype.so.6.14.0
libfribidi.so.0.4.0
libgdk_pixbuf-2.0.so.0.3612.0
libgdk_pixbuf_xlib-2.0.so.0.3612.0
libgio-2.0.so.0.5600.1
libglapi.so.0.0.0
libGLdispatch.so.0.0.0
libglib-2.0.so.0.5600.1
libGL.so.1.7.0
libGLX.so.0.0.0
libgmodule-2.0.so.0.5600.1
libgobject-2.0.so.0.5600.1
libgraphite2.so.3.0.1
libgthread-2.0.so.0.5600.1
libharfbuzz.so.0.10705.0
libkms.so.1.0.0
libpango-1.0.so.0.4200.3
libpangocairo-1.0.so.0.4200.3
libpangoft2-1.0.so.0.4200.3
libpangoxft-1.0.so.0.4200.3
libpixman-1.so.0.34.0
libpng15.so.15
libpng15.so.15.13.0
libthai.so.0.1.6
libuuid.so.1.3.0
libwayland-client.so.0.3.0
libwayland-server.so.0.1.0
libX11.so.6.3.0
libX11-xcb.so.1.0.0
libXau.so.6.0.0
libxcb-composite.so.0.0.0
libxcb-damage.so.0.0.0
libxcb-dpms.so.0.0.0
libxcb-dri2.so.0.0.0
libxcb-dri3.so.0.0.0
libxcb-glx.so.0.0.0
libxcb-present.so.0.0.0
libxcb-randr.so.0.1.0
libxcb-record.so.0.0.0
libxcb-render.so.0.0.0
libxcb-res.so.0.0.0
libxcb-screensaver.so.0.0.0
libxcb-shape.so.0.0.0
libxcb-shm.so.0.0.0
libxcb.so.1.1.0
libxcb-sync.so.1.0.0
libxcb-xevie.so.0.0.0
libxcb-xf86dri.so.0.0.0
libxcb-xfixes.so.0.0.0
libxcb-xinerama.so.0.0.0
libxcb-xinput.so.0.1.0
libxcb-xkb.so.1.0.0
libxcb-xselinux.so.0.0.0
libxcb-xtest.so.0.0.0
libxcb-xvmc.so.0.0.0
libxcb-xv.so.0.0.0
libXdamage.so.1.1.0
libXext.so.6.4.0
libXfixes.so.3.1.0
libXrender.so.1.3.0
libxshmfence.so.1.0.0
libXxf86vm.so.1.0.0
Weasyprint를 호출하면 ffi.dlopen("libfontconfig.so.1")
OSError가 발생합니다.
라이브러리 'libfontconfig.so.1'을 로드할 수 없습니다: /opt/lib/libgio-2.0.so.0: 정의되지 않은 기호: g_free
일부 중요한 패키지를 yum에서 사용 가능한 다른 버전으로 다운그레이드하려고 시도했지만 성공하지 못했습니다. 특히 다음을 다운그레이드해 보았습니다.
fontconfig-2.10.95
glib2-2.50.3
cairo-1.14.8
pango-1.40.4
그러나 이로 인해 동일한 오류가 발생합니다.
정의되지 않은 기호 오류의 원인은 무엇입니까? 이 오류를 해결할 수 있는 해결 방법이 있습니까?
고쳐 쓰다
이제 이것이 특히 AWS Lambda와 관련이 있는지 궁금합니다.
Amazon2 Docker 인스턴스에 대한 종속성을 구축하고 있지만 Docker 컨테이너에서 문제를 재현할 수 없습니다. 예를 들어 다음은 Amazon2 EC2 인스턴스에서 실행되는 현재 Dockerfile입니다.
이 Dockerfile은 Weasyprint 52.5의 약간 수정된 버전을 사용하며 여기에 몇 가지 추가 오류 로깅을 추가했습니다. 또한 ffi가 /opt/lib에서 라이브러리를 로드하도록 강제하는 몇 가지 코드도 추가했습니다.
https://github.com/Kozea/WeasyPrint/compare/v52.5...MasonryHQ:temp?expand=1
이 Docker 컨테이너를 빌드할 때 오류가 발생하지 않습니다. 그러나 /opt/lib
디렉터리를 압축하여 Lambda에 레이어로 업로드하면 Weasyprint를 가져오려고 할 때 여전히 Lambda에 오류 메시지가 표시됩니다. 바라보다:
https://sentry.io/share/issue/1d2d824e950346e9bcc368f8abfd01f0/
Weasyprint를 변경했는데도 Docker의 일부 라이브러리가 여전히 /opt/lib에서 로드되지 않습니까? 아니면 Lambda가 Docker 컨테이너와 다르게 동작합니까?