Java 用于在多个环境之间管理配置文件的方法

Java 用于在多个环境之间管理配置文件的方法,java,amazon-s3,continuous-integration,configuration-management,devops,Java,Amazon S3,Continuous Integration,Configuration Management,Devops,问题 我们使用java WAR文件,并将配置文件保存在s3存储桶中。我们的环境:DEV、QA、Stage和PROD都有自己的配置文件和s3存储桶。如果我添加一个新字段,例如“Polling_RATE=5000”,则必须手动将其添加到每个env中,因为这些配置文件还存储密码,因此它们不能绑定到应用程序或保存在Github中。并非每个工程师都有权访问每个环境,因此您必须记住在产品部署日期之前通知上层工程师(DEVOPS),以便为应用程序添加新字段。目前这是一个非常混乱的过程 问题 是否有一个实用或建

问题

我们使用java WAR文件,并将配置文件保存在s3存储桶中。我们的环境:DEV、QA、Stage和PROD都有自己的配置文件和s3存储桶。如果我添加一个新字段,例如“Polling_RATE=5000”,则必须手动将其添加到每个env中,因为这些配置文件还存储密码,因此它们不能绑定到应用程序或保存在Github中。并非每个工程师都有权访问每个环境,因此您必须记住在产品部署日期之前通知上层工程师(DEVOPS),以便为应用程序添加新字段。目前这是一个非常混乱的过程

问题


是否有一个实用或建筑设计模式来处理这个问题?如何“版本控制”无法存储在github中的敏感配置字段

可识别的问题

通常,具有敏感信息(如密码)的配置字段的更改频率比非敏感配置字段低很多。一种可能的解决方案是将配置分为两部分:

  • 特定于环境但不包含敏感信息的配置。我建议您将这些文件与源代码一起保存,如果可能的话,生成这些文件并在构建时自动上传到您的配置存储(在您的情况下是S3)。它们必须进行版本控制并绑定到应用程序的版本
  • 包含敏感信息的配置。看看这个问题,并不是所有的团队成员都被允许读/写这些信息。您可以使用特定的访问权限将它们存储在S3中,以便只有授权成员才能访问它们。您需要一种机制,以便在部署时将文件重新连接在一起,或者将应用程序更改为从不同的配置文件读取。
    然而,这只能解决部分问题。当敏感配置键更改时,ops人员仍然需要执行更改。这是否可接受取决于敏感配置键更改的频率 S3的另一种选择是运行私有Git存储库(例如AWS)。因为您已经在使用Git,所以您将拥有更好的版本控制,开发人员可以更容易地执行更改。您仍然需要修复dev和ops之间的分离访问权限,或者放弃它(因为DevOps是关于信任和合作的,这可能是个好主意)。您可以在这里应用与我上面描述的类似的模式

    另一个解决方案是将敏感值的配置从属性文件移动到系统配置。当你已经使用了像Puppet或Chef这样的供应系统时,这对ops人员来说是很自然的。或者将所有敏感值(如密码)设置为环境变量,并让应用程序将其作为系统属性读取


    希望这有帮助

    我们一直在使用dynamodb来保存配置值。这种方法的优点是,这些值很容易从控制台读取和验证。 另一个优点是,我们定期检查dynamodb中的值,因此如果需要更改任何值,我们只需更改它,应用程序就会自动选择新值,而不是再次启动它。 敏感值使用KMS密钥加密存储,只有运行应用程序的ec2角色有权使用该密钥解密。
    我们增强了Netflix archiaus项目以满足我们的需求。也许你可以看看

    谢谢。那么这是否意味着您有一个dynamodb实例保存每个env的配置?是的。每个环境1个表。还有一个Jenkins作业,将数据从csv加载到此表中,csv作为git repo的一部分进行维护。我必须手动更新其他3个dynamodb实例,还是这一个jenkins作业涵盖了所有环境?它是代码的一部分,并随代码一起升级。将代码部署到该环境时,也会更新该环境的属性。我们对每个环境都有不同的属性文件,但要进行验证测试,以确保所有环境文件都具有相同的属性集。