部署 CFN 模板时资源之间的竞争条件?

问题描述

我有一个模板,它设置了一个包含一些 Kinesis 流的堆栈、几个用于从 CloudWatch 订阅和处理事件的 Lambda,等等。

使用 this documentation 作为参考,我将目的地的定义添加到我的模板中:

  LogDestination:
Properties:
  DestinationName:
    Ref: DestinationName
  DestinationPolicy:
    Fn::Sub:
      - |-
        {
            "Version": "2012-10-17","Statement": [
                {
                    "Effect": "Allow","Principal": {
                        "AWS": ["${AWS::AccountId}"]
                    },"Action": "logs:PutSubscriptionFilter","Resource": "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:destination:${DestinationName}"
                }
            ]
        }
      - DestinationName:
          Ref: DestinationName
  RoleArn:
    Fn::GetAtt:
      - KinesisRole
      - Arn
  TargetArn:
    Fn::GetAtt:
      - LogStream
      - Arn
Type: AWS::Logs::Destination

现在,我的问题是: 当我尝试从头开始部署整个模板时,由于目标无效/不存在,它失败并显示状态 400(“无效参数”)。

然而;如果我在没有 LogDestination 的情况下部署堆栈,然后将 LogDestination 作为第二个更改集部署,它会起作用。

那么在 CloudFormation 中是否有可能存在“竞争条件”?如果是这样;我该如何解决

解决方法

在 CloudFormation 中可能存在竞争条件。 DependsOn 可用于在同一堆栈操作中显式订购资源供应(Ref/GetAtt/Sub 也隐式订购资源供应)