Lambda + PHP

AWS の Lambda といえば Python でしたが、 Custom Runtime が拡充され、 2018 年から PHP が選択できるようになりました。

私は PHP 系のプロジェクトが多く、少し複雑なことをするならば PHP で実装したほうが後々メンテナンスがしやすい、ということで Lambda の Custom Runtime で PHP を動かせてみました。

bref

その時に利用したライブラリが PHP 用のサーバレスフレームワーク bref です。

bref
bref
bref
https://bref.sh/

なぜ bref か、というのは尊敬するテックリードがおすすめしていたからですね


bref はデプロイ部分に Serverless framework を使っています。

Serverless framework
https://serverless.com/

bref は、以前 SAM でデプロイしていたようで、バージョンを意識したほうが良い場面がありそうです。

bref のインストール

bref
Installation
https://bref.sh/docs/installation.html

の、公式に従ってインストールを行っていきます。

IAM ユーザの⽤意

はじめにデプロイ用のユーザを作成します。

デプロイで利用する部分なため、 Serverless framework のドキュメントを見ると良いです。

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}

参考

Qiita
ServerlessインストールからLambdaへのデプロイ
https://qiita.com/jumjamjohn/items/abbc060fd2c1c6791ef3

ユーザを作成したら、次の 2 点をメモします。

  • Access key ID
  • Secret access key

Serverless framework のインストール

Serverless frameworknpm からインストールします。

1$ npm install -g serverless

もし npm をインストールしていなければ別途 node.js のインストールを行ってください。


Serverless framework のインストール後に設定を行います。

このとき、先程メモした Access key IDSecret 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 のインストール

brefComposer で追加します。

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...

コマンド一発でデプロイも削除もで、これは本当にヨユーでした。