编程

使用 bref 在 AWS Lambda 中安装部署无服务 Laravel 应用(上篇)

1532 2022-11-03 10:23:28

本教程将帮你使用 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 应用(下篇)