はじめに
Laravel初学者の皆さんは、ポートフォリオを作成した時どこにデプロイしていますか?
AWSまで勉強してEC2
にデプロイしている方、Heroku
にデプロイしている方いろいろいるかと思います。
しかし、それぞれ問題点があると思います。
EC2の問題点
EC2は、インスタンスベースの仮想サーバーなので、常に稼働させなければならないため課金が発生する。(無料利用枠が、1年間毎月750時間分与えられるので十分かもしれませんが)
設定がめんどい。
下記の記事がWordPressを構築する記事ですがやることがとても多いです。
CloudFormation
ができるようになればもっと短縮できますがハードルが高いですよね・・
Herokuの問題点
無料枠のDBの選択肢がPostgreSQL
になる。
30分何もアクセスがないとサーバーがスリープモードに入ってしまう。
ということで今回お勧めするのがサーバーレスです。
AWSにおけるサーバーレスとは、「インスタンスベースの仮想サーバー(EC2など)を使わずにアプリケーションを開発するアーキテクチャ」を指します。
一般にシステムの運用には、プログラムを動かすためのサーバーが必要です。
そしてそのサーバーは、常に稼働していなければなりません。
しかし、サーバーレスは言葉の通りサーバーを必要としません。
課金もそのアプリが動いた時のみなのでとても安いです。
無料利用枠には、1か月ごとに100万件のリクエストが含まれます。
もし無料枠を超過しても、100万件リクエストごとに20円ぽっちです。
初学者のお財布に優しいサービスです!
初学者のインフラの入り口としては最適です。
ぜひこの記事でサーバーレスの世界に触れてみてください!
対象読者
・Laravelを勉強中の初学者の方
・LaravelのポートフォリオをHerokuにデプロイしている方
・LaravelのポートフォリオをEC2にデプロイしている方
bref
とは
bref
は、PHPアプリケーションの実行を簡単にすることを目的としています。
bref
は、サーバーレスフレームワークを使用して、サーバーレスアプリケーションを構成およびデプロイします。
事前準備
ここでやることは3つです。
①serverless
コマンドをインストールする
$ npm install -g serverless
②AWSアクセスキーを作成する
1. AWSダッシュボードで、IAMに移動し、新しいユーザーを作成する
2. ユーザー名を設定し、プログラムによるアクセスを有効にする
3. [既存のポリシーを直接アタッチ]をクリックし、AdministratorAccessを検索して選択する
4. ユーザーの作成を完了し、生成されたAWSアクセスキーとシークレットキーをメモする
③次のコマンドを実行して、AWSのキーを設定する
$ serverless config credentials --provider aws --key <key> --secret <secret>
これでサーバーレスフレームワークが使えるようになりました!
Laravelアプリケーションの作成
①Laravelのインストール
$ composer create-project laravel/laravel serverless-laravel --prefer-dist "6.0.*"
②ディレクトリに移動する
$ cd serverless-laravel
③BrefとLaravel-Brefパッケージをインストール
$ composer require bref/bref bref/laravel-bridge --update-with-dependencies
④serverless.ymlを作成
$ php artisan vendor:publish --tag=serverless-config
⑤serverless.ymlを修正する
このままでは警告が出るので一部修正します。
Deprecation warnings:
Support for "package.include" and "package.exclude" will be removed with next major release. Please use "package.patterns" instead
More Info: https://www.serverless.com/framework/docs/deprecations/#NEW_PACKAGE_PATTERNS
Resolution of lambda version hashes was improved with better algorithm, which will be used in next major release.
Switch to it now by setting "provider.lambdaHashingVersion" to "20201221"
More Info: https://www.serverless.com/framework/docs/deprecations/#LAMBDA_HASHING_VERSION_V2
1. "package.include" および "package.exclude"のサポートが切れるよ
"package.include" および "package.exclude"のサポートは、次のメジャーリリースで削除されます。
かわりに "package.patterns" を使用してくださいとあるので修正しましょう。
# サービス名(Lambda関数の関数名が「サービス名-ステージ名-関数名」となる)
service: laravel
provider:
# awsにデプロイする
name: aws
# 東京リージョンにデプロイする
region: ap-northeast-1
# ステージ名
stage: dev
# ランタイムの設定
runtime: provided.al2
package:
# 指定したディレクトリを展開から除外する
- exclude:
+ patterns:
- node_modules/**
- public/storage
- resources/assets/**
- storage/**
- tests/**
functions:
# この関数は、Laravelのウェブサイト/APIを実行する
web:
# HTTPのリクエストが来たときに呼び出されるファイル
handler: public/index.php
# API Gatewayのタイムアウトは29秒
timeout: 28
# php7.4を使用する
layers:
- ${bref:layer.php-74-fpm}
# API Gateway
events:
- httpApi: '*'
# Lambdaでartisanのコマンドを実行することができるようにする
artisan:
handler: artisan
timeout: 120
layers:
- ${bref:layer.php-74}
- ${bref:layer.console}
plugins:
# プラグインの読み込み
- ./vendor/bref/bref
2. ハッシュの解決はもっと良いアルゴリズムで改善されたよ
Lambdaのハッシュの解決は改善され、次のメジャーリリースで使用されます。
provider.lambdaHashingVersion "を "20201221 "に設定することで、このアルゴリズムに切り替えることができます。
# サービス名(Lambda関数の関数名が「サービス名-ステージ名-関数名」となる)
service: laravel
provider:
# awsにデプロイする
name: aws
# 東京リージョンにデプロイする
region: ap-northeast-1
# ステージ名
stage: dev
# ランタイムの設定
runtime: provided.al2
# Lambdaバージョンのハッシュの解決(warningが出るので対応)
+ lambdaHashingVersion: 20201221
package:
# 指定したディレクトリを展開から除外する
patterns:
- node_modules/**
- public/storage
- resources/assets/**
- storage/**
- tests/**
functions:
# この関数は、Laravelのウェブサイト/APIを実行する
web:
# HTTPのリクエストが来たときに呼び出されるファイル
handler: public/index.php
# API Gatewayのタイムアウトは29秒
timeout: 28
# php7.4を使用する
layers:
- ${bref:layer.php-74-fpm}
# API Gateway
events:
- httpApi: '*'
# Lambdaでartisanのコマンドを実行することができるようにする
artisan:
handler: artisan
timeout: 120
layers:
- ${bref:layer.php-74}
- ${bref:layer.console}
plugins:
# プラグインの読み込み
- ./vendor/bref/bref
⑥デプロイする前にキャッシュをクリアする
$ php artisan config:clear
⑦デプロイする
$ serverless deploy
Service Information
service: laravel
stage: dev
region: ap-northeast-1
stack: laravel-dev
resources: 14
api keys:
None
endpoints:
ANY - https://XXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
functions:
web: laravel-dev-web
artisan: laravel-dev-artisan
layers:
None
これで完了です。
エンドポイントが発行されるのでアクセスしましょう!
APIもチェックしてみましょう。
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
+ Route::get('/', function () {
+ return "hello world!";
+ });
APIも正しく動くことが確認できました!
終わりに
ほとんど公式サイトをコピペするだけでLaravelでもサーバーレスができました!
ぜひポートフォリオにサーバーレスを使ってみてください。
ここまで読んでいただきありがとうございました。