如何在不将环境配置存储在代码中的情况下与基础设施即代码相协调

44次阅读
没有评论

问题描述

在开发Web应用程序时,遵循最佳实践通常意味着将配置和敏感数据与源代码分开 – 比如访问密钥、连接字符串等。可以使用像 .env 文件这样的方式为开发、测试和生产环境设置不同的连接字符串。然而,另一个关键点是基础设施即代码,而这似乎与不存储/硬编码敏感数据相冲突。自动化部署新环境时,必须指定一系列环境变量 – 这些变量似乎需要在代码中定义。

如何调和这两个看似相互矛盾的标准实践?

解决方案

在解决这个问题时,有几种方法可以选择。

方案1:使用密钥存储工具

可以使用集中式的密钥存储工具来管理敏感数据,这样每个服务器都可以从中读取。例如,Hashicorp Vault 是一个常用的选择。同时,还有一些键值存储可以提供类似的功能,比如 AWS Parameter Store

在这种方法中,你可以手动将数据存储在这些工具中,或者将其加密后存储在Git中。使用像 kops(仅限AWS)或 ejson(供应商无关)这样的工具,可以将密钥存储在与应用程序相同的代码库中。然后,应用程序可以在部署时获取所有密钥,或者只获取解密密钥以加载加密文件。

方案2:使用Pillars或Hiera

对于基于配置管理的方法,可以使用Pillars(SaltStack)或Hiera(Puppet)来管理数据。这允许你将数据与代码分开存储,并在运行时将这些值填充到代码中。

在SaltStack中,可以使用Pillars来管理数据。Pillar数据将针对每个minion进行独特计算,并仅通过标准SSL加密从服务器直接发送到minion,以确保数据的安全性。

在Puppet中,Hiera可以用于类似的目的。这允许你将代码和元数据分开存储,然后在你的清单中引用Hiera值,从而允许代码在运行时填充这些值。

结论

解决将环境配置与基础设施即代码相协调的问题,可以使用密钥存储工具来保护敏感数据,并使用Pillars或Hiera等配置管理工具来将数据与代码分开管理。这样可以实现敏感数据的安全管理,并确保代码和元数据的分离。

请注意,根据实际情况,你可以选择适合你团队和项目的最佳实践。同时,确保对敏感数据的处理和传输采取适当的安全措施,以保护你的应用程序和基础设施免受风险。

正文完