mattintosh note

どこかのエンジニアモドキの備忘録

Amazon LinuxのPHP 8.xでElastiCache Cluster Clientを使えるようにする

PHP が 7.4 くらいまでだった頃は ElastiCache Cluster Client は各 PHP のバージョンに対して x86 と ARM それぞれ一種類ずつだった気がするんだけど PHP 8.x 以降ぐらいからだろうか、OpenSSL 1.1 版と 3.0 版に分かれるようになった。

AWS ElastiCache
AWS ElastiCache

今回使う Amazon Linux は下記のバージョン。

$ 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) だった。

docs.aws.amazon.com

OpenSSL 1.1.1c のコンパイル方法は上記のページに書いてある。

AWS ElastiCache Cluster Client
AWS ElastiCache Cluster Client

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 にフィードバックを送っておいた🤔