amazon-web-services - 多租户的 AWS CDK 部署
问题描述
根据 CDK“最佳实践”文档,我们应该“在代码中为所有生产阶段建模”。
在 CDK 中,您可以并且应该将该配置直接构建到您的源代码中。为您的生产环境创建一个堆栈,为每个其他阶段创建一个单独的堆栈,并将每个阶段的配置值放在代码中。
我最近被提醒了那个最佳实践,并阅读了更多关于如果你不遵守它会得到的非确定性结果。
对于包含dev
,test
和prod
(为简单起见)的环境,这似乎是可行的,并且与 AWS Pipeline 结合听起来像是运行部署(代码驱动的 CI/CD)的好主意。代码中的提交将自动导致重新部署并根据需要更改环境。伟大的。
然而,事情似乎有点复杂的地方prod
是真正有100多个不同的租户环境。因此,它们在拥有的资源方面都“看起来”相同,但在它们各自使用的网络子网分配、接入点的虚名等方面存在差异……
如果我们想坚持上面提到的确定性方法,推荐的方法是什么?
- 我们是否将每个租户部署存储在不同的代码分支中?即每个租户都有自己的 git 分支,如果部署需要更改(例如 Lambda 用于一组特定租户的新 ECR 映像版本),我们只需更新这些分支
cdk.json
。cdk.context.json
- 如果是这种情况,我们如何协调所有部署的部署结构中的常见更改(即 EC2 实例现在需要是“t2.medium”而不是“t2.nano”)?我们只是
git rebase
来自一个共同的祖先吗? - 还是我们需要将每个部署存储在不同的
cdk.json
和cdk.context.json
(即tenant1.cdk.json
,tenant2.cdk.json
等)中?好像比较丑。。。 - 还是在代码中为每个新租户创建一个新堆栈?丑的也...
还有其他建议吗?我是否错过了重点。?
还是我们应该忽略反模式并在代码中引入更多“查找”和条件行为?
解决方案
这是一个非常有趣的问题,我也探讨过。
注意:我不是这方面的专业人士,请对下面的所有内容持保留态度。
据我所知,有两种方法。
堆栈集(文档)
我相信 StackSets 正是为此目的而设计的,并且据说它们运行良好。
唯一的问题是没有很好的 CDK 支持。CDK repo 中有几个问题在讨论这个问题。
有一个RFC用于获取对 StackSets 的支持。迟早它会进入 CDK,只是在写这篇文章的时候还没有。
多阶段定义
或者,就像使用dev
,test
和prod
阶段一样,您可能只有多个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.
推荐阅读
- javascript - 使用主题道具的玩笑/酶测试不起作用
- java - 集合元素映射对于 Map 类型的列的列数错误
- automated-tests - cypress 中的测试是如何组织的
- module - 如何从父文件夹或同级文件夹模块访问模块?
- mysql - 如何在数据存储中存储大量 Python 字典并对其进行过滤/查询?
- windows - 使用 GCC/cmake 生成 DEF 和 .A 文件
- android - 滑动刷新布局下的 RecyclerView 未在嵌套滚动视图中显示
- javascript - 如何在 React 中传递多个键及其 HTML 标签属性
- javascript - Javascript AzureAd 消费休息服务
- point-cloud-library - 当前对 CUDA for PCL 的开发支持