我正在使用无服务器框架在AWS上运行lambda函数。
在我的serverless.yml
中,有一些从SSM中获取的环境变量。
当我为代码编写集成测试时,我需要代码具有环境变量,而我找不到找到这种方法的好方法。
我不想为测试重复所有的变量定义,它们已经在serverless.yml中定义。另外,有些是机密,我无法将其提交给来源控制,因此我还必须在ci环境中重复这些机密。
尝试使用serverless-jest-plugin
,但是它无法正常工作并且维护得不好。
解决方案的想法:
sls invoke
-可以执行,但是这意味着代码无法调试,我不知道测试范围,而且速度很慢。serverless.yml
并导出env变量-可能,但是重写仅用于测试的提取SSM变量的逻辑似乎是错误的。有什么想法吗?
答案 0 :(得分:1)
我们最终使用的解决方案是一个名为serverless-export-env的无服务器插件。
添加此插件后,您可以运行serverless export-env
将所有已解析的环境变量导出到.env
文件中。这样可以正确解析ssm参数,并为我们简化了集成测试。
顺便说一句,要使用dotenv npm软件包从.env
文件中获取设置的环境变量。
向grishezz致谢以找到解决方法
答案 1 :(得分:0)
您要进行模拟单元测试,还是进行集成测试?
在第一种情况下,环境变量不需要实际值。模拟您的数据库,或者需要设置环境变量的任何东西。实际上,这是更可取的方法,因为使用适当的模拟程序,测试将超级快速地运行。
如果您实际上希望采用端到端/集成的方法,那么您会做类似sls invoke
的事情,但只是出于对Java脚本的兴趣。因此,就像对您已部署的api进行常规网络调用一样。
此外,我建议不要将密钥存储在serverless.yml
中。尝试使用secret: ${env:MY_SECRET}
语法(https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables),然后使用环境变量。如果您有ci / cd构建服务器,则可以在其中存储您的机密。
答案 2 :(得分:0)
您可以使用带有--require
选项的节点将.env
文件注入到无服务器命令中。
.env
在项目根目录下创建package.json
,并在.env
中列出变量。 yarn add -D serverless dotenv
在项目中安装无服务器和dotenv。node -r dotenv/config ./node_modules/.bin/sls invoke
的命令。然后,您可以在处理程序process.env.XXX
中获取环境变量。