2

我有一个要托管在 AWS 云上的 Web 应用程序。我们正在从 AWS 参数存储中读取所有应用程序配置。但是,我不确定是否应该将所有变量作为 json 格式的单个参数,或者在参数存储中为每个变量设置一个参数。

将单个参数作为 json 字符串的问题是,AWS 参数存储不返回 JSON 对象,而是返回字符串。所以我们必须将字符串绑定到一个涉及反射的模型(这是一个非常繁重的操作)。每个变量都有单独的参数意味着程序中有额外的代码行(这并不昂贵)。

另外,我的应用程序是一个多租户应用程序,它在中间件中有一个租户解析器。因此,每个租户都将存在配置变量。

4

1 回答 1

1

这里没有正确的答案——这取决于。我可以分享的是我团队的逻辑。

1) 应用程序始终构建为读取 env 变量以覆盖默认值
所有配置/秘密在我们的应用程序中都是以这种方式设计的。主要原因是我们不喜欢未加密存储在磁盘上的秘密。是的,即使这样也可以读取环境变量,但风险低于可能备份的磁盘

2) SSM Parameter Store 可以将值输入环境变量
这包括 Lambda、ECS Containers 等。这允许我们存储加密(SSM Secure)、传输加密和注入应用程序。它为您处理 KMS 解密(假设您设置了权限)。

3) Jenkins(我们的 CI)也可以从 Jenkins Credentials 注入环境变量

4) 没有什么能阻止你构建一个支持这两种技术的库
我们的代码读取一个名为 secrets_json 的环境变量,如果它存在并通过验证,它将其中的键/值设置为环境变量。
注意:这也处理了您提到的关于 JSON 是字符串的方面。

结论
这里的关键是我相信您希望拥有灵活并能处理多种不同情况的代码。在所有应用程序设计中将其用作默认设置。我们过去一直使用 1:1 映射,因为最初 SSM 长度是有限的。我们可能仍然会使用它,因为它很灵活并且支持我们的一些 Secrets Manager 尚不支持的特殊轮换策略。

希望我们的经验能让您选择最适合您和您的团队的方式。

于 2020-04-24T21:18:48.617 回答