LambdaでPHPを使う

こんにちは。かっぺいです。
LambdaでPHPを使えないかとずっと思っていましたが、brefを使うと簡単に実現できるらしく試してみました。

構築環境の準備

ローカルのPCに入れようかと思いましたが、まずはEC2のインスタンスに構築することにしました。

インスタンスの作成

EC2をAmazonLinux2023で作成します。今回はt4g.microで作成しました。
その後、phpをインストールして、composerを入れます。

# dnf install php8.2
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php

node.jsのインストール

serverlessを使うために、node.jsをインストールします。
AWS SAMを使う場合は必要ないらしいですが、今回はこちらを使います。

# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# nvm install stable --latest-npm

serverlessのインストール

Serverlessフレームワークをインストールしますが、デフォルトだとv4がインストールされ、それだとbrefが問題あるらしくv3を指定してインストールする必要があります。

# nmp install -g serverless@3

Lambdaファンクションの準備

brefのインストール

適当なフォルダを作成して、brefをインストールと初期化します。

# mkdir lambda-test
# cd lambda-test
# composer require bref/bref
# ./vendor/bin/bref init

初期化する際に、作成するタイプを聞いてきます。普通のLambdaファンクションを作るので、1のEventを選びます。

名前などを定義

brefを初期化すると、serverless.ymlが出来上がるので、中身を編集します。

主な編集項目は、serviceとregion、ファンクション名を変更します。

デプロイ

ロールの適用

serverlessを使って、AWSにデプロイする前に、CloudFormationを使うための権限を付与します。
マニュアルでは、アクセスキーを準備してと言う感じになっていますが、EC2上で動かしているのでロールをアタッチします。
ロールは、AdministratorAccessで付与するようにとServerlessのセットアップ手順に記載されています。

デプロイ

# serverless deploy

何も指定しないと、ステージはdevでデプロイされます。–stageを指定すると任意の名前でデプロイできます。

# serverless deploy --stage=prod

Lambdaファンクションのロール

本来は、serverless.ymlで指定するようですが、デプロイした後にIAMのロールから変更することもできます。

削除

serverless remove

ステージ名を指定した場合はデプロイ時と同じように–stageで指定します。

アップロードに使ったS3バケット、ロール、CloudWatchのロググループを一緒に削除してくれます。

その他

気軽に実現できる反面、マネージドランタイムではAWSSDKが一通り入っているにbrefではイベントで呼び出される最低限のAWS操作しか行えないようで、S3にオブジェクトをPutすることができませんでした。

PHPで書いたソースをそのままLambdaに移行できればと思っていたのですが、後一歩でうまくいかなかったので、素直にPythonで書き直すようにした方が良かったのかもと思いました。