1

我有一个 CloudFormation 堆栈(https://gist.github.com/palfrey/7021931上的匿名版本)可以正确创建,但尝试删除它却无法尝试删除 VPCGatewayAttachment,因为它抱怨 VPC 已映射公共地址。但是,如果我首先将弹性 IP 与 VPC 内部的实例解除关联,则它可以正常工作。

堆栈 JSON 中的注意事项:

  • 弹性 IP 和 VPCGatewayAttachment 是作为堆栈创建的一部分创建和关联的。我不会在创建和删除之间进行任何更改。
  • 我正在使用 AWS Powershell 帮助程序来创建和销毁,特别是 New-CFNStack 和 Remove-CFNStack,但是从 AWS 控制台手动删除堆栈具有相同的结果。
  • AWS 控制台中的删除序列表明它正在尝试删除弹性 IP 之前的 VPCGatewayAttachment,但如果我取消关联,它会以正确的顺序执行操作。

我可以通过自己事先解除 Elastic IP 的关联来解决这个问题,但我很困惑为什么它不只是按照正确的顺序做事,因为 CloudFormation 似乎知道删除序列中的其他依赖项。

4

2 回答 2

2

当前(截至 2016 年 4 月)的解决方案是在您的资源中添加一个指向该资源的DependsOn属性。AWS::EC2::EIPAWS::EC2::VPCGatewayAttachment

有关何时需要 DependsOn 属性,请参阅 AWS CloudFormation 文档:

VPC 中的某些资源需要网关(Internet 或 VPN 网关)。如果您的 AWS CloudFormation 模板定义了 VPC、网关和网关附件,则任何需要网关的资源都依赖于网关附件。例如,如果 VPC 和 InternetGateway 资源也在同一模板中声明,则具有公共 IP 地址的 Amazon EC2 实例依赖于 VPC 网关附件。

目前,当以下资源具有关联的公共 IP 地址并位于 VPC 中时,它们依赖于 VPC 网关连接:

  • Auto Scaling 组
  • 亚马逊 EC2 实例
  • Elastic Load Balancing 负载均衡器
  • 弹性 IP 地址
  • Amazon RDS 数据库实例
  • 包含 Internet 网关的 Amazon VPC 路由

在您的示例中,您需要添加"DependsOn": "AttachGateway"WebServerWebServerEIPRoute资源(在上面的引用中加粗),例如,

"WebServerEIP": {
        "Type" : "AWS::EC2::EIP",
        "DependsOn" : "AttachGateway",
        [...]
}
于 2016-04-15T18:07:07.850 回答
1

这是弹性 IP 地址释放顺序中的一个错误,是在 CloudFormation 从单一处理变为并行处理时引入的。

AWS 意识到了这一点,并希望他们能够将其纳入路线图以尽快修复它。同时,有些不可接受的解决方法是再次运行 remove-cfn 堆栈。

(我们实际上有一个助手运行删除,并一直调用删除,直到它最终决定被删除)

于 2013-10-28T02:58:12.653 回答