AWS Lambda の Common Lisp 製 Custom Runtime を更新した
背景
以前、下記の記事を書いた。
その後かなり長いこと放っておいていた。しかしAWS 側の更新により、この Custom Runtime で使っていた Amazon Linux が 2023年12月31日をもって廃止されてしまうという通知が夏頃に AWS から届いていた。 それもまた結構長いこと放っておいていたが・・この年の瀬になってついに重い腰をあげて作業することにした。
作業内容
Custom Runtime をビルドするのに使う Dockerfile が参照するイメージが廃止予定の Amazon Linux になってしまっているので、まだしばらくはサポートされる Amazon Linux 2 に更新した。
そうしたら、 Lambda を作るときに Amazon Linux 2 を使うよう --runtime provided.al2
を指定して aws lambda create-function
を呼べばよい。
diff はこちら
Fix for Amazonlinux:2 · y2q-actionman/cl-aws-custom-runtime-test@3baf6de · GitHub
SSL関連設定
今回はまったのは SSL 関連設定。 「Amazon Linux 2 を指定すれば終わるでしょ」と適当に始めたら、以下のエラーで cl+ssl
がロードできずに困ってしまった。
Unhandled CFFI:LOAD-FOREIGN-LIBRARY-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING {10005285B3}>: Unable to load any of the alternatives: ("libcrypto.so.1.1" "libcrypto.so.1.0.0" "libcrypto.so.3" "libcrypto.so")
調べたところ、 Amazon Linux 2 では /usr/lib64/
以下に SSL 関連の .so が転がっており、また cl+ssl にも 共有ライブラリの場所を指定する機能が追加されている ことが分かった。それらを使って、以下の設定を cl+ssl を読み込む前に行うことで回避した。
(ql:quickload '#:cl+ssl/config) (cl+ssl/config:define-libssl-path "/usr/lib64/libssl.so.1.0.2k") (cl+ssl/config:define-libcrypto-path "/usr/lib64/libcrypto.so.1.0.2k")
SSLライブラリ関連設定は Lisp をインストールするときに時々困る点。Lispを入れる先の環境が変わると libssl のバージョンと場所の問題がよく発生する。 AWS などのクラウドサービスが提供するイメージが変わることは避けられないので、今後も毎回設定するんだろうなあ・・という感じ。
Amazon Linux 2023 にしたかった
Amazon Linux 2 より新しい Amazon Linux 2023 があるので、そっちでやってみようとも思った。 しかし、パッケージインストーラを走らせるとエラーが出てしまうので調査中・・
Step 4/4 : RUN dnf install -y zip ---> Running in a86be5494aca (dnf:1): GLib-ERROR **: 14:01:31.909: file ../glib/gthread-posix.c: line 1340 (g_system_thread_new): error 'Operation not permitted' during 'pthread_create' w The command '/bin/sh -c dnf install -y zip' returned a non-zero code: 133
TODO
今のところは Amazon Linux からの更新しかしていないが、かなり古い版の SBCL を参照してたりと微妙なところがある。 そこらへんが終わったらさっさと master にマージする・・のを年末年始にやりたいなと思っている。