PHP7.2が使えるLambdaのカスタムランタイム環境を作ってみた #reinvent

LambdaのCustom RutimeとしてStackery社から提供されている環境を拡張し、PHP7.2が動作するようにしてみました!!
2018.12.04

この記事は公開されてから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愛好家の皆様のお役に立てば幸いです。