使用 AWS 参数存储的更好方法? 1. 将所有变量保存在单个参数中作为 JSON 2. 将每个变量保存为单独的参数

Better way of using AWS parameter store? 1. Keeping all variables in a single parameter as JSON 2. Keeping every variable as a separate parameter

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

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

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

这里没有正确答案 - 视情况而定。我能分享的是我团队的逻辑。

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

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

3) Jenkins(我们的 CI)也可以从 Jenkins Credentials

注入环境变量

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

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

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