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变量依赖:
- 打开
config/passport.php,找到private_key和public_key配置项,替换为storage路径:
'private_key' => storage_path('oauth-private.key'), 'public_key' => storage_path('oauth-public.key'),
- 确保
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
- 检查项目
- 移除
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存储密钥,可通过以下方式缓解冷启动问题:
- 拆分密钥为两个SSM参数:将私钥和公钥分别存入独立的SSM参数,避免单个参数内容超过5000字节
- 启用SSM参数缓存:修改
bref/secrets-loader的配置,将加载的密钥缓存到Lambda的/tmp目录(同一容器生命周期内可复用) - 配置函数预热:在
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
相关产品推荐
相关产品推荐

