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)
その他のバージョンの生成方法と使い方については有料記事部分で公開します。