首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IaC在web/API开发项目中属于哪里?

IaC在web/API开发项目中属于哪里?
EN

Stack Overflow用户
提问于 2022-09-29 00:43:59
回答 1查看 22关注 0票数 0

问题

假设我有一个简单的CRUD web应用程序。该应用程序在本地进行容器化和开发,并在Github上与主/分阶段/开发分支一起设置。CI/CD配置了Github操作。合并到主触发部署到AWS应用程序运行程序。

一般来说,我们这里需要两个主要的AWS服务:云形成、ECR和App。带有AWS的IaC属于哪里?

逼近

  1. 为IaC拥有一个单独的存储库。运行此存储库一次,以设置App服务和专门的ECR存储库。将ECR存储库URI视为应用程序存储库中的环境变量。在合并到应用程序存储库中的main时,Github操作将重建映像并将其推送到ECR回购。App服务检测新映像并根据此文档重新部署。
代码语言:javascript
运行
复制
- Pros: Separation of responsibilities between repositories. One is for infrastructure, One is for application code. CDK only runs once. Deployments are far simpler and easier to diagnose.
- Cons: Significant manual overhead. More work to change infrastructure.
  1. AWS支持根据这个文档声明一个带有本地停靠映像的App服务。只需在应用程序存储库中直接创建AWS项目即可。在合并到main时,它只是简单地用新映像重新运行CDK。
代码语言:javascript
运行
复制
- Pros: One repository. Almost entirely automated with no manual overhead from infrastructure/DevOps team.
- Cons: Developers may have to worry about IaC. Potential compute overhead with constant re-runs of CDK.

实际问题

对于可能依赖多个后端服务的网站/API,哪种方法最适合?在严重依赖微服务的开发文化中,哪一个最适合?还有什么我没想过的方法吗?我问错问题了吗?

我个人更喜欢方法2,因为我讨厌人工开销。我在微型服务方面的经验较少,所以我希望一些拥有更多行业经验的人能提出一些见解。

如果这是一个错误的地方问这个问题,或者如果我需要更具体,请评论下面,我会相应调整。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-29 01:12:06

拥有一个单独的IaC存储库

这么做的最迫切的原因是将IaC的CI/CD与应用程序回购分离开来。例如,如果应用程序代码库没有连续地交付,并且IaC与代码库被提交到相同的repo中,那么您将在这样一个场景中结束: IaC与代码一起进行版本化。如果您部署了一个旧版本或一个分支,那么该版本或分支是否从回购协议中获得与代码本身相同的引用?如果是这样的话,您将不得不跨分支合并IaC更改以使其可部署,这是一个非常令人头痛的问题。

到2022年,大多数开发团队都希望不断地交付他们的代码并“失败前进”,而不是回滚回旧版本。在这个场景中,这并不重要,因为代码的main分支也是基础结构的main分支。但在这种情况下,回滚到旧版本的代码本质上意味着回滚到基础结构的匹配版本,所以如果不仔细研究两个版本之间进行了哪些基础结构更改,以及是否安全地回滚底层更改,您就无法做到这一点。

另一方面,如果IaC回购与代码回购是分开的,则可以使IaC适应多个版本的代码。依赖关系仍然存在--随着代码的变化,应用程序中需要新基础设施的新功能本质上依赖于Infra,而且您没有共享回购以确保在应用程序之前部署这些依赖项。

这通常归结为所有权问题。如果基础设施主要由一个不同的组管理,那么将其放在一个单独的存储库中是很有意义的,因为将基础结构更改与代码更改混合在一起会使这些组很难独立操作。从另一种回购方式推动基础设施改革,本质上是一个孤立的步骤。要从相同的回购中推出基础设施更改,需要将一个PR合并到代码库中并进行部署。如果水下变化是唯一被部署的东西,那是非常直接的。但是,如果代码库的CI分支处于混乱状态,那么基础结构就变得不可部署,因为代码是不可部署的。如果基础设施是由团队拥有的,而团队的任务是保持代码回购干净和可部署,那么将repos拆分并不会有多大好处。

在过去12年左右的时间里,我一直在做DevOps,我非常喜欢将IaC放在一个单独的回购系统中,用于处理混乱的应用程序,这些应用程序的团队难以持续交付。这样,当我想要进行基础设施更改时,我可以相对隔离地考虑它们,并且可以将它们部署到所有环境中,而不管部署在那里的是哪个版本的代码。尝试迁移数据库托管非常糟糕,例如,如果您需要与产品团队合作,将您的IaC放到部署到每个环境中的每个代码版本中。但这不是免费的午餐-当然,我仍然必须确保协调下位代码和代码之间的依赖关系。

服务越小,开发团队处理IaC的次数就越多,开发团队对CICD的处理方法越严格,就越不重要。如果同样的代码被发送到dev/prod,并且代码合并和部署是一件频繁而舒适的事情,那么IaC可能也会出现在应用程序代码库中。但是,您必须做好准备,将其局限于一种失败的、持续集成的方法,并接受基础设施和代码部署是在回购层耦合的。

大多数微服务开发团队倾向于拥有他们自己的IaC,不断地交付他们的应用程序,并将他们的IaC与他们的代码放在同一个回购中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73889132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档