跳至内容

如何解决 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 实例、自动扩缩组AWS::CloudFormation::WaitCondition 上。

**注意:**以下解决方法仅适用于您使用 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 控制台中为 Stack failure options(堆栈故障选项)选择 Preserve successfully provisioned resources(保留已成功预置的资源)。此选项意味着没有故障回滚,并且在您删除堆栈之前,实例不会停止。

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-bootstrapaws-cfn-bootstrap-1.4-30.amzn2.noarch
    **重要事项:**上述命令仅适用于使用 RPM Package Manager (RPM) 的发行版。有关 RPM Package Manager 的详细信息,请参阅 Red Hat 网站上的 Chapter 1.Introduction to RPM。默认情况下,CloudFormation 帮助程序脚本安装在 Amazon Linux 亚马逊机器映像 (AMI) 上。要安装帮助程序脚本,请参阅 CloudFormation 帮助程序脚本参考

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

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

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

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

/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 文件中 errorfailure 字样的所有实例,请运行以下命令:

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

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

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

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

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

  1. 在代码编辑器中,打开堆栈的 CloudFormation 模板以查找 timeout 属性值。
    **注意:**timeout 属性值是 CloudFormation 在信号返回错误之前等待信号的最大时间。
  2. 要估计何时激活 cfn-signal 脚本,请使用 SSH 连接到实例。然后,运行以下命令:
    less /var/log/cfn-init.log
    SUCCESS 信号发送到 CloudFormation 资源时,日志文件会显示时间戳。
  3. 打开 CloudFormation 控制台
  4. 选择 Events(事件)视图。
  5. 选择 Status reason(状态原因)。展开状态原因为“Failed to receive X resource signal(s) within the specified duration”(未能在指定持续时间内接收 X 个资源信号)的事件行。
  6. 将信号时间戳与资源故障时间戳进行比较。
    **注意:**为了成功完成,脚本必须在创建实例或无法创建实例之前发送信号。

cfn-signal 不是从实例发送的

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

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

AWS 官方已更新 10 个月前
没有评论