【问题标题】:Do not terminate EC2 instance if Lifecycle hook timeout is reached如果达到生命周期挂钩超时,请勿终止 EC2 实例
【发布时间】:2019-03-25 05:44:56
【问题描述】:

如果用于终止实例的 lambda 耗尽机制未在 cloudformation 中为生命周期挂钩设置的 HeartbeatTimeout 参数内完成,则需要让 EC2 实例运行。

我有一个 lambda 函数,它会在 cloudformation 中触发缩减警报时耗尽 EC2 实例并终止它。我目前使用 LifeCycle 挂钩来终止我的 cloudformation 中的实例。但是,我知道生命周期挂钩有一个 HeartbeatTimeout 参数,当 lambda 耗尽机制在此期间内未完成时,该参数会终止实例。如果 lambda 无法在 HeartbeatTimeout 内耗尽实例,我不想杀死该实例,因为仍有任务在此运行。我想中止实例终止并让实例在这种情况下运行,有什么办法吗?

这是 cloudformation 中的生命周期钩子

"Terminationhook": {
    "Type": "AWS::AutoScaling::LifecycleHook",
    "Properties": {
      "AutoScalingGroupName": { "Ref": "Cluster" },
      "DefaultResult": "ABANDON",
      "HeartbeatTimeout": "3600",
      "LifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
      "NotificationTargetARN": { "Ref" : "SNSTOPIC"},
      "RoleARN": {
        "Fn::GetAtt": [
          "Role",
          "Arn"
        ]
      }
    },
    "DependsOn": "SNSTOPIC"
  }

如果 lambda 在 3600 秒的 HeartbeatTimeout 内没有耗尽实例,那么我想中止实例终止

【问题讨论】:

    标签: amazon-web-services amazon-ec2 aws-lambda amazon-ecs


    【解决方案1】:

    来自Amazon EC2 Auto Scaling Lifecycle Hooks - Amazon EC2 Auto Scaling

    让实例处于等待状态

    实例可以在有限的时间段内保持等待状态。默认值为一小时(3600 秒)。您可以通过以下方式调整此时间:

    • 在创建生命周期挂钩时设置生命周期挂钩的心跳超时。通过put-lifecycle-hook 命令,使用--heartbeat-timeout 参数。通过PutLifecycleHook 操作,使用HeartbeatTimeout 参数。
    • 如果您在超时期限结束之前完成,请使用complete-lifecycle-action 命令或CompleteLifecycleAction 操作继续到下一个状态。
    • 通过使用record-lifecycle-action-heartbeat 命令或RecordLifecycleActionHeartbeat 操作记录心跳来重新启动超时时间。这会将心跳超时增加创建生命周期挂钩时指定的超时值。例如,如果超时值为 1 小时,而您在 30 分钟后调用此命令,则实例会再保持等待状态 1 小时,或总共 90 分钟。

    您可以让实例保持等待状态的最长时间为 48 小时或心跳超时的 100 倍,以较小者为准。

    底线:如果您需要更多时间,可以通过记录心跳来重新启动超时时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2015-12-19
      • 2019-05-07
      • 2017-01-02
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多