Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

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

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

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

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

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

aws.PNG

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

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

aws-instance.PNG

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

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

terminal.PNG

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をランタイムとして作成を終えてください。

lambda.PNG

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

upload.PNG

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

test.PNG

まとめ

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away