📑

【PHP 7.4以上版】ElastiCache Cluster Clientのインストールや設定、読み込み失敗時の原因調査までまとめてみた

2023/07/02に公開1

この記事でやりたいこと

AWS ElastiCache for Memcachedを利用するためにはキャッシュ書き込み(EC2など)側で必要な設定がいくつかあります。その中のCluster Clientをインストールして設定する手順が特に最新(PHP7.4以上)版でややこしく、公式ドキュメント通りに進めても上手くいかなかったので、失敗時の原因調査や最終的に必要な設定についてまとめてみます。また完全版の手順をAnsibleのPlaybookでコード化を試みたので、そちらも紹介させて頂きます。

この記事の前提条件(環境、ソフト、バージョンなど)

  • PHP 8.0 ※AWS公式ドキュメントによれば7.4以上が同様の設定手順となる模様
  • Amazon Linux 2 のAMIで起動したEC2
  • AWS ElastiCache for Memcachedを最大限活用したい
  • WordPress 6.2 でDBキャッシュがしたい
  • W3 Total Cache(WordPressのプラグイン)を利用 ※AWS公式ハンズオンも同様

※ 検証はしていませんが、WordPress以外でも同様にできると思います。

ダイジェスト版まとめ-何が起きて何を調べてどう対処したか

  • 起きたこと:筆者の場合、公式手順のとおりに進めたところ、WordPressプラグインのW3 Total CacheやPHP InfoでMemcachedが表示されず(読み込まれず?)、失敗しました。まさに公式ハンズオンの「トラブルシューティング」に記載の事象が発生。。
  • 何を調べたか: 公式ハンズオンでは「クライアントのインストールのための手順をもう一度確認」としか記載されておらず、情報の波にもまれたり、路頭に迷ったりしたのち、 コマンドでphp -mと実行すると、わかりやすいエラーメッセージが確認できることを発見(「記事化しようと決意」)
  • どう対処したか:メッセージに従い、以下の通りコマンドを実行したところ、正常に動作しました。

私の場合、公式ドキュメントのインストール手順を最後まで実施したのち、php -mを実行すると、一番上に下記メッセージが表示されました。

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

要点としては、

  • amazon-elasticache-cluster-client.soがロードできない
  • libcrypto.so.1.1が開けなくて、そんなものは存在しない(と怒られている)
    ということがわかります。

libcrypto.so.1.1というのをみて、公式手順の最後で
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
というのを実行したのを思い出して、以下を調べました。

/usr/lib64/ -alの出力結果の一部
lrwxrwxrwx  1 root root       30 Jul  2 16:13 libssl.so.1.1 -> /usr/local/lib64/libssl.so.1.1
lrwxrwxrwx  1 root root       16 Jul  2 16:07 libssl.so.10 -> libssl.so.1.0.2k
lrwxrwxrwx  1 root root       19 Jul  2 16:07 libcrypto.so.10 -> libcrypto.so.1.0.2k

これからわかるのは、libssl.so.1.1はシンボリックリンクができているが、libcrypto.so.1.1のシンボリックはない(明らかに旧バージョンとわかるlibcrypto.so.10にはシンボリックがある)。ということはlibcrypto.so.1.1の新しいバージョンのシンボリックをlibssl.so.1.1と同様に作成すればよいのでは、と考えました。

ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

というわけで、めでたく動作確認まで到達しました。

完全版まとめ-インストール手順(Ansibleでやってみた)

結局のところ、筆者の場合、公式の手順にたったの1つ追加でコマンド実行するだけでした。にもかかわらず完全版として、この記事でわざわざ全て記載しなおすのもどうか(ほぼ公式ドキュメント丸パクることに?)と思い、Ansibleでインストール手順をコード化した例を紹介させてもらいます!

main.yml
---
- name: check module memchached with elasticache-cluser-client.so
  shell: | 
    /bin/bash -lc "php -m | grep memcached"
  check_mode: no
  failed_when: false
  register: memcached_as_module
 
- debug: 
    var: memcached_as_module.stdout

- name: configure elasticache-cluser-client.so
  block: 
    - name: download elasticache-cluser-client
      get_url: 
         url: https://elasticache-downloads.s3.amazonaws.com/ClusterClient/PHP-8.0/latest-64bit-X86-openssl1.1
         dest: /tmp
      register: ecache_client_gz
    - name: Unzip elasticache-cluser-client
      unarchive:
      # as of 230702, /tmp/AmazonElastiCacheClusterClient-PHP80-64bit-libmemcached-1.0.19-openssl1.1.tar.gz
        src: "{{ ecache_client_gz.dest }}" 
        dest: /tmp 
        remote_src: yes 
    - name: copy amazon-elasticache-cluster-client.so to /modules
      copy:
        src: /tmp/amazon-elasticache-cluster-client.so
        dest: /usr/lib64/php/modules/amazon-elasticache-cluster-client.so
        owner: root
        group: root
        mode: 0755
    - name: replace /etc/php.d/50-memcached.ini
      template:  
        src: 50-memcached.ini
        dest: /etc/php.d/50-memcached.ini
        owner: root 
        group: root
        mode: 0644
    - name: check openssl1.1
      shell: | 
        /bin/bash -lc "openssl version"
      check_mode: no
      failed_when: false
      register: check_openssl11
    - debug:
        var: check_openssl11
    - name: configure openssl1.1
      block:
        - name: install packages for openssl1.1
          yum: 
            name: "{{ packages }}" 
            state: present
          vars:
            packages:
            - make
            - gcc
            - pcre-devel
            - wget
            - zlib-devel 
        - name: download openssl1.1
          get_url:
            url: https://www.openssl.org/source/openssl-1.1.1c.tar.gz
            dest: /tmp
          register: openssl11
        - name: Unzip openssl1.1
          unarchive:  
            src: /tmp/openssl-1.1.1c.tar.gz
            dest: /tmp 
            remote_src: yes 
        - name: install and setting openssl1.1 
          shell: | 
            /bin/bash -lc "cd /tmp/openssl-1.1.1c"
            /bin/bash -lc "sudo ./config"
            /bin/bash -lc "sudo make"
            /bin/bash -lc "sudo make install"
          check_mode: no
          args:
            chdir: /tmp/openssl-1.1.1c
      when: "'OpenSSL 1.1.1c' not in check_openssl11.stdout"
    - name: ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
      file:
        src: /usr/local/lib64/libssl.so.1.1
        dest: /usr/lib64/libssl.so.1.1
        state: link
    - name: ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
      file:
        src: /usr/local/lib64/libcrypto.so.1.1
        dest: /usr/lib64/libcrypto.so.1.1
        state: link
  become: yes
  when: not memcached_as_module.stdout == "memcached"

- name: reload httpd service for memcached
  systemd:
    name: httpd
    state: restarted
    daemon_reload: yes
  become: yes


50-memcached.ini
extension=amazon-elasticache-cluster-client.so

参考ドキュメント

・AWS公式ドキュメント:PHP クラスタークライアントのインストール手順が記載
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Appendix.PHPAutoDiscoverySetup.Installing.html

・AWS公式ハンズオン:「Memcached 用 Amazon ElastiCache を使用して WordPress を高速化する」
https://aws.amazon.com/jp/elasticache/memcached/wordpress-with-memcached/

Discussion

kouhei sanokouhei sano

記事にしていただき本当にありがとうございます!
この情報はあまり多くなく、みなさん悩んでいないのか不思議でした。

昨日立ち上げた AmazonLinux2 に OpenSSL1.1 を
yum install openssl11 openssl11-libs でインストールしてみましたが
この方法でも問題ありませんでした。
※ 公式がソースからインストールしているのが気になっていたので...

この方法の場合は、必要なシンボリックリンクが2つともありました!

[root@webserver01 ~]# ls -l /usr/lib64/libssl*
lrwxrwxrwx 1 root root     16  2月 20 17:03 /usr/lib64/libssl.so -> libssl.so.1.0.2k
-rwxr-xr-x 1 root root 457920 11月 16 05:22 /usr/lib64/libssl.so.1.0.2k
lrwxrwxrwx 1 root root     16  2月 20 17:15 /usr/lib64/libssl.so.1.1 -> libssl.so.1.1.1g
-rwxr-xr-x 1 root root 585144 11月 16 05:08 /usr/lib64/libssl.so.1.1.1g
lrwxrwxrwx 1 root root     16  1月 27 02:53 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k
-rwxr-xr-x 1 root root 409192  1月 24 09:11 /usr/lib64/libssl3.so
[root@webserver01 ~]# 
[root@webserver01 ~]# ls -l /usr/lib64/libcrypto*
lrwxrwxrwx 1 root root      19  2月 20 17:03 /usr/lib64/libcrypto.so -> libcrypto.so.1.0.2k
-rwxr-xr-x 1 root root 2471456 11月 16 05:22 /usr/lib64/libcrypto.so.1.0.2k
lrwxrwxrwx 1 root root      19  2月 20 17:15 /usr/lib64/libcrypto.so.1.1 -> libcrypto.so.1.1.1g
-rwxr-xr-x 1 root root 3005856 11月 16 05:08 /usr/lib64/libcrypto.so.1.1.1g
lrwxrwxrwx 1 root root      19  1月 27 02:53 /usr/lib64/libcrypto.so.10 -> libcrypto.so.1.0.2k
[root@webserver01 ~]#