AWSでLaravelのようなWEBフレームワークを使ってアプリをホストする場合、ECSやApp Ruunerを使うことが多いと思うが、これらはアクセスしていない時でもある程度のコストがかかる。
たまにしか使われない社内ツールやPoCの初期段階などではそのコストを避けたいこともあるため、Lambdaでホストすればアクセス時のみのコストで済むし、大半は無料枠に収まる。
LaravelをLambdaで動かす方法を調べるとBref + Serverless Frameworkがよくヒットするが、Serverless Frameworkが有償化されたりしているのでちょっとな・・・ってなっていたところ、AWS公式が出しているLambda Web Adaptorがあったので、これを使ってみる。
Lambda Web Adaptor
詳細は上記を参考にするが、どうやらLambda内でリクエストをWEBフレームワーク用に変換して渡すことで、WEBフレームワーク側に大きな変更を加えずに、そのまま使えるようになるらしい。
使ってみた
使い方は簡単でDockerFileに一行足すだけ。こうすることで、Lambda内でイベントを変換してよしなにやってくれるみたい。
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 /lambda-adapter /opt/extensions/lambda-adapter
注意点としては、Lambdaは単一コンテナで動作するため、ベースイメージにはphp-apacheなど単一コンテナで動作するものを選ぶ必要がある。今回は動作確認だけしたいのでphpのビルトインサーバーを使った。
また、Lambdaは書き込み領域が/tmp配下のみなので、書き込みが必要な場合は別途考慮が必要。
Dockerイメージを作成後、ECRにプッシュして、Lambdaにデプロイする。Lambdaにデプロイ後の動作確認は、簡単のため関数URLを有効化してアクセスする。
URLにアクセスすると、Laravelのウェルカムページが表示され動いていることが分かる。
詳細な手順などは以下のリポジトリのREADMEに記載したので試してみたい方は参照してみてください。
実際に動かすならセッション管理やDB接続の設定も必要だし、Lambdaのスペックの設定なども必要になると思います。
終わり
AWSでごく小規模なコンテナアプリをホストしようとするとどうしても起動しない時間分の金額面が気になるので選択肢としてはかなりアリだと思った。
(GCPのCloud Runだったらわざわざこういうことをしなくても起動しない時間分は0円らしいので、GCPが使えるならそっちでもいいかも。単純な比較はできないけど。)
ただちゃんとしたアプリを動かすなら色々気になる部分はあると思うので、あくまで顧客に直接公開する用途以外で使うものな気はする(Lambda Web AdaptorがというよりはLambdaで動かすというアプローチ自体が)。