こんにちは。かっぺいです。
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で書き直すようにした方が良かったのかもと思いました。