首页 > 解决方案 > 多租户的 AWS CDK 部署

问题描述

根据 CDK“最佳实践”文档,我们应该“在代码中为所有生产阶段建模”。

在 CDK 中,您可以并且应该将该配置直接构建到您的源代码中。为您的生产环境创建一个堆栈,为每个其他阶段创建一个单独的堆栈,并将每个阶段的配置值放在代码中。

我最近被提醒了那个最佳实践,并阅读了更多关于如果你不遵守它会得到的非确定性结果。

对于包含dev,testprod(为简单起见)的环境,这似乎是可行的,并且与 AWS Pipeline 结合听起来像是运行部署(代码驱动的 CI/CD)的好主意。代码中的提交将自动导致重新部署并根据需要更改环境。伟大的。

然而,事情似乎有点复杂的地方prod是真正有100多个不同的租户环境。因此,它们在拥有的资源方面都“看起来”相同,但在它们各自使用的网络子网分配、接入点的虚名等方面存在差异……

如果我们想坚持上面提到的确定性方法,推荐的方法是什么?

还有其他建议吗?我是否错过了重点。?

还是我们应该忽略反模式并在代码中引入更多“查找”和条件行为?

标签: amazon-web-servicesaws-cdk

解决方案


这是一个非常有趣的问题,我也探讨过。

注意:我不是这方面的专业人士,请对下面的所有内容持保留态度。

据我所知,有两种方法。

堆栈集(文档

我相信 StackSets 正是为此目的而设计的,并且据说它们运行良好。

唯一的问题是没有很好的 CDK 支持。CDK repo 中有几个问题在讨论这个问题。

有一个RFC用于获取对 StackSets 的支持。迟早它会进入 CDK,只是在写这篇文章的时候还没有。

多阶段定义

或者,就像使用dev,testprod阶段一样,您可能只有多个prod阶段。

每个 prod 阶段都可能是堆栈类实例化的自己的配置。您可以将任何您想要的配置传递给堆栈,并在堆栈内使用它来配置服务、容量等。

我们现在在少量生产部署中使用这种方法。本质上,我们只有一组堆栈配置,我们在 CodePipeline 中迭代并并行部署阶段。

这是基础架构代码,对吧?让我们充分利用真正的编程语言的优势!

You can also keep this config list externally (e.g. in a database), and then fetch the config, and instantiate the stack classes. E.g. you can fetch the config as the first step in the pipeline and dump it as JSON to disk, then in the stack app.ts read the JSON config and creates an array of stack instances.

Cons: I think there is an arbitrary limit of how many stages you can have per pipeline (or phase?), and it's not very large.


推荐阅读