この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
サーバーレス開発部@大阪の岩田です。 re:Invent2018の発表直後からLambdaの実行環境としてPHPのCustom Runtimeが選択できるようになりました。
【アップデート】 もう言語で悩まない!AWS LambdaでCustom Runtimeが利用できるようになりました! #reinvent
しかし、このStackery社から提供されているCustom RuntimeのPHPはバージョンが7.1となっています。 Stackery社のCustom Runtimeを参考にPHP7.2のCustom Runtimeを作成してみたので、手順についてご紹介します。
手順
PHP7.2用のビルド環境構築
まずはStackery社のリボジトリをcloneします。
git clone https://github.com/stackery/php-lambda-layer.git
cloneできたら下記の通りファイルを修正します。
bootstrap
bootstrap
- exec("php -S localhost:8000 -c /var/task/php.ini -d extension_dir=/opt/lib/php/7.1/modules '$HANDLER'");
+ exec("php -S localhost:8000 -c /var/task/php.ini -d extension_dir=/opt/lib/php/7.2/modules '$HANDLER'");
Makefile
Makefile
-php71.zip:
+php72.zip:
docker run --rm -v $(ROOT_DIR):/opt/layer lambci/lambda:build-nodejs8.10 /opt/layer/build.sh
-upload: php71.zip
+upload: php72.zip
./upload.sh
-publish: php71.zip
+publish: php72.zip
./publish.sh
clean:
- rm php71.zip
+ rm php72.zip
php.ini
php.ini
-extension_dir=/opt/lib/php/7.1/modules
+extension_dir=/opt/lib/php/7.2/modules
build.sh
このファイルは変更箇所が多いのでdiffではなくファイルの中身丸々記載します。 PHP7.2がyumでは導入できないのでソースからコンパイルしています。
build.sh
#!/bin/bash
yum install -y libxml2-devel libcurl-devel
curl -fsSl 'http://jp2.php.net/distributions/php-7.2.12.tar.gz' -o php-7.2.12.tar.gz
mkdir -p php-7.2.12
tar -xf php-7.2.12.tar.gz -C php-7.2.12 --strip-components=1
cd php-7.2.12
./configure \
--enable-pcntl \
--enable-json=shared \
--with-curl=shared
make
make install
cd ext
for ext in json curl
do
cd $ext
phpize
./configure
make
make install
cd ..
done
mkdir /tmp/layer
cd /tmp/layer
cp /opt/layer/bootstrap .
cp /opt/layer/php.ini .
mkdir bin
cp /usr/local/bin/php bin/
mkdir lib
for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do
cp "/lib64/${lib}" lib/
done
mkdir -p lib/php/7.2/modules/
cp -a /usr/local/lib/php/extensions/no-debug-non-zts-20170718/* lib/php/7.2/modules/
cp /usr/lib64/libedit.so.0 lib/php/7.2/modules/
zip -r /opt/layer/php72.zip .
ビルド
ファイルが修正できたらビルドします。
make php72.zip
レイヤーの作成
ビルドが完了するとphp72.zipというファイルが出力されます。 このzipファイルをアップロードしてphp7.2のレイヤーを作成します。
PHPのLambdaを作成、デプロイ
PHP7.2のレイヤーが作成できたらphpinfoを実行するLambdaのコードをデプロイします。 デプロイの際に、レイヤーとして先ほど作成したPHP7.2のレイヤーを指定します。
AWSTemplateFormatVersion: 2010-09-09
Description: My PHP Application
Transform: AWS::Serverless-2016-10-31
Resources:
phpserver:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub ${AWS::StackName}-phpserver
Description: PHP Webserver
CodeUri: src/php
Runtime: provided
Handler: index.php
MemorySize: 3008
Timeout: 30
Tracing: Active
Layers: <先ほど作成したPHP7.2のレイヤーのarn>
Events:
api:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
手順は下記のブログを参照して下さい。
本番環境のLambdaをステップ実行!! Lambdaのカスタムランタイム環境(PHP用)にExtensionを組み込んでみた #reinvent
確認してみる
デプロイできたらAPI GWのエンドポイントにアクセスし、phpinfoの出力結果を確認します。
無事にPHP7.2で動作しています!!
まとめ
PHP7.2のカスタムランタイムの構築方法についてご紹介しました。 未確認ですが、他のバージョンのPHPで構築する場合もほぼ同様の手順で構築できるかと思います。
PHP愛好家の皆様のお役に立てば幸いです。