AWS SDK であれこれしたいだけで別に Symfony や Laravel 等のフレームワークを動かしたいわけじゃなく、JavaScript とか Python に馴染みが無いから PHP でやりたいっていう程度っていう相談が来たとか来てないとか。https://github.com/aws-samples/php-examples-for-aws-lambda/tree/master/0.1-SimplePhpFunction を見た感じコンテナイメージとか作らずにレイヤーだけで出来そうだったのでやってみました。
Amazon Linux 2 はもうすぐ EOL を迎えるけど PHP 7 系は Amazon Linux 2023 では厳しいので AL2、PHP 8 系は AL2023 を使用します。レイヤーで使用するファイルはすべて Docker 内で作成します。サンプルでは PHP 本体と bootstrap を runtime.zip、vendor を vendor.zip としていますがここではまとめて runtime.zip にします。Lambda の容量制限に引っかかる場合は分けた方がいいかもしれません。
構築のパターンは下記の 3 種類です。この環境でとりあえず AWS SDK for PHP が使えるようなものを作ります。PHP モジュールは最低限なのでハードに PHP を使えるわけではありませんが API Gateway と組み合わせて CloudFront の署名付き URL を生成したりできます。
Amazon Linux 2 / PHP 7.4
ホストで実行します。
docker run -it --rm --name temp amazonlinux:2
コンテナで実行します。
yum update -y yum install -y \ autoconf \ bison \ gcc \ gcc-c++ \ gzip \ libcurl-devel \ libxml2-devel \ make \ openssl-devel \ re2c \ tar \ unzip \ zip \ zlib-devel # PHP cd /tmp curl -sL https://github.com/php/php-src/archive/php-7.4.33.tar.gz | tar xz cd php-src-php-7.4.33 ./buildconf --force ./configure --prefix=/opt --with-{curl,openssl,zlib} --without-{sqlite3,pdo-sqlite} make -j $(grep processor /proc/cpuinfo | wc -l) install # bootstrap cd /opt curl -LO https://raw.githubusercontent.com/aws-samples/php-examples-for-aws-lambda/master/0.1-SimplePhpFunction/bootstrap chmod +x bootstrap # composer cd /opt curl -sS https://getcomposer.org/installer | bin/php bin/php composer.phar require guzzlehttp/guzzle aws/aws-sdk-php zip -r runtime.zip bin/php bootstrap vendor
ホストで実行します。
docker cp temp:/opt/runtime.zip .
特に重要ではありませんが ldd /opt/bin/php の結果を貼っておきます。
bash-4.2# ldd /opt/bin/php
linux-vdso.so.1 (0x00007ffcd154c000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5421604000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f54213ee000)
librt.so.1 => /lib64/librt.so.1 (0x00007f54211e6000)
libm.so.6 => /lib64/libm.so.6 (0x00007f5420ea6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5420ca2000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f5420949000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f54206da000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f5420283000)
libz.so.1 => /lib64/libz.so.1 (0x00007f542006e000)
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f541fdb9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f541fa0c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f541f7ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007f542183b000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f541f5c9000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f541f37d000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f541f099000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f541ee95000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f541ec64000)
libnghttp2.so.14 => /lib64/libnghttp2.so.14 (0x00007f541ea3d000)
libidn2.so.0 => /lib64/libidn2.so.0 (0x00007f541e7ee000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f541e5c5000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f541e373000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f541e164000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f541df55000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f541dd51000)
libunistring.so.0 => /lib64/libunistring.so.0 (0x00007f541da39000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f541d81d000)
libssl3.so => /lib64/libssl3.so (0x00007f541d5bb000)
libsmime3.so => /lib64/libsmime3.so (0x00007f541d395000)
libnss3.so => /lib64/libnss3.so (0x00007f541d067000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007f541ce37000)
libplds4.so => /lib64/libplds4.so (0x00007f541cc33000)
libplc4.so => /lib64/libplc4.so (0x00007f541ca2e000)
libnspr4.so => /lib64/libnspr4.so (0x00007f541c7f1000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f541c5ca000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f541c368000)
その他のバージョンの生成方法と使い方については有料記事部分で公開します。