mattintosh note

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

2024-06-05: 現在ホビー関連の記事を hobby.mattintosh-note.jp に移行しています。
現在掲載されている一部の画像と今後掲載される画像は特定の環境から閲覧できなくなります。

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