0から始める!AWS LambdaをPHPでやってみるためのハウツー


ユアマイスター株式会社のインターン、京極と申します。

AWS LambdaをPHPで触ってみたかったのでまとめてみました。

AWS Lambdaがサポートする言語にPHPは含まれていませんでしたので、EC2インスタンスをつくり、そのうえでPHP環境を作るところから始めます。

手順には、こちらを参考にさせていただきました。

EC2上でPHPを動かすインスタンスを立ち上げよう!

AWSのコンソールへログインし、EC2上で作業を行います。

amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2というAMIがLambdaの実行環境として動くようなので、クリックします。下図の画面が出たら作成ボタンを押します。

インスタンスタイプにt2.largeを選び、SSHをセキュリティグループに入れて、インスタンスを立ち上げます。
※キーペアは既存のものでも新しく作るでもどちらでも構いません。

以下のように立ち上がっていればオッケーです。

立ち上げたインスタンスへ接続します。

ssh -i <鍵> ec2-user@<IPアドレス>

PHP7のインストール

はじめに接続したインスタンスのパッケージを更新しておきます。

yum update

依存するパッケージをインストールします。

sudo yum install gcc gcc-c++ libxml2-devel -y 

PHP7のソースコードを取得します。バージョンは安定版の最新7.2.4を使用しました。

wget http://jp2.php.net/get/php-7.2.4.tar.bz2/from/this/mirror -O php-7.2.4.tar.bz2
tar jxvf php-7.2.4.tar.bz2

いよいよビルドを行います。ホームディレクトリ上にphp-binというディレクトリを作成しそこにインストールします。

mkdir php-bin
cd php-7.2.4
./configure --prefix=/home/ec2-user/php-bin/
make install

ビルドの時間を計ったら7分弱でした。この間にコーヒーでも飲んでいてください。

Lambda用のファイルを設置

前項でPHPがインストールされましたのでそれを使って、Lambda用のzipファイルを作成します。

先にphp-lambdaというディレクトリを作り、そこにさきほどビルドしたphp-binを移動させます。

cd
mkdir php-lambda
mv php-bin php-lambda/

php-lambdaディレクトリに二つファイルを置くのですが、一つ目はphp.jsファイルです。LambdaからはNode.jsが動くようにしておき、Node.jsからPHPをキックするようにしますので、そのためのJSファイルを設置します。

php-lambda/php.js

php-lambda/php.js
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

const spawn = require('child_process').spawn;

exports.handler = function(event, context) {
    var php = spawn('php-bin/bin/php',['helloLambda.php']);
    var output = "";

    php.stdin.write(JSON.stringify(event));

    php.stdin.end();

    php.stdout.on('data', function(data) {
          output+=data;
    });

    php.stderr.on('data', function(data) {
            console.log("STDERR: "+data);
    });

    php.on('close', function(code) {
            context.succeed(JSON.parse(output));
    });
}

二つ目のファイルは、helloLambda.phpファイルです。

php-lambda/helloLambda.php

php-lambda/helloLambda.php
<?php
 $data = stream_get_contents(STDIN);
 $json = json_decode($data, true);
 $result = json_encode(array('result' => count($json)));
 echo $result."\n";
?>

helloLambda.phpファイルでは、標準入力で渡されたJsonをデコードして配列の数を返しています。このファイルを書き換えることでLambdaとしての挙動を変えれらるのでサンプル以外のコードも書きたかったのですが環境構築に時間がかかりすぎました。

zipファイルとしてまとめます。

cd php-lambda
zip -r php-lambda.zip ./

一旦SSH接続を終了して、できたzipファイルを手元の環境に持ってきて完了です。

scp -i <鍵> ec2-user@<IPアドレス>:php-lambda/php-lambda.zip .

AWS LambdaでPHPの実行!

いよいよLambdaとして関数を登録する最後の作業です。AWSコンソール上で図のように関数を作成します。zipファイルのアップロードは関数の作成後行いますのでここではNode.jsをランタイムとして作成を終えてください。

作成された関数の関数コードのところでzipファイルのアップロードを行います。こちらも図のように前項で作ったzipファイルをアップロードして、ハンドラをphp.handlerと記述し保存ボタンを押します。

いよいよ最後になりました。Lambdaのテストを行います。
テストボタンで適当な名前のテストイベント名を付けて、実行してください。helloLambda.phpファイルが正しく実行されれば、下図のようにresultというキーの値が3になって返されれば成功です!

まとめ

PHP7の最新版を使い、AWS Lambdaが試せることが分かりました。ぜひ遊んでみてください。

(今回作成したEC2インスタンスはzipファイルが作成できれば不要になりますので削除を忘れずに。)