当自定义命名资源需要替换时,CloudFormation 无法更新堆栈

Posted

技术标签:

【中文标题】当自定义命名资源需要替换时,CloudFormation 无法更新堆栈【英文标题】:CloudFormation cannot update a stack when a custom-named resource requires replacing 【发布时间】:2019-11-17 03:12:45 【问题描述】:

我有一个 CloudFormation 模板,用于创建启动配置:

Resources:
# Launch Configuration for the instances in the Atoscaling Group
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      AssociatePublicIpAddress: false
      ImageId: !Ref EC2AMI
      InstanceType: !Ref EC2InstanceType
      KeyName: !Ref EC2Key
      IamInstanceProfile: !ImportValue EC2RoleInstanceProfileARN
      LaunchConfigurationName: jxt-private-asg-launch-config
      SecurityGroups:
        - !ImportValue PrivateSecurityGroupId   

当我尝试更新堆栈时,出现以下错误:

当自定义命名资源时,CloudFormation 无法更新堆栈 需要更换

我通过 TeamCity 运行此脚本,因此用户无法每次都更改启动配置的名称。我该怎么做才能摆脱这个错误?

【问题讨论】:

【参考方案1】:

您可以:

    按照@matsev 的建议做,不要为不需要的资源使用名称(可能是最好的选择)- 名称将根据堆栈名称生成。 在您的资源名称中添加一个变量,例如传入提交 ID 或日期的参数或类似的内容。理想情况下,这将使您的资源名称独一无二。

【讨论】:

【参考方案2】:

一种解决方案是省略LaunchConfigurationName,因为它不是强制性的。

复制自AWS::AutoScaling::LauncConfiguration documentation:

启动配置的名称。此名称在每个区域的每个账户中必须是唯一的。 [...]

更新要求:Replacement

您面临的问题是您进行了更改,需要更换启动配置。通常,CloudFormation 创建一个新资源(以防现有资源无法更新),将任何依赖资源指向新资源,然后删除旧资源。但是,如果资源使用静态名称,则此操作将失败,因为它与文档中提到的唯一名称约束冲突。

【讨论】:

以上是关于当自定义命名资源需要替换时,CloudFormation 无法更新堆栈的主要内容,如果未能解决你的问题,请参考以下文章

当自定义 collectionViewCell 中包含标签时,不会调用 didSelectItemAtIndexPath

Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid

当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?

命名空间

命名空间错误中不存在类型资源

命名空间错误中不存在类型资源