PHPer(ぺちぱー)エンジニアの笹亀(ささがめ)です。
プロジェクトマネージャーがメインですが、根っこの部分はエンジニアですw
AWSのLambdaでもPHPが利用できるようになったというのを練馬で今年の春に行われたPHPerkaigiにて知りました。
phperkaigi.jp
PHPでもサーバレスで実施できるということで「PHPerなら試してみないとね!」っと自分に言い聞かせながら、使い勝手など把握をしておきたく、実際に勉強会のLTなどでもお話もさせていただいたので、せっかくなのでブログにも書きました〜
■目次です
サーバレスでPHP
Lambda PHPの概要
LambdaでもPHPが利用できるようになったのは2018年秋のAWS re:Inventで発表され、実際には2018年11月14日から利用ができるようになりました。
LambdaPHPは、LambdaCustomRuntimeとしてPHPを動かす構成になっており、実際にはLambda Layerを使ってPHPを動かします。

Lambda PHPで必要なもの
実際にLambda PHPで構築するまでには下記のものが必要となります。
- AWSアカウント
- AWS CLI
- AWS SAM(Serverless Application Model) CLI
- デプロイ用のS3のバケット
※もろもろ設定は割愛

- PHP Lambda Layer
Lambda PHP関数のディレクトリ構成とファイル構成
Lambda PHP関数を構築する際のディレクトリとファイル構成になります。template.yamlはSAMのサーバレス構成アプリケーションをCloudFormationにて、自動で環境を構築するための定義ファイルです。index.phpは関数の本体プログラムです。php.iniは関数の本体プログラムが利用するextensionを記載した設定ファイルです。これらのディレクトリ及びファイル構成を適当なプロジェクトフォルダ内に構築をして準備します。
├── template.yaml └── src └── php ├── index.php └── php.ini(有効にするextensionを記載)
template.yaml

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:
- !Sub arn:aws:lambda:${AWS::Region}:887080169480:layer:php73:2
Events:
api:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
index.php
<?php
$array_test = array(
'1' => 'apple',
'2' => 'orange',
'3' => 'banana',
'4' => 'melon',
'5' => 'grape',
);
echo json_encode($array_test);
php.ini

extension=json.so
template.yaml, index.php, php.iniを作成し、ここまでで、基本構築は完了です。
Lambda PHP関数をデプロイする
sam コマンドより、template.yamlに記載されたSAMの設定にそってAWSへ構築が自動的に行われます。

sam package\
--template-file template.yaml \
--output-template-file serverless-output.yaml \
--s3-bucket phpserverlesssam deploy \
--template-file serverless-output.yaml \
--stack-name my-first-serverless-php-service \
--capabilities CAPABILITY_IAM
sam package, sam deployのコマンド実行のイメージ図です。パッケージで準備をし、パッケージしたものをデプロイする手順にて実際にAWS上へ設定が展開されます。

Lambda PHPの動作確認
deployした後にAPIGatewayにて設定されているAPIGatewayでアクセス可能なURLを確認し(赤枠の部分)、ブラウザで実行するとPHPで記載されたプログラム(配列をJSON形式で出力する)が実行されているのがわかります。


現実的な使い方(まとめ)
現実的な利用方法は、何かしらのデータベース(LambdaなのでDynamoDBが相性がいいが・・AWS SDK for PHPなどを入れて。。ry)にPHPで接続をさせて、データを処理し、出力するようなSPAとしてのAPIとして利用するのが一般的な利用とおもえます。今の時代にPHPを生で書くという方法はあまりどうかとおもうので、PHPのフレームワークを使いたくなります。Lambda PHPでもsymfonyやLaravelなどのPHPフレームワークを入れて動かすみたいなこともPHP Lambda LayerとBrefを組み合わせるとできるようなので、こちらも導入してAPIとして動かすのはありな気がします。
bref.sh
いかがでしたでしょうか。実際にいろいろといじってみましたが、わざわざここまでしてPHPにこだわる必要は・・とは思いましたが、PHPしか書けないとかそういった人でも利用してもらうようなのかなぁっとも思いつつ、利用するのにもちゃんと実装目線でも使えるのか使えないのかをちゃんと意識することも大切だとおもいました。
追記(2019/07/17)
LambdaでDynamoDBの場合は問題になりませんが、サーバレスでRDBを利用する際に困る問題がコネクション数の問題です。
去年ごろからAWSでも対応が進んできており、MySQL、PostgresでもAuroraサーバレスが東京リージョンでも利用可能になっております。
dev.classmethod.jp