You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Passport在AWS Lambda(Bref)中无法从Storage加载密钥求助

解决Laravel Passport在AWS Lambda(Bref)上的密钥加载问题

核心问题分析

发布passport.php配置文件后,Laravel会优先读取配置中定义的private_key和public_key值,导致Passport::loadKeysFrom()方法被覆盖失效;而将密钥存入.env通过SSM加载时,因内容长度限制或冷启动耗时引发部署/运行问题。

方案一:直接修改passport.php配置指向storage密钥文件

这是最直接的解决方式,绕过env变量依赖:

  1. 打开config/passport.php,找到private_key和public_key配置项,替换为storage路径:
'private_key' => storage_path('oauth-private.key'),
'public_key' => storage_path('oauth-public.key'),
  1. 确保storage/oauth-private.key和storage/oauth-public.key文件被包含在Lambda部署包中:
    • 检查项目.gitignore,如果排除了storage/oauth-*.key,临时注释该行(或在部署时手动包含)
    • 在serverless.yml的package配置中添加包含规则:
      package:
        include:
          - storage/oauth-private.key
          - storage/oauth-public.key
      
  2. 移除AppServiceProvider.php中多余的Passport::loadKeysFrom()语句,部署即可。

方案二:强制通过代码覆盖配置(保留passport.php默认结构)

如果不想修改passport.php的原始配置,可以在服务提供者中强制覆盖密钥路径:
在AppServiceProvider.php的boot方法中添加:

public function boot()
{
    // 强制使用storage目录的密钥文件
    config([
        'passport.private_key' => storage_path('oauth-private.key'),
        'passport.public_key' => storage_path('oauth-public.key'),
    ]);
    Passport::routes();
    // 其他Passport配置...
}

这种方式会直接覆盖passport.php中的配置值,同样需要确保密钥文件被包含在部署包中。

方案三:优化SSM加载的冷启动问题(若坚持使用SSM存储)

如果必须用AWS SSM存储密钥,可通过以下方式缓解冷启动问题:

  1. 拆分密钥为两个SSM参数:将私钥和公钥分别存入独立的SSM参数,避免单个参数内容超过5000字节
  2. 启用SSM参数缓存:修改bref/secrets-loader的配置,将加载的密钥缓存到Lambda的/tmp目录(同一容器生命周期内可复用)
  3. 配置函数预热:在serverless.yml中添加Bref的warmer配置,定期触发函数保持活跃,减少冷启动概率:
    functions:
      app:
        handler: public/index.php
        runtime: bref/php-82-fpm
        events:
          - httpApi: '*'
          - warmer:
              enabled: true
              schedule: rate(5 minutes)
    

内容的提问来源于stack exchange,提问作者Jean Linux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:03:26