使用附加卷升级 cloudformation 堆栈中的实例

Upgrading Instances in cloudformation stack with attached volumes

为了便于讨论,我有一个非常简单的 cloudformation 设置,其中包含 1 个附加了卷的 EC2 实例。为了数据保留,卷不是堆栈的一部分,所以即使我销毁并重建整个堆栈,数据也不会被破坏。

我的问题是,当我创建一个新的 ami 作为我的 EC2 实例的基础映像并升级我的堆栈以推出新映像时,我遇到了可以理解的冲突。

EC2升级实例的方式是创建新实例,然后删除旧实例。但是由于 cloudformation 脚本声明卷应该附加到实例,升级过程在创建升级实例时失败,因为卷不可用。

在映像升级之间保留数据的最佳方法是什么?几天来我一直在寻找正确的解决方案,但没有运气。似乎有许多狡猾的解决方案,人们对 rollout/upgrade 过程中的手动任务感到满意。我想通过能够完全自动化基础架构来避免所有人为错误。

您是否考虑过使用集群大小为 1 的 AutoScalingGroup 然后修改 UpdatePolicy?这可能会让您更精细地控制在给定时间播放的实例数量以及它们的更新方式。如果您能够 post 模板的关键部分,也会有所帮助。

另一种选择是使用 bash 或 Python 进行堆栈 creates/updates,其中您以编程方式 attach/detach.

我能想到的唯一其他方法是将 AutoScalingGroup minSize 和 maxSize 设置为零(可以使用 CLI 完成),等待实例停止旋转,然后 运行 更新使用您的新 AMI(并且 min/max 回到 1),这将使它们重新联机。

"ServerGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "AvailabilityZones" : {
      "Fn::If" : [
        "UseAllAvailabilityZones",
        { "Fn::GetAZs": "" },
        {"Ref" : "AvailabilityZones"}

    },
    "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
    "MinSize" : 1,
    "MaxSize" : 1,
    "DesiredCapacity" : 1,
    "LoadBalancerNames" : [ { "Ref" : "PublicElb" }, { "Ref" : "PrivateElb" } ],
    "VPCZoneIdentifier" : { "Ref" : "Subnets" }
  },
  "UpdatePolicy" : {
    "AutoScalingScheduledAction" : {
      "IgnoreUnmodifiedGroupSizeProperties" : "true"
    },
    "AutoScalingRollingUpdate" : {
      "MinInstancesInService" : "0",
      "MaxBatchSize" : "1"
    }
  }
}

我还发现这个项目似乎正在对卷做一些类似的事情。 https://github.com/thefactory/cloudformation-graphite/blob/master/graphite.json