PHP が 7.4 くらいまでだった頃は ElastiCache Cluster Client は各 PHP のバージョンに対して x86 と ARM それぞれ一種類ずつだった気がするんだけど PHP 8.x 以降ぐらいからだろうか、OpenSSL 1.1 版と 3.0 版に分かれるようになった。
$ uname -a Linux 5.10.184-175.731.amzn2.x86_64 #1 SMP Tue Jun 27 21:48:55 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/os-release NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/"
Amazon Linux 2 の OpenSSL のバージョンは現状 OpenSSL 1.0.2k-fips 26 Jan 2017
なので OpenSSL 1.1 版を使う場合は OpenSSL 1.1 のコンパイルが必要になる。ちなみに今日時点の Amazon Linux 2023 は OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
だった。
OpenSSL 1.1.1c のコンパイル方法は上記のページに書いてある。
sudo yum -y update sudo yum install -y make gcc perl-core pcre-devel wget zlib-devel wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz tar xvf openssl-1.1.1c.tar.gz cd openssl-1.1.1c ./config make sudo make install sudo ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
で、動作確認に php -m
をしてみても memcached
が出てこない(amazon-elasticache-cluster-client.so は memcached として認識される)。
ログを見てみたらどうも libcrypto.so.1.1
が見つからないようだ。
PHP Warning: PHP Startup: Unable to load dynamic library 'amazon-elasticache-cluster-client.so' (tried: /usr/lib64/php/modules/amazon-elasticache-cluster-client.so (libcrypto.so.1.1: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/amazon-elasticache-cluster-client.so.so (/usr/lib64/php/modules/amazon-elasticache-cluster-client.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
OpenSSL 1.1.1c のインストール先を見てみると libcrypto.so.1.1
は一緒にインストールされてる。
$ ll /usr/local/lib64 total 10392 drwxr-xr-x 2 root root 55 Jul 6 19:40 engines-1.1 -rw-r--r-- 1 root root 5614068 Jul 6 19:40 libcrypto.a lrwxrwxrwx 1 root root 16 Jul 6 19:40 libcrypto.so -> libcrypto.so.1.1 -rwxr-xr-x 1 root root 3337560 Jul 6 19:40 libcrypto.so.1.1 -rw-r--r-- 1 root root 1014600 Jul 6 19:40 libssl.a lrwxrwxrwx 1 root root 13 Jul 6 19:40 libssl.so -> libssl.so.1.1 -rwxr-xr-x 1 root root 667984 Jul 6 19:40 libssl.so.1.1 drwxr-xr-x 2 root root 61 Jul 6 19:40 pkgconfig
libssl.so.1.1
のリンクを見てみると /lib64/libcrypto.so.1.1
が必要なのでこれも /usr/lib64
に配置してあげる必要があるようなのだが AWS ドキュメントの不備かな。
$ ldd /usr/lib64/libssl.so.1.1 linux-vdso.so.1 (0x00007ffc9d7be000) libcrypto.so.1.1 => not found libdl.so.2 => /lib64/libdl.so.2 (0x00007f2e03322000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2e03104000) libc.so.6 => /lib64/libc.so.6 (0x00007f2e02d57000) /lib64/ld-linux-x86-64.so.2 (0x00007f2e03c92000)
というわけで libcrypto.so.1.1
もシンボリックリンクで配置してあげる。
sudo ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
もう一度 php -m
で確認して memcached
が有効になっていることを確認する。
一応 AWS にフィードバックを送っておいた🤔