如何在测试中获取serverless.yml定义的环境变量

14
我正在使用Serverless框架在AWS上运行Lambda函数。
在我的serverless.yml中,有一些从SSM获取的环境变量。
当我为代码编写集成测试时,我需要代码具有这些环境变量,但我找不到一个好方法来实现这一点。
我不想为测试重复所有变量定义,它们已经在serverless.yml中定义。此外,一些是机密信息,我不能将它们提交到源控件,所以我也必须在ci环境中重复它们。
尝试使用serverless-jest-plugin,但它不能正常工作并且没有得到很好的维护。
我想出的解决方案:
1. 让测试执行`sls invoke`-这将起作用,但意味着代码无法调试,我将不知道测试覆盖率,并且它会很慢。
2. 自己解析serverless.yml并导出env变量-可能性是存在的,但为了测试重写拉取SSM变量的逻辑似乎有些不对。
还有其他的想法吗?
4个回答

10
我们最终采用的解决方案是一个名为 serverless-export-env 的无服务器插件。
添加此插件后,您可以运行 serverless export-env 将所有已解析的环境变量导出到 .env 文件中。这将正确解析 ssm 参数,并使我们的集成测试更加简单。
顺便提一下,要获取从 .env 文件设置的环境变量,请使用 dotenv npm 包。
感谢 grishezz 发现了这个解决方案。

2
你可以使用--require选项在serverless命令中注入.env文件来运行node。
步骤如下:
  1. 在与package.json同级的项目根目录下创建.env文件,并在其中列出变量。
  2. 通过yarn add -D serverless dotenv在项目中安装serverless和dotenv。
  3. 运行类似于node -r dotenv/config ./node_modules/.bin/sls invoke的命令。
然后,您可以在处理程序中获取环境变量process.env.XXX。"Original Answer"翻译成"最初的回答"。

1
我的主要目标是获取服务器无需显式定义即可解析的环境变量。例如,如果我有一个来自AWS SSM或S3文件等配置,serverless知道如何解析这些配置。我不想在.env文件中再次显式定义它们。 - brafdlog

0

在搜索后,我使用了自定义解决方案

import * as data from './secrets.[stage].json'

if( process.env.NODE_ENV === 'test'){
  process.env = Object.assign( data, process.env );
}
//'data' is the object that has the Serverless environment variables 

在我的情况下,SLS环境变量在文件secrets.[stage].json中。

Serverless.yml有。

custom:
 secrets: ${file(secrets.[stage].json)}

0

你是想进行模拟的单元测试,还是更像集成测试的方法?

如果是前者,你不需要真实的环境变量值。模拟你的数据库或需要设置环境变量的内容。这实际上是首选方式,因为使用适当的模拟,测试会运行得非常快。

如果你真的想采用端到端/集成测试的方法,那么你可以像使用JavaScript一样从jest中执行sls invoke。所以,就像对已部署 API 的普通网络调用一样。

此外,我建议不要将密钥存储在serverless.yml中。请尝试使用secret: ${env:MY_SECRET}语法(https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables),并使用环境变量代替。如果你有一个CI/CD构建服务器,你可以在那里存储你的密钥。


我正在寻找一种集成测试的解决方案。已更新问题以澄清。谢谢。 - brafdlog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接