如何防止 AWS OpsWorks 堆栈意外启动或重启正常的实例?

上次更新时间:2019 年 4 月 23 日

AWS OpsWorks 堆栈会重新启动其认为运行状况不佳的实例,即使 Amazon Elastic Compute Cloud (Amazon EC2) 运行状况检查的结果正常。如何防止这种情况出现?

简短描述

自动修复功能会重启堆栈中运行不正常或失败的实例,即使实例的 Amazon EC2 运行状况检查结果正常。堆栈的层设置会默认启用自动修复功能。自动修复期间会发生以下事件:

  • OpsWorks 堆栈代理会大约每隔 30 秒发送 keepalive 数据包。如果服务在 5 分钟后未收到任何 keepalive 数据包,则该服务会将该实例标记为运行状况不佳。如果在 AWS OpsWorks 堆栈 API 启动的实例层启用了自动修复功能,则该 API 会停止并启动实例。
  • 如果实例由 Amazon Elastic Block Store (Amazon EBS) 支持,那么 AWS OpsWorks API 停止和启动底层的 Amazon EC2 实例。如果实例由实例存储支持,则实例停止时将终止底层的 Amazon EC2 实例。然后,OpsWorks 堆栈再次启动实例时会重新创建该实例。有关更多信息,请参阅使用自动修复来更换失败的实例
  • 如果实例在 Amazon EC2 中启动并使用 OpsWorks 堆栈注册,则 AWS OpsWorks API 将会停止并重新启动实例。如果注册的本地实例未能通过 AWS OpsWorks 运行状况检查,则该实例将标记为连接丢失,但不会重新启动。有关更多信息,请参阅管理注册的实例

解决方法

检查 Amazon EC2 StopInstances API 调用的输出,看是否存在自动修复的迹象

1.    打开 AWS CloudTrail 控制台

2.    选择事件历史记录

3.    对于筛选条件,选择事件名称。有关更多信息,请参阅筛选 CloudTrail 事件

4.    在搜索框中,选择 StopInstances

5.    对于筛选条件,选择资源名称

6.    在搜索框中,输入 EC2 实例 ID,然后记下时间戳。

如果 OpsWorks 堆栈停止了该实例,则 Amazon EC2 StopInstances API 将显示以下输出:

"invokedBy": "opsworks.amazonaws.com"

检查 AWS OpsWorks StopInstances API 调用的输出,看是否存在自动修复的迹象

1.    打开 CloudTrail 控制台

2.    选择事件历史记录

3.    对于筛选条件,选择事件名称

4.    在搜索框中,选择 StopInstances

5.    对于筛选条件,选择资源名称

6.    在搜索框中,输入 OpsWorks 实例 ID,然后记下时间戳。

7.    搜索实例在 Amazon EC2 中停止时的 StopInstance API 调用,然后记下时间戳。

注意:如果您无法找到该 API 调用,则说明该实例应用了自动修复。

请记住以下几点:

  • 仅通过 AWS OpsWorks API 配置 OpsWorks 堆栈托管的实例,而不使用 Amazon EC2。
  • 请确保托管实例与 OpsWorks 堆栈服务的状态一致。
    注意:例如,如果实例在 Amazon EC2 中停止,则该实例将被标记为运行状况不佳,因为 OpsWorks 堆栈本来预计会从该实例的代理处收到信号。然后,OpsWorks 堆栈将自动修复该实例(如果已启用该功能),这可能会冻结该实例,因为 OpsWorks 堆栈中的状态与 Amazon EC2 中的状态不匹配。如果发生这种情况,请使用 --force 旗标,以便通过 stop-instance 命令停止实例。

创建 CloudWatch 规则以侦听堆栈中的自动修复事件

1.    (可选)要对实例执行自动修复时接收通知,请设置通知

2.    创建一个名为 OpsWorksAutoHealingNotifierSNS 主题,然后将一个终端节点设置为订阅该主题(例如电子邮件地址或电话号码)。

3.    创建一条 CloudWatch Events 规则,然后将您的 SNS 主题设置为目标。

4.    在您的规则配置中,请使用以下模式来设置侦听自动修复事件的 CloudWatch 规则:

{
  "source": [
    "aws.opsworks"
  ],
  "detail": {
    "initiated_by": [
      "auto-healing"
    ]
  }
}

5.    要保存配置,请选择创建规则

使用实例的日志文件排查问题

1.    对于 Linux 系统,要查看位于 /var/log/aws/opsworks 中的日志文件,请使用 SSH 连接到您的实例。对于 Windows 系统,要查看日志文件 (位于 C:\ProgramDataOpsWorksAgent\var\logs 中),请使用 RDP 连接到您的实例。

2.    以下日志文件的故障排查:
检查 opsworks-agent.keep_alive.log,查看代理向 OpsWorks 发送回 keepalive 信号的成功和失败的尝试。有关更多信息,请参阅在 VPC 中运行堆栈
检查 opsworks-agent.statistics.log ,看系统如何处理 CPU 负载和内存。您可以查看使用了多少内存,以及 CPU 和负载指标是否为高。
检查 opsworks-agent.log,查看有关在实例上运行的代理总体运行状况报告,包括何时停止或启动了代理。
检查 opsworks-agent.process_command.log,看有关代理在实例上做出的成功和失败的命令的报告。

注意:仅当实例上的根设备由 Amazon EBS 支持时才保留这些日志文件。实例存储支持的实例将通过 OpsWorks 中的 StopInstance API 调用终止,这会导致日志丢失。

3.    检查系统级别的日志,以确定执行自动修复时的实例总体运行状况。

注意:如果代理存在因自动修复事件导致的问题,则日志可能会留下系统级别的信息(例如,“内存不足”错误)。

防止 OpsWorks 堆栈自动修复它管理的实例

  • 请确保您的实例可以通过 VPC 路由表中的互联网网关或 NAT 访问互联网。
  • 在实例、安全组和 VPC ACL 级别解锁 443 端口。
    注意:对 VPC 做出更改或创建错误的 VPC,可以导致实例无法通过互联网与 OpsWorks 堆栈通信。
  • 请确保您的应用程序在实例级别拥有足够的资源(如内存和 CPU),从而可以在实例面临额外负载时正常运行。
    注意:预留承受额外负载的能力是一种最佳实践。例如,某个生命周期事件可能会给实例施加意外的负载。
  • 使用 CloudWatch 指标和警报以在实例的 CPU、内存或网络流量负载较高时提醒您。
    如果自动修复功能不适用于您的应用程序,请在层配置中禁用自动修复功能。

这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?