Bref を試す
Bref は PHP アプリケーションをサーバーレス、ここではすなわち AWS Lambda で動かすツールです。
Lambda は PHP の実行を標準ではサポートしていませんが、Bref がその面倒を見てくれるばかりか、Laravel や Symfony などのフレームワークを利用したウェブアプリケーションの実行まで実現してくれています。
API Gateway と Lamda の組み合わせは、サーバーを1台用意して始めるのと違い、勝手にスケーリングしてくれるウェブアプリケーションを基本無料(アクセス数に応じて従量課金)で公開しておけるのが個人開発では嬉しいところだと思います。Lamda には馴染みがなくても Serverless Framework の支援があれば敷居は下がり、さらに Bref によって PHP だけでなく Laravel まで使えるとなると選択肢に入ってくる場合もあるのではないでしょうか。
ここではまず Bref を使って単純なウェブページを表示するところまでやってみます。
インストール
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 コマンドをインストールします
npm install -g serverless
$ serverless -v
Framework Core: 3.16.0
Plugin: 6.2.2
SDK: 4.3.2
AWS アクセスキーの設定
こちらの案内のとおり bref-cli ユーザーを作成して、アクセスキー ID とシークレットアクセスキーを控えます。
控えたキーを 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