AWS Cloudformation 堆栈之间的循环依赖是不好的做法吗?

fro*_*roi 5 aws-cloudformation aws-cdk

只是为了澄清,我不关心资源级别的循环依赖。

我说的是 2 个独立的堆栈,比如说堆栈 A 和堆栈 B。随着时间的推移,它们相互之间形成了双向依赖关系。堆栈 A 从堆栈 B 导入资源,反之亦然。而且它们工作得很好。

我担心的是堆栈的可重新部署性方面。就像如果我们决定将其部署到另一个帐户上一样,它们将无法部署,因为它们需要其他堆栈的资源才能工作。

基本上是先有鸡还是先有蛋的问题。

问题是,这种情况应该避免吗?或者这只是一种正常的做事方式?

lyn*_*fox 2

如果您发现自己使用任何 cdk“from”方法(fromAttributes、fromArn 等)将现有资源导入堆栈,则需要仔细查看堆栈。

如果必须链接它们,那么您应该将所有这些堆栈嵌套在它们上方的公共堆栈下 - 并且不要使用 from,而是将它们作为参数传递到堆栈创建中:即:(在 python 中)

my_starting_stack = MyStartingStack(self, "StackID")
my_second_stack = SecondStack(self, "SecondID", special_bucket=my_starting_stack.special_bucket)
Run Code Online (Sandbox Code Playgroud)

只要两个堆栈都是 cdk.NestedStacks (Python,但嵌套堆栈类在所有语言中都可用)并且包含在同一个堆栈中,那么它们将 a) 始终部署在一起,b) 通过传递不会以任何依赖锁结束他们之间构建

如果它们必须能够独立部署 - 理论上,根本不需要另一个存在 - 那么您应该在它们之间添加某种形式的交互层 - REST Api 或 Websocket 或其他东西。

问自己这个问题。如果明天您必须在一个帐户上部署一个堆栈,而在另一个完全不同的帐户中部署另一个堆栈,它们仍然能够工作吗?从你的描述来看,答案是否定的,因此它们耦合得太紧密了。

如果交互层 (api) 感觉有点大材小用,并且它们永远不需要独立部署,那么将它们放在单个公共主堆栈中的 NestedStack 是在堆栈之间共享资源的最佳实践。

请注意,在某些情况下您别无选择。

如果您所在的组织拥有多个 aws 账户,每个产品对应一个账户(通用结构),您可能会有自动添加到该账户的内容 - 例如,当该账户已连接到其他账户中的其他 VPC 时,该 VPC 已连接到其他账户中的其他 VPC。已为您的团队创建帐户。- 在这些情况下你别无选择。您无法控制该 VPC,也无法更改它,而且您肯定不希望每次部署新堆栈时都创建一个新的 VPC。因此,导入此文件时,“from”方法是有效用法。