如何在serverless.yml中无需逐个定义即可加载全部dotenv环境变量
解决方案
方案1:使用Serverless Framework原生dotenv支持(无需额外安装插件,符合无额外dotenv插件的要求)
Serverless Framework v2.26.0及以上版本默认内置了dotenv加载能力,会自动识别对应stage的env文件并把所有变量注入到Lambda环境变量中,操作步骤:
- 删除serverless.yml中
environment字段下手动定义的单个变量配置 - 确保你的env文件命名为
.env.{stage}(你当前的.env.staging已经符合要求) - 正常执行
sls deploy --stage staging部署即可,代码中直接调用process.env.ENV_VAR1、process.env.ENV_VAR2都可以正常读取。
如果你的Serverless版本较低,或者需要显式控制env文件的加载逻辑,可以用方案2:
方案2:自定义脚本解析env文件(完全不用内置dotenv也不用插件)
原生${file()}语法仅支持解析yaml、json、js格式文件,无法直接读取shell格式的.env文件,你可以写一个极简的js脚本来解析env文件返回键值对:
- 项目根目录新建
load-env.js文件,内容如下:
const fs = require('fs') module.exports = (serverless) => { const stage = serverless.processedInput.options.stage || 'dev' const envContent = fs.readFileSync(`.env.${stage}`, 'utf8') const envVars = {} envContent.split('\n').forEach(line => { // 跳过注释和空行 if (!line.trim() || line.startsWith('#')) return const [key, ...valueParts] = line.split('=') // 去掉值两端的引号和多余空格 const value = valueParts.join('=').trim().replace(/^['"]|['"]$/g, '') envVars[key.trim()] = value }) return envVars }
- 修改serverless.yml的
environment配置:
functions: server: handler: index.server events: - http: ANY / - http: "ANY /{proxy+}" environment: ${file(./load-env.js)}
- 正常执行
sls deploy --stage staging部署即可,.env.staging中所有变量都会自动注入到Lambda环境变量中。
注意事项
- 不要将.env.*文件提交到代码仓库,记得加入
.gitignore - Lambda环境变量总大小不能超过4KB,如果变量过多超过限制,建议使用AWS Parameter Store或者Secrets Manager存储敏感变量
内容的提问来源于stack exchange,提问作者Jastria Rahmat
相关产品推荐
相关产品推荐

