はじめに

どうも!バックエンドのしゅがーです。

2024年10月にpython3.8のサポート期限が迫るため、その前にUniforceでもと期限前に3.12に更新しました。

最初はhttps://github.com/keithrozario/Klayersを使用していた部分があり、このまま使用出来る3.10へも検討していました。しかし、Klayersを参考にAWS Lambda Layersのビルドシステムを内製化した話にあるように内製化したことで3.10にこだわる理由はなくなり、その時点でのstable最新の3.12を採用しました。

更新作業概要

主にやったことは以下となります。

  1. AWS CloudFormationの設定更新
    1. pythonやAWS Lambda Layersの設定値更新
  2. linter,formatter の設定更新
  3. github workflowの更新
  4. AWS Lambdaで使用しているイメージコンテナ(Docker)の更新

上記1,2,3では、それぞれ設定値の更新を行います。

イメージコンテナの更新は、それぞれのAWS LambdaにDockerを置き、それぞれ使用用途によって異なるのでpython3.8からpython3.12にする際も個別に調整していく必要があります。

Dockerの更新

  • OSが変わる
    • AWSから提供されているOSで、Python3.12を使用出来るのはAmazonLinux2023なのでこちらを採用となりました
    • CentOS 7 → AmazonLinux2023
  • 上記に伴い、パッケージ管理コマンドも変わる
    • yum ⇒ dnf

基本的な部分はあまり変わらないのですが、既存のDockerファイルはそのまま使えないので大幅に書き換える必要があります。

OS変更によりやったこと

  • dnfコマンドへの切り替え
  • OS変更により使えるパッケージ名や内容も変わるので、こちらも同等のものに合わせて変更

上記更新することで基本的にDockerも動きます。

問題と解決

ただし、LibreOfficeなどを使用したい場合、AWS Lambda使用時にエラーになる場合があります。

Uniforceでは、LibreOfficeを使用しており変換処理の際にエラーとなってしまいました。

ログを確認したところ、AWS Lambdaをキック時のエラー出力からlibssl とlibcrypto が見つからないため発生しています。

では、まずは明示的にLibreOfficeを入れたあとにopensslを入れ直してみました。

しかし、それだけではまだエラー…

もう一度ログを追ってみたところ、libssl3.so を探しにいっているのですがこれがないためエラーとなっていました。

置いてあるべき場所を確認しに行くとlibssl.so.3というファイルはあります。 詳しいことは省きますがlibssl3.so のシンボリックリンクでlibssl.so.3を参照することで動作しそうです。

最終的に以下のようにし、動作確認出来ました。

FROM public.ecr.aws/lambda/python:3.12

RUN dnf upgrade -y
RUN dnf -y install wget tar gzip zlib freetype-devel
RUN dnf -y install libxslt \\
gcc \\
.....略

# LibreOfficeツールをインストール
COPY LibreOffice_rpm.tar.gz ./
RUN tar -xvzf LibreOffic_rpm.tar.gz
RUN cd LibreOffice_rpm/RPMS; rpm -i *.rpm;
RUN dnf -y install cairo \\
openssl \\
nss

RUN ln -sf /lib64/libssl.so.3 /lib64/libssl3.so

最後に

大体のケースはパッケージ追加のみで解決出来ると思いますが、LibreOfficeに限らず別の外部ツールの更新などでも今回のような現象が発生することは案外高い気がします。

いろんな解決法がありますが、その1つとして参考にして頂けると幸いです。

参考リンク