使用Serverless部署AdonisJS到Cloudflare Worker时环境变量缺失报错
解决Serverless部署Cloudflare Worker时缺失认证环境变量的问题
问题重现
执行serverless deploy部署AdonisJS到Cloudflare Worker时,出现以下报错:
Warning: You're relying on provider "cloudflare" defined by a plugin which doesn't provide a validation schema for its config. Please report the issue at its bug tracker linking: https://www.serverless.com/framework/docs/providers/aws/guide/plugins#extending-validation-schema You may turn off this message with "configValidationMode: off" setting × Uncaught exception Environment: win32, node 20.2.0, framework 3.38.0, plugin 7.2.0, SDK 4.5.1 Docs: docs.serverless.com Support: forum.serverless.com Bugs: github.com/serverless/serverless/issues Error: 'Missing mandatory environment variable: CLOUDFLARE_AUTH_KEY.' C:\Vscode local\FsAssignment2\adonis-todo\new-project\node_modules\bluebird\js\release\async.js:49 fn = function () { throw arg; }; ^ Missing mandatory environment variable: CLOUDFLARE_AUTH_EMAIL. (Use `node --trace-uncaught ...` to show where the exception was thrown) Node.js v20.2.0
当前使用的serverless.yaml配置(已移除敏感值):
service: new-project frameworkVersion: '3' provider: name: cloudflare environment: CLOUDFLARE_ACCOUNT_ID: CLOUDFLARE_AUTH_EMAIL: CLOUDFLARE_AUTH_KEY: config: accountId: authEmail: authKey: plugins: - serverless-cloudflare-workers functions: adonis-todo: name: adonis-todo script: ..\cloudflareWorker.js # there must be a file called helloWorld.js events: - http: url: https://simon-floyd-proceed-example.trycloudflare.com/hello/* method: GET headers: foo: bar x-client-data: value
已尝试用set/setx设置环境变量、添加.env文件,但问题未解决。
问题分析
报错核心是Serverless框架的Cloudflare插件无法读取到认证所需的CLOUDFLARE_AUTH_EMAIL和CLOUDFLARE_AUTH_KEY,主要原因可能有以下几点:
serverless.yaml中provider.config下的认证字段为空,且未正确关联环境变量- Windows环境下设置的环境变量未生效
- .env文件未被Serverless框架自动加载
解决方案
1. 修正serverless.yaml配置
Cloudflare插件的认证信息需要在provider.config中配置,而非provider.environment(后者是给Worker运行时用的环境变量)。推荐用环境变量引用的方式避免硬编码敏感信息:
service: new-project frameworkVersion: '3' provider: name: cloudflare # 这里的environment是给Worker运行时用的,不需要放认证信息 environment: # 若Worker需要用到其他环境变量可在此配置 config: accountId: ${env:CLOUDFLARE_ACCOUNT_ID} authEmail: ${env:CLOUDFLARE_AUTH_EMAIL} authKey: ${env:CLOUDFLARE_AUTH_KEY} plugins: - serverless-cloudflare-workers functions: adonis-todo: name: adonis-todo script: ..\cloudflareWorker.js events: - http: url: https://simon-floyd-proceed-example.trycloudflare.com/hello/* method: GET headers: foo: bar x-client-data: value
2. 确保环境变量生效
Windows下设置环境变量的正确方式:
临时生效(仅当前终端):
set CLOUDFLARE_ACCOUNT_ID=你的账号ID set CLOUDFLARE_AUTH_EMAIL=你的Cloudflare邮箱 set CLOUDFLARE_AUTH_KEY=你的Cloudflare全局API密钥设置后直接在当前终端执行
serverless deploy永久生效(需重启终端):
setx CLOUDFLARE_ACCOUNT_ID "你的账号ID" setx CLOUDFLARE_AUTH_EMAIL "你的Cloudflare邮箱" setx CLOUDFLARE_AUTH_KEY "你的Cloudflare全局API密钥"设置后关闭当前终端,重新打开再执行部署命令
3. 用.env文件加载环境变量(可选)
如果想用.env文件管理环境变量,需要安装serverless-dotenv-plugin插件:
- 安装插件:
npm install serverless-dotenv-plugin --save-dev - 在
serverless.yaml的plugins中添加该插件:plugins: - serverless-dotenv-plugin - serverless-cloudflare-workers - 在项目根目录创建
.env文件,填入敏感信息:CLOUDFLARE_ACCOUNT_ID=你的账号ID CLOUDFLARE_AUTH_EMAIL=你的Cloudflare邮箱 CLOUDFLARE_AUTH_KEY=你的Cloudflare全局API密钥 - 执行
serverless deploy即可自动加载.env中的变量
4. 验证环境变量是否正确读取
在部署前可先执行以下命令验证环境变量是否能被Serverless读取:
serverless print
该命令会输出解析后的yaml配置,检查provider.config下的字段是否已正确填充值。
内容的提问来源于stack exchange,提问作者Sriram Ramesh
相关产品推荐
相关产品推荐

