【问题标题】:How to get environment variables defined in serverless.yml in tests如何在测试中获取 serverless.yml 中定义的环境变量
【发布时间】:2019-04-13 10:28:46
【问题描述】:

我正在使用无服务器框架在 AWS 上运行 lambda 函数。

在我的serverless.yml 中有一些从 SSM 获取的环境变量。

当我为代码编写集成测试时,我需要代码具有环境变量,但我找不到这样做的好方法。

我不想只为测试复制所有变量定义,它们已经在 serverless.yml 中定义。另外,有些是机密,我不能将它们提交到源代码控制,所以我还必须在 ci 环境中重复它们。

尝试使用serverless-jest-plugin,但它不起作用且维护不善。

我对解决方案的想法:

  1. 让测试执行sls invoke - 这会起作用,但意味着代码无法调试,我不知道测试覆盖率,而且速度很慢。
  2. 自己解析 serverless.yml 并导出 env 变量 - 可能,但重写为测试而拉取 SSM 变量的逻辑似乎是错误的。

有什么想法吗?

【问题讨论】:

    标签: node.js integration-testing jestjs serverless-framework


    【解决方案1】:

    我们最终使用的解决方案是一个名为 serverless-export-env 的无服务器插件。

    添加此插件后,您可以运行serverless export-env 将所有已解析的环境变量导出到.env 文件。这可以正确解析 ssm 参数并使我们的集成测试变得更加简单。

    顺便说一句,要从.env 文件中获取环境变量集,请使用dotenv npm 包。

    感谢grishezz 寻找解决方案

    【讨论】:

      【解决方案2】:

      您可以运行带有--require 选项的节点,以将.env 文件注入到无服务器命令中。

      1. 使用package.json 在项目根目录创建.env,并列出.env 中的变量。
      2. yarn add -D serverless dotenv 在项目中安装 serverless 和 dotenv。
      3. 运行类似node -r dotenv/config ./node_modules/.bin/sls invoke的命令。

      然后,您可以在处理程序process.env.XXX中获取环境变量。

      【讨论】:

      • 我的主要目标是获取无服务器知道如何解决的环境变量,而无需明确定义它们。例如,如果我有一个来自 AWS SSM 或 S3 文件或类似文件的配置,无服务器知道如何解决这些问题。我不想在 .env 文件中再次明确定义它们
      【解决方案3】:

      您是要进行模拟单元测试,还是更像集成测试?

      在第一种情况下,您不需要环境变量的实际值。模拟您的数据库,或任何需要设置环境变量的东西。这实际上是更可取的方式,因为通过适当的模拟,测试将运行得非常快。

      如果您确实希望采用端到端/集成的方法,那么您可以使用 sls invoke 之类的方法,但只是使用 javascript 开玩笑。因此,就像对您部署的 api 的常规网络调用一样。

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

      【讨论】:

      • 我正在寻找集成测试的解决方案。更新了问题以澄清。谢谢
      猜你喜欢
      • 2020-01-06
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多