mattintosh note

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

AWS LambdaでシンプルなPHP実行環境を作る

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 本体と bootstrapruntime.zipvendorvendor.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)

その他のバージョンの生成方法と使い方については有料記事部分で公開します。

この続きはcodocで購入