如何解决 AWS CloudFormation 中的“Failed to receive X resource signal(s) within the specified duration”错误?

2 分钟阅读
0

您将收到以下错误: 针对AWS CloudFormation 中的 Linux Amazon Elastic Compute Cloud(Amazon EC2)实例的“Failed to receive X resource signal(s) within the specified duration”错误。

简短描述

当 CloudFormation 没有收到带有 ResourceSignal CreationPolicy 属性的资源的成功信号时,就会出现此错误。该错误可能发生在 Amazon EC2 实例、自动扩缩组等待条件上。

**注意:**以下解决方案仅适用于您使用 Linux 实例创建的 CloudFormation 堆栈。对于 Windows 实例,请参阅 How do I resolve the error "Failed to receive X resource signal(s) within the specified duration" for EC2 Windows instances in AWS CloudFormation?

解决方法

根据您的用例,使用以下故障排除步骤来解决问题。

注意:要防止堆栈回滚,请在 CloudFormation 控制台中为堆栈故障选项选择保留已成功预置的资源。此选项意味着没有故障回滚,并且在您删除堆栈之前,实例不会终止。

cfn-signal 脚本未安装在 CloudFormation 堆栈的实例上

要确认 cfn-signal 脚本已安装在配置为向堆栈发送信号的实例上,请完成以下步骤:

  1. 使用 SSH 连接到 Linux 实例

  2. 使用以下脚本之一来确认 cfn-signal 脚本已安装。

    要确认 cfn-signal 脚本位于您的目录中,请运行以下命令:

    $ sudo find / -name cfn-signal
    /opt/aws/bin/cfn-signal
    /opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign

    要确认是否安装了包含 cfn-signal 脚本的 CloudFormation 帮助程序脚本包,请运行以下命令:

    $ sudo rpm -q aws-cfn-bootstrap
    aws-cfn-bootstrap-1.4-30.amzn2.noarch

    **重要事项:**前面的命令仅适用于使用 RPM 包管理器的发行版。默认情况下,CloudFormation 帮助程序脚本安装在 Amazon Linux 亚马逊机器映像(AMI)上。要安装帮助程序脚本,请参阅 CloudFormation 帮助程序脚本参考

CloudFormation 模板中有语法错误或值不正确

要查找错误和不正确的值,请完成以下步骤:

  1. 在代码编辑器中,打开堆栈的模板。然后,找到 UserData 属性部分。
  2. 检查语法错误、空格缺失、拼写错误和其他拼写错误。
  3. 确认堆栈、资源和 AWS 区域属性的值正确无误。
    **注意:**检查 UserData 属性中包含的引导脚本。该脚本调用 cfn-signal。检查语法错误或值不正确。

如果您在 cfn-init 命令中发出信号,则在 cfn-init 日志中查找有关该信号的信息。要在 cloud-init cfn-init 日志中搜索错误,请使用 SSH 连接到您的实例。然后,使用关键字“error”或“failure”在以下日志中搜索详细的错误或失败消息:

/var/log/cloud-init-output.log/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log

要解析 /var/log/cfn/var/log/cloud-init 文件中“error”或“failure”字样的所有实例,请运行以下命令:

grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)

**注意:**前面的命令返回文件名、行号和错误消息。

CreationPolicy 属性的超时属性的值太低

timeout属性值由 CreationPolicy 属性定义。在 cfn-signal 脚本向 CloudFormation 资源发送信号之前,确认该值足够高,可以运行任务。

要检查timeout属性值并比较信令和资源故障时间戳,请完成以下步骤:

  1. 在代码编辑器中,打开堆栈的 CloudFormation 模板以查找timeout属性值。
    **注意:**timeout 属性值是 CloudFormation 在信号返回错误之前等待信号的最大时间。

  2. 要估计何时激活 cfn-signal 脚本,请使用 SSH 连接到实例。然后,运行以下命令:

    less /var/log/cfn-init.log

    SUCCESS信号发送到 CloudFormation 资源时,日志文件会显示时间戳。
    示例:

    2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
  3. 打开 CloudFormation 控制台

  4. 选择事件视图。

  5. 选择状态原因。扩展事件行,其状态原因是“Failed to receive X resource signal(s) within the specified duration.”

  6. 将信令时间戳与资源故障时间戳进行比较。
    **注意:**为了成功完成,脚本必须在创建实例或无法创建实例之前发送信号。

cfn-signal 不是从实例发送的

验证 CloudFormation 收到的信号是否来自实例。查看 **/var/log/cfn-wire.log 上提供的 cfn wire 日志。**如果响应不是 200,则您的实例与 CloudFormation 的端点之间可能存在连接问题。

当您从不是您实例的地方发送信号时,使用信号资源 API。例如,您可以使用 AWS Lambda 函数调用 SignalResource API,然后将信号发送到堆栈。如果您遇到错误,请使用 CloudWatch Logs 检查您的 Lambda 日志,以了解信号未发送到堆栈的原因。

AWS 官方
AWS 官方已更新 7 个月前