您将收到以下错误: 针对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 脚本已安装在配置为向堆栈发送信号的实例上,请完成以下步骤:
-
使用 SSH 连接到 Linux 实例。
-
使用以下脚本之一来确认 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 模板中有语法错误或值不正确
要查找错误和不正确的值,请完成以下步骤:
- 在代码编辑器中,打开堆栈的模板。然后,找到 UserData 属性部分。
- 检查语法错误、空格缺失、拼写错误和其他拼写错误。
- 确认堆栈、资源和 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属性值并比较信令和资源故障时间戳,请完成以下步骤:
-
在代码编辑器中,打开堆栈的 CloudFormation 模板以查找timeout属性值。
**注意:**timeout 属性值是 CloudFormation 在信号返回错误之前等待信号的最大时间。
-
要估计何时激活 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
-
打开 CloudFormation 控制台。
-
选择事件视图。
-
选择状态原因。扩展事件行,其状态原因是“Failed to receive X resource signal(s) within the specified duration.”
-
将信令时间戳与资源故障时间戳进行比较。
**注意:**为了成功完成,脚本必须在创建实例或无法创建实例之前发送信号。
cfn-signal 不是从实例发送的
验证 CloudFormation 收到的信号是否来自实例。查看 **/var/log/cfn-wire.log 上提供的 cfn wire 日志。**如果响应不是 200,则您的实例与 CloudFormation 的端点之间可能存在连接问题。
当您从不是您实例的地方发送信号时,使用信号资源 API。例如,您可以使用 AWS Lambda 函数调用 SignalResource API,然后将信号发送到堆栈。如果您遇到错误,请使用 CloudWatch Logs 检查您的 Lambda 日志,以了解信号未发送到堆栈的原因。