使用 bref 在 AWS Lambda 中安装部署无服务 Laravel 应用(上篇)
本教程将帮你使用 Bref 在 AWS Lambda 中运行 Laravle 应用。
可以在 Github 上查看相关 demo 应用:github.com/brefphp/examples
.
安装
首先,你需要跟着安装教程创建 AWS 账号,并安装必要的工具。
然后,在现有的 Laravel 项目中,安装 Bref 及 Laravel-Bref 包。
composer require bref/bref bref/laravel-bridge --update-with-dependencies
解析来,创建 serverless.yml 配置文件:
php artisan vendor:publish --tag=serverless-config
工作原理
默认情况下,Laravel-Bref 包会自动配置 Laravel 使之可以在 AWS Lambda 运行
如果你想深入一点了解,这个包会完成以下这些操作:
- 启用 stderr 日志驱动,以便发送日志到 CloudWatch (更多日志相关内容查看此处)
- 启用 cookie session 驱动
- 如果你不需要使用 (e.g. API),你必须在 .env 中手动设置 SESSION_DRIVER=array
- 你也可以根据需要,将 seesion 配置为保存到数据库或 Redis 中
- 将缓存目录(cache)移动到
/tmp
(因为在 Lambda 中默认的storage
目录是只读的) - 调整其他一些设置 (查看
BrefServiceProvider
了解更多详情)
部署
我们不想将本地机器上生成的缓存部署到服务器上(因为 AWS Lambda 上的缓存路径是不一样的)。因此在部署前先清理一下缓存:
php artisan config:clear
然后进行部署:
serverless deploy
完成后,部署命令会展示应用的 URL.
生产环境部署
此时,我们已经将本地安装部署到了 Lambda。对于生成环境,我们可能不想部署这些内容:
- 开发依赖,
- 本地
.env
环境文件, - 或其他开发工具。
常见问题
如果你的应用在部署后展示的是空白页,可查看日志。
Trusted proxies
因为 Laravel 是通过 API 网关执行的,主机 Header 被设为 API 网关的主机名。帮助函数如 redirect()
会使用错误的域名。正确的域名可在 header 中的 X-Forwarded-Host
进行设置。
要让 Laravel 使用 X-Forwarded-Host
, 编辑 App\Http\Middleware\TrustProxies
中间件将 $proxies
设为 *
通配符:
class TrustProxies extends Middleware
{
// ...
protected $proxies = '*';
缓存
默认情况下,Bref 桥接会将 Laravel 的 cache 目录移动到 /tmp
中,避免默认 cache 目录只读导致的问题。
/tmp
目录不在 Lambda 实例间共享:这样的工作方式使之不能成为生产环境的理想方案。如果你要积极使用缓存,你应该用 Redis 或 DynamoDB 代替。
使用 DynamoDB
要使用 DynamoDB 作为缓存存储, 修改配置文件 config/cache.php
中的配置项
# config/cache.php
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
+ 'attributes' => [
+ 'key' => 'id',
+ 'expiration' => 'ttl',
+ ]
],
然后,遵照此处文档使用 Serverless 框架部署 DynamoDB 表格
Laravel Artisan
可能你已经注意到了,我们在 serverless.yml
定义了一个叫 “artisan” 的函数。该函数使用了控制台运行时,让我们可以在 AWS Lambda 中运行 Laravel Artisan.
比如,要在 Lambda 中为上述配置运行一个 artisan 命令,可以运行如下命令:
vendor/bin/bref cli bref-demo-laravel-artisan <bref options> -- <your command, your options>
更多内容见下篇:使用 bref 安装部署 无服务 Laravel 应用(下篇)