y2q_actionman’s ゴミクズチラ裏

内向きのメモ書きを置いてます

AWS Lambda の Common Lisp 製 Custom Runtime を更新した

背景

以前、下記の記事を書いた。

y2q-actionman.hatenablog.com

その後かなり長いこと放っておいていた。しかし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 にマージする・・のを年末年始にやりたいなと思っている。