vapor 是 laravel 官方无服务器部署方案,但需严格配置 iam 权限(含 eb 管理策略)、vapor.yml(runtime 与 handler 精确匹配、s3 存储、rds proxy 数据库)、禁用文件 session/日志,并优化冷启动(删冗余 provider、启用 opcache、避免手动覆盖 httpapi)。

直接说结论:Vapor 是 Laravel 官方无服务器部署方案,但不是“装完就能跑”,关键卡点在 IAM 权限、vapor.yml 配置粒度、以及冷启动/执行时间限制对 Laravel 生命周期的影响。
为什么 vapor deploy 会报 AccessDenied 或 InvalidParameterValueException
这不是密钥写错了,而是 CLI 使用的 IAM 用户权限不足。Vapor 内部依赖 Elastic Beanstalk 的底层能力(比如创建角色、策略绑定),所以仅给 lambda:* 或 apigateway:* 权限远远不够。
- 必须附加
AdministratorAccess-AWSElasticBeanstalk策略(或等效最小权限集) - 必须允许
iam:CreateRole、iam:AttachRolePolicy、iam:PassRole—— Vapor 要自动为 Lambda 创建执行角色 -
aws configure必须用独立 IAM 用户的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,不能用 root 密钥,也不能用 EC2 实例角色 - 确认
vaporCLI 在 PATH 中:export PATH="$PATH:$HOME/.composer/vendor/bin",否则vapor login会失败
vapor.yml 里 runtime 和 handler 怎么配才不踩坑
Laravel 8+ 默认用 php-82 或更高,但 AWS Lambda 的 PHP 运行时实际由 Vapor 自带的 Bref 兼容层提供。handler 不是 public/index.php,而是 Vapor 封装的入口。
- 不要手动改
handler:默认web函数用Bref\LaravelBridge\Http\HttpHandler,这是适配 Lambda HTTP 事件的封装器 - runtime 必须与项目 PHP 版本一致,例如项目用 PHP 8.4,就写
runtime: php-84;写成php84或php_84会报错 - 如果启用了 Octane,handler 改为
Bref\LaravelBridge\Http\OctaneHandler,并加环境变量:BREF_LOOP_MAX: 250(控制单个容器处理请求数) - 别漏掉
build配置:显式指定composer: composer.lock,否则 Vapor 可能用本地 composer install,导致依赖版本不一致
数据库连接、Session、Storage 在 Lambda 上为何“时灵时不灵”
Lambda 是无状态、临时存储只读(/tmp 可写,其余路径只读)、每次调用可能换容器。Laravel 默认行为很多不兼容。
- Session:禁用
file驱动,改用redis或dynamodb;cookie驱动可保留,但需注意加密密钥(APP_KEY)必须在vapor.yml中明确定义 - Storage:所有
public磁盘操作必须走 S3 ——config/filesystems.php中s3磁盘要设为默认,或至少public磁盘指向 S3;local磁盘在 Lambda 上只能用于/tmp临时缓存 - 数据库:RDS Proxy 是必须项,否则连接池在高并发下耗尽;
DB_HOST不能写内网地址(如myapp.xxxxxxx.us-east-1.rds.amazonaws.com),而要用 RDS Proxy 地址(myapp-proxy.xxxxxxx.us-east-1.rds.amazonaws.com) - 日志:禁用
daily或single文件驱动,强制用stderr(Vapor 自动转发到 CloudWatch)
冷启动延迟高、API 响应慢,怎么压到 300ms 内
冷启动本质是容器初始化 + Composer autoloader 加载 + Laravel Bootstrapping。Vapor 本身不解决,得靠配置和代码收敛。
- 删掉非必要 Service Provider:检查
config/app.php的providers数组,移除开发专用包(如 Debugbar、Tinker) - 预热机制有限:Vapor 不支持自定义预热函数,但可配置
keep_warm: true(仅限 Pro 计划),或用外部 cron 每 5 分钟请求一次健康检查端点 - HTTP 函数别干重活:把图片处理、PDF 生成、大文件解析等逻辑拆进异步
queue函数,web函数只做路由分发和轻量响应 - 启用 OPcache:在
vapor.yml中加opcache: true,避免每次请求都重编译 PHP 文件
最常被忽略的一点:Vapor 的 web 函数默认开启 httpApi(比 restApi 更快),但如果你在 vapor.yml 里手动写了 events: - http,反而会降级回旧版 API Gateway,延迟翻倍。











