はじめに
この記事は NE Advent Calendar 2023 7日目の記事です。
どうして PHP なのか
弊社は PHP をメインに開発を進めております。
Lambda が標準でサポートしている Golang や Python を日常的に使用している人はおらず、Lambda のためだけに新しい言語を導入するのは今後このコードをメンテ出来る人が減ってしまう。
なんとかして PHP で書けないものか...
救世主
Bref は PHP を Lambda で実行するための環境を提供してくれるライブラリです。
早速使ってみる
インストール
以下のような composer.json を作って、composer install
を実行します。
{
"require": {
"bref/bref": "^2.1"
}
}
中身を書く
あとは思い思いにプログラムを書いてゆく。
他のライブラリを使う必要がないのであれば composer が自動で作成する autoload.php
を require_once する必要はないです。
<?php
declare(strict_types=1);
return function ($event) {
// do something
};
デプロイ
一旦動作するかどうか確かめるためにデプロイします。
しかしながら、公式に記述されているデプロイ方法は Serverless を利用した方法しか記述されていません。
弊社では Lambda で動作させるコードは lambroll を利用してデプロイするようにしています。今回も lambroll を使ってデプロイしたい。
lambroll を利用した Lambda へのデプロイ
lambroll の詳しい使い方は公式を読んでもらえばと思います。
弊社が lambroll を採用している理由として、
- tfstate の情報を利用することができる
- Lambda のソースコードのみをデプロイすることができる
が挙げられます。
デプロイ方法
まずは lambroll を利用するために必要な設定ファイルの準備をします。
{
"Description": "hoge",
"FunctionName": "qiita-sample-function",
"Handler": "handler.php",
"MemorySize": 128,
"Role": "{{ tfstate `aws_iam_role.qiita_sample_function.arn` }}",
"Runtime": "provided.al2",
"Layers": [
"arn:aws:lambda:ap-northeast-1:534081306603:layer:php-82:49"
],
}
Role
Role には Lambda を実行する時に assume する IAM ロールを指定する必要があります。
IAM ロールは Terraform によって事前に定義されているのでそれを参照するようにしたいです。lambroll には Terraform によって生成された tfstate を読み込む機能があるのでそれを利用して参照します。
Layers
Bref を利用する時には個々のパラメータが非常に重要になります。
Lambda におけるレイヤーとは、コードが動作するために必要な依存関係をアプリケーションコードに含めるのではなくパッケージとして分離するための概念です。これにより、Lambda のコードを小さく保ちながら、再利用性やメンテナンス性を向上させることができます。
Bref ではこのレイヤーを提供してくれています。
https://runtimes.bref.sh/
composer 経由によってインストールされるパッケージと Bref から提供されている専用のレイヤーを利用することことで PHP を Lambda で動作させることができます。
デプロイの実行
ディレクトリ構成は以下のようなものを想定しています。
├── function.json
├── composer.json
├── composer.lock
├── handler.php
└── vendor
├── autoload.php
├── bref
:
:
lambroll は以下のようにして実行できます。
$ lambroll deploy --function=function.json --tfstate=terraform.tfstate
おわりに
PHP が一番得意、業務上 PHP での実装を求められているなど Lambda を PHP で動かしたい人は少なくないと思います。
Bref を使いこなして良き Lambda ライフを!