这里没有正确的答案——这取决于。我可以分享的是我团队的逻辑。
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 尚不支持的特殊轮换策略。
希望我们的经验能让您选择最适合您和您的团队的方式。