【问题标题】: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 问题。如果您遇到类似情况,请为这个问题投票!

标签: amazon-web-services terraform amazon-cloudformation infrastructure-as-code


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我将提出以下思考:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多