Lambda + PHP
AWS の Lambda といえば Python
でしたが、 Custom Runtime が拡充され、 2018 年から PHP が選択できるようになりました。
私は PHP 系のプロジェクトが多く、少し複雑なことをするならば PHP で実装したほうが後々メンテナンスがしやすい、ということで Lambda の Custom Runtime で PHP を動かせてみました。
bref
その時に利用したライブラリが PHP 用のサーバレスフレームワーク bref
です。

https://bref.sh/
なぜ bref
か、というのは尊敬するテックリードがおすすめしていたからですね
bref
はデプロイ部分に Serverless framework
を使っています。
https://serverless.com/
bref
は、以前 SAM
でデプロイしていたようで、バージョンを意識したほうが良い場面がありそうです。
bref のインストール
Installation
https://bref.sh/docs/installation.html
の、公式に従ってインストールを行っていきます。
IAM ユーザの⽤意
はじめにデプロイ用のユーザを作成します。
デプロイで利用する部分なため、 Serverless framework
のドキュメントを見ると良いです。
AWS - Credentials
https://serverless.com/framework/docs/providers/aws/guide/credentials/
このドキュメントでは、 AdministratorAccess
をつけましょうと書いています。
AdministratorAccess
はツヨツヨなため、そこまでするのは抵抗がありますよね。
実際は、マストな部分の権限だけあれば問題ないようです。
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "Stmt20180730",
6 "Effect": "Allow",
7 "Action": [
8 "s3:*",
9 "logs:*",
10 "iam:*",
11 "apigateway:*",
12 "lambda:*",
13 "cloudformation:*",
14 "events:*"
15 ],
16 "Resource": [
17 "*"
18 ]
19 }
20 ]
21}
参考
ServerlessインストールからLambdaへのデプロイ
https://qiita.com/jumjamjohn/items/abbc060fd2c1c6791ef3
ユーザを作成したら、次の 2 点をメモします。
Access key ID
Secret access key
Serverless framework のインストール
Serverless framework
は npm
からインストールします。
1$ npm install -g serverless
もし npm
をインストールしていなければ別途 node.js
のインストールを行ってください。
Serverless framework
のインストール後に設定を行います。
このとき、先程メモした Access key ID
と Secret access key
を入力してください。
1$ serverless config credentials --provider aws --key <Access key ID> --secret <Secret access key>
設定を完了後に ~/.aws/credentials
に情報が追加されていれば OK です。
すでにプロファイルがあるなら
AWS CLI
など、すで AWS のプロファイルが入っている場合、 serverless config
時に上書きするかの確認が入ります。
--profile [profile name]
オプションをつけてプロファイルを分けると良さそうです。
bref のインストール
bref
は Composer
で追加します。
1$ composer require bref/bref
bref
は、執筆時点で PHP 7.2
が必須です。
Lambda function を作成する
関数を作って Lambda にデプロイしてみます。
1$ vendor/bin/bref init
すると
1What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [PHP function]:
2 [0] PHP function
3 [1] HTTP application
4 [2] Console application
と聞かれます。
今回は そのまま Enter して関数を作成します。
コマンドを実行すると次のファイルが追加されます。
- index.php
- serverless.yml
追加されたファイル
- index.php
1<?php declare(strict_types=1);
2
3require __DIR__.'/vendor/autoload.php';
4
5lambda(function ($event) {
6 return 'Hello ' . ($event['name'] ?? 'world');
7});
serverless.yml
1service: app
2
3provider:
4 name: aws
5 region: us-east-1
6 runtime: provided
7
8plugins:
9 - ./vendor/bref/bref
10
11functions:
12 function:
13 handler: index.php
14 description: ''
15 layers:
16 - ${bref:layer.php-73}
さっそくデプロイしてみましょう。
デプロイをしてみる
デプロイは次のコマンド一つを実⾏するだけですね。
1$ serverless deploy
するとこんな感じでログが流れます。
1$ serverless deploy
2
3Serverless: Packaging service...
4Serverless: Excluding development dependencies...
5Serverless: Creating Stack...
6Serverless: Checking Stack create progress...
7.....
8Serverless: Stack create finished...
9Serverless: Uploading CloudFormation file to S3...
10Serverless: Uploading artifacts...
11Serverless: Uploading service app.zip file to S3 (5.23 MB)...
12Serverless: Validating template...
13Serverless: Updating Stack...
14Serverless: Checking Stack update progress...
15...............
16Serverless: Stack update finished...
17Service Information
18service: app
19stage: dev
20region: us-east-1
21stack: app-dev
22resources: 5
23api keys:
24 None
25endpoints:
26 None
27functions:
28 function: app-dev-function
29layers:
30 None
31Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
デプロイ成功しました。
かんたんですねー。
Lambda を開くと app-dev-function
という Lambda 関数が生成されています。
命名規則
なお、 命名は次の規則に従っているようです。
1[service]-[stage]-[application kind]
serverless.yml
の service や region あたりはすぐ変更しておくと良さそうですね。
デプロイで生成されるもの
Serverless framework
では AWS の CloudFormation
で関連リソースを管理します。
今回は、次の場所に app-dev-function
が作られました。
- CloudFormation
- Lambda
- S3
Zip 化したファイルのアップロード先が S3 なんですね。
また、 Lambda 関数は自動的に CloudWatch Logs
にロググループを作ってくれます。
ロググループは /aws/lambda/app-dev-function
ですね。
動作確認など、何かあったときはこのログを見ると良いです。
削除する
デプロイしたものを削除して片付ける場合も次のコマンド一つです。
1$ serverless remove
するとこんな感じでログが流れます。
1$ serverless remove
2
3Serverless: Getting all objects in S3 bucket...
4Serverless: Removing objects in S3 bucket...
5Serverless: Removing Stack...
6Serverless: Checking Stack removal progress...
7...
8Serverless: Stack removal finished...
感想
bref を一通り使ってみましたが、つまづくことも少なく、学習コストはそれほど高くないと感じました。
それにしても、コマンド一発でデプロイも削除もできる、というのがすごいですね。
これは本当にかんたんに操作できるな、と実感しました。