アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

LambdaでPHPを動かしてみた

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を動かします。

f:id:tyatya1229:20190705185728p:plain
構成

Lambda PHPで必要なもの

実際にLambda PHPで構築するまでには下記のものが必要となります。

  • AWSアカウント
  • AWS CLI
  • AWS SAM(Serverless Application Model) CLI
  • デプロイ用のS3のバケット

 ※もろもろ設定は割愛

f:id:tyatya1229:20190705190954p:plain
AWSの設定参考

  • PHP Lambda Layer

github.com

Lambda PHP関数のディレクトリ構成とファイル構成

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


├── template.yaml
└── src
    └── php
      ├── index.php
       └── php.ini(有効にするextensionを記載)

template.yaml

f:id:tyatya1229:20190708153716p:plain
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

f:id:tyatya1229:20190708153723p:plain
php.iniの説明

extension=json.so

template.yaml, index.php, php.iniを作成し、ここまでで、基本構築は完了です。

Lambda PHP関数をデプロイする

sam コマンドより、template.yamlに記載されたSAMの設定にそってAWSへ構築が自動的に行われます。

f:id:tyatya1229:20190708161400p:plain
samコマンド説明

sam package\
--template-file template.yaml \
--output-template-file serverless-output.yaml \
--s3-bucket phpserverless

sam deploy \
--template-file serverless-output.yaml \
--stack-name my-first-serverless-php-service \
--capabilities CAPABILITY_IAM

sam package, sam deployのコマンド実行のイメージ図です。パッケージで準備をし、パッケージしたものをデプロイする手順にて実際にAWS上へ設定が展開されます。

f:id:tyatya1229:20190708161222p:plain
sam package, sam deploy

Lambda PHPの動作確認

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

f:id:tyatya1229:20190708163455p:plainf:id:tyatya1229:20190708163709p:plain
Lambda PHPの動作確認

現実的な使い方(まとめ)

現実的な利用方法は、何かしらのデータベース(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