基础设施代码是不是应该与应用程序代码存储在同一个存储库中?

Posted

技术标签:

【中文标题】基础设施代码是不是应该与应用程序代码存储在同一个存储库中?【英文标题】:Should the infrastructure code be stored in the same repository as the application code?基础设施代码是否应该与应用程序代码存储在同一个存储库中? 【发布时间】:2019-12-12 00:43:48 【问题描述】:

我正在建立一个支持 WebApp 的基础架构。我的一个存储库拥有所有网络基础设施(VPC、子网、NAT、堡垒等)。 WebApp 有一个 Route 53 + ALB + AutoScalling 组 + EC2 实例。所有这些都在 Cloudformation 模板中编码。我的问题是 WebApp Cloudformation 模板是否应该与应用程序存储在同一个存储库中?有没有关于如何分离基础设施和应用代码的最佳实践?

【问题讨论】:

没有人回答。我也很好奇。 这里也有一个非常相似的问题 - discuss.hashicorp.com/t/… 仅在 9 天前发布。到目前为止 - 没有答案。我冒昧地添加了 terraform 标签,因为您的问题并不是针对任何云提供商的。我的猜测是 terraform 标签会引起更多关注。 我也在寻找其他人对此的一些见解,这是在搜索“我应该将基础设施作为代码放入项目回购”时出现的第一个 SO 问题。如果您遇到类似情况,请为这个问题投票! 【参考方案1】:

这确实是一个见仁见智的问题,但我认为趋势是通过代码保留应用程序/服务所需的一切。话虽如此,您通常会拥有共享的东西(例如 VPC),最终您通常会将它们放在单独的存储库中(取决于您如何组织代码;这些天似乎在推动单一存储库)。

CloudFormation Best Practices 提供了一些关于组织堆栈的好信息,尽管它没有解决您的问题。

【讨论】:

【参考方案2】:

作为一般规则,您应该将基础架构放在应用程序代码旁边。所以,是的,您应该将它放在同一个存储库中。

当然,您可能会遇到一些资源在不同项目之间共享的情况。在这种情况下,我建议您拥有一个单独的存储库,其中仅包含共享的基础设施。我会在这里做的是:

共享基础设施的一个存储库:VPC、公共和私有子网、dns 根区域。 一个包含您的 web 应用程序及其相关基础架构的存储库。

这使您能够同时实施构建工件和应用新基础架构的管道。

【讨论】:

【参考方案3】:

我将提出以下思考:

将 IaC 代码包含在内似乎是一种自然的进展,随着项目的发展,当您遇到以下障碍时您将其拆分:

部署的项目现在涉及多个源项目/存储库 根据谁有权访问存储库来保护/防止意外更改 IaC 代码 干净的提交历史记录对于观察基础架构和部署的变化是可取的

我个人喜欢在做某事时走阻力最小的道路——当它是一个单独的开发人员并且您正在快速制作概念验证原型时,将 TF 文件和 ci-cd 管道全部整合在一起肯定会有优势一个地方。一旦您共享了您的代码库并制定了更严格的标准,那么就该让您的标准成熟起来了。

根据您的经验,如果您知道项目最终会需要它,那么从一开始就包含许多最佳实践(聚合日志记录、SAST/DAST、代码检查和已发布的贡献指南)可能是有意义的。但是,如果您仍然是第一次浏览所有这些概念,那么等到它成为一个痛点可能是有意义的。类似于Technical Debt 与YAGNI。

【讨论】:

以上是关于基础设施代码是不是应该与应用程序代码存储在同一个存储库中?的主要内容,如果未能解决你的问题,请参考以下文章

15个使用频率极高的基础算法题(附完整代码)

数据库基础---存储引擎--表的格式

『Go基础』第7节 变量

软考总结——虚存管理

实验11——指针的基础应用

实验11——指针的基础应用