Laravel 11をAWS Lambdaで動くようにして簡単なAPIを作ってみます。
ちなみに私は割とPHP初心者です。
初心者ですが、これからAPI作成するならPHPが良いと思っています。
PHPが良い理由は、実装できる人が多いと思っていて、いざとなれば他の人(他の会社)に協力を仰ぎやすそうだからです。インターネット上に情報もいっぱいあるというアドバンテージもあると思います。
フレームワークは、PHPの中で一番ポピュラーという理由からLaravel!と考えています。
まずは、作成する環境について記載していきます。
作成する環境の構成
以下の構成で動かしてみます。
- プログラム
- Laravel
- AWSリソース
- API Gateway
- Lambda
実際に、Laravel 11をAWS Lambdaで動かしてみます!!
Laravel 11をAWS Lambdaで動かしてみる
まずはLaravelプロジェクトを作成します。
Laravelプロジェクトの作成
以下のコマンドでLaravelプロジェクトを作成します。
composer create-project laravel/laravel lambda_test
プロジェクト作成ができたら、Laravelバージョンを確認します
cd lambda_test/
php artisan -V
Laravel Framework 11.36.1
上記のようにLaravelバージョンが確認できればOKです。
AWSにデプロイする準備
以下のコマンドでAWSのアクセスキーとシークレットキーを設定します
aws configure
アクセスキーとシークレットキーを設定後は、以下のような簡単なコマンドを使用して(以下はバケットの一覧を表示する例)、設定に成功しているか確認できます。
aws s3 ls
次にserverless frameworkをインストールします。
npm install -g serverless
次にbrefをインストールします。
composer require bref/bref bref/laravel-bridge --update-with-dependencies
次に serverless.yamlを生成します。
php artisan vendor:publish --tag=serverless-config
serverless.yamlのregionを以下の通り変更しておきます。(これで、デプロイ先を東京リージョンに変更しています。)
region: ap-northeast-1
serverless.yamlのruntimeも以下の通り変更しておきます。
web:
runtime: php-84-fpm
artisan:
runtime: php-84-console
修正後のserverless.yamlの全体は以下です。
service: laravel
provider:
name: aws
# The AWS region in which to deploy (us-east-1 is the default)
region: ap-northeast-1
# Environment variables
environment:
APP_ENV: production # Or use ${sls:stage} if you want the environment to match the stage
SESSION_DRIVER: cookie # Change to database if you have set up a database
package:
# Files and directories to exclude from deployment
patterns:
- '!node_modules/**'
- '!public/storage'
- '!resources/assets/**'
- '!storage/**'
- '!tests/**'
- '!database/*.sqlite'
functions:
# This function runs the Laravel website/API
web:
handler: public/index.php
runtime: php-84-fpm
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
runtime: php-84-console
timeout: 720 # in seconds
# Uncomment to also run the scheduler every minute
#events:
# - schedule:
# rate: rate(1 minute)
# input: '"schedule:run"'
plugins:
# We need to include the Bref plugin
- ./vendor/bref/bref
デプロイしてみる
以下のコマンドでデプロイできます
serverless deploy
以下が出てきた場合はLogin/Registerを選択するとWEBブラウザが開くと思うので、ログイン(アカウントを持っていない場合作成)します。
Please login/register or enter your license key: …
❯ Login/Register
Get A License
Enter A License Key
Explain Licensing Basics
デプロイができると以下のようにエンドポイントが表示されます。
endpoint: ANY - ****************
動作確認
エンドポイントにアクセスし、以下のように画面表示されればOKです。
簡単なAPIを作ってみる
以下のコマンドでコントローラを作成
php artisan make:controller ApiProductController
コントローラを以下のとおり実装
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ApiProductController extends Controller
{
public function index()
{
$products = [];
$products['id'] = 1;
$products['name'] = '商品名';
return response()->json($products, 200);
}
}
ルーティング(routes/web.php)ファイルに以下を追加
Route::get('/api', 'App\Http\Controllers\ApiProductController@index');
以下のコマンドでデプロイできます
serverless deploy
「エンドポイント/api」にアクセスして、以下のレスポンスが返って来れば成功です。
{
"id": 1,
"name": "商品名"
}
Laravelで作ったAPIをLambdaで動かす際に使うと良さそうAWSサービスは何か
API Gatewayは不要?
まず、Lambda関数URLがあるので、API GatewayはなくてもAPIの公開は可能で、この方がAPI Gateway分のコスト削減が可能とは思います。
しかし、API Gatewayを使用した方が、リクエストの認証(IAM、Cognito、APIキーなど)などが使える点で有利かと思います。
DBは?
RDSなら、RDS Proxy × Aurora Serverless v2という選択肢があると思います。
RDS Proxyを使うことで、データベースへの接続をプロキシすることで、データベースへの負荷を軽減できますが、8ACU分の料金がかかります。
費用を抑えたい場合、かつ同時接続数が少ない場合は、RDS ProxyなしでもOKかな。Aurora Serverless v2はゼロキャパシティのスケーリングをサポートしています。
ユースケースによっては、Aurora Serverless v2とElastiCacheという組み合わせで、ElastiCacheでRDSの情報をキャッシュしてRDSの負荷を抑えるというのもありかと。
もしくは、DynamoDBという選択肢もあると思いますが、設計の難易度が高い…ですね。
まとめ
DBの選択肢など迷うことも多くありますが、プログラムとしてはLaravel(PHP)がいいと思っています!!