🐘

Bref を試す

2022/05/03に公開

Bref は PHP アプリケーションをサーバーレス、ここではすなわち AWS Lambda で動かすツールです。

https://bref.sh/

Lambda は PHP の実行を標準ではサポートしていませんが、Bref がその面倒を見てくれるばかりか、Laravel や Symfony などのフレームワークを利用したウェブアプリケーションの実行まで実現してくれています。

API Gateway と Lamda の組み合わせは、サーバーを1台用意して始めるのと違い、勝手にスケーリングしてくれるウェブアプリケーションを基本無料(アクセス数に応じて従量課金)で公開しておけるのが個人開発では嬉しいところだと思います。Lamda には馴染みがなくても Serverless Framework の支援があれば敷居は下がり、さらに Bref によって PHP だけでなく Laravel まで使えるとなると選択肢に入ってくる場合もあるのではないでしょうか。

ここではまず Bref を使って単純なウェブページを表示するところまでやってみます。

インストール

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

Serverless Framework を利用するため、macOS に node を入れます。最新 LTS が 16.15.0 だったので、nvm を使って用意します。

brew install nvm
cat >> ~/.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"  # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion

ターミナルを開き直して、node をインストールします。

nvm install 16.15.0
nvm use 16.15.0
$ node -v
v16.15.0

次に、serverless コマンドをインストールします

https://www.serverless.com/framework/docs/getting-started

npm install -g serverless
$ serverless -v
Framework Core: 3.16.0
Plugin: 6.2.2
SDK: 4.3.2

AWS アクセスキーの設定

こちらの案内のとおり bref-cli ユーザーを作成して、アクセスキー ID とシークレットアクセスキーを控えます。

https://bref.sh/docs/installation/aws-keys.html

控えたキーを serverless コマンドに入力します。

serverless config credentials --provider aws --key <アクセスキー ID> --secret <シークレットアクセスキー>

テスト用プロジェクトの作成

とにかくまずは Lambda を使ってウェブページを公開するということを試します。

mkdir bref-test
cd bref-test/

composer で bref を入れます。

composer require bref/bref

初期化します。

vendor/bin/bref init

このように聞かれるので、0 と回答します。

 What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [Web application]:
  [0] Web application
  [1] Event-driven function
 > 0

続いて OK と表示されれば OK です。

Creating index.php
Creating serverless.yml


 [OK] Project initialized and ready to test or deploy.

テスト用アプリケーションのデプロイ

早速、サンプルページをインターネットに公開してみます。

$ serverless deploy

Deploying app to stage dev (us-east-1)

⠸ Creating CloudFormation stack (0/2) (35s)

何も設定をしていないため、デフォルトの us-east-1 リージョンに展開されます。
初回は AWS 上に様々なリソースを構築する必要があり少し時間がかかるようですが、2分程度で完了しました。

✔ Service deployed to stack app-dev (128s)

endpoint: ANY - https://5zdjx1ufpl.execute-api.us-east-1.amazonaws.com
functions:
  api: app-dev-api (977 kB)

生成された URL を開くと、index.php の内容が表示されました。

init で生成された index.php ファイルの先頭はこのようになっており、ちゃんと PHP が動作したということがわかります。

<?php

// This is a PHP file example.
// Replace it with your application.

// Below is a welcome page written in HTML.

?>
<!DOCTYPE html>
<html lang="en">

簡単に PHP のウェブアプリケーションを Lambda で動作させて、公開できました。

CloudWatch に Lambda 実行のログが届いています。

START RequestId: be64698b-ef4e-4de3-aa2a-3d62caf963c7 Version: $LATEST
END RequestId: be64698b-ef4e-4de3-aa2a-3d62caf963c7
REPORT RequestId: be64698b-ef4e-4de3-aa2a-3d62caf963c7	Duration: 1.17 ms	Billed Duration: 2 ms	Memory Size: 1024 MB	Max Memory Used: 61 MB	

なお serverless.yml を編集し、以下のように region を ap-northeast-1 に変更して deploy すれば東京リージョンになります。

provider:
    name: aws
    region: ap-northeast-1
    runtime: provided.al2

テスト用アプリケーションの削除

デプロイされたアプリケーションはテスト用なので削除しておきます。ないとは思いますが誰かにアクセスされると、お金がかかってしまうかもしれません

$ serverless remove
Removing app from stage dev (us-east-1)

⠹ Removing CloudFormation stack (18s)

少し待つと完了しました。

✔ Service app has been successfully removed (36s)

先ほどの URL を開いても、エラーメッセージが表示されます。さらにしばらく経つと DNS のレコードも消えて名前解決エラーになるようです。

{"message":"Not Found"}

Discussion