如何解决 CloudFormation 中 在 EC2 实例包含元数据的问题?

上次更新日期:2022 年 4 月 12 日

我使用 AWS::CloudFormation::Init 在 Amazon Elastic Cloud Compute (Amazon EC2) 实例上包含元数据,但我看不到实例的变化。

简短描述

AWS CloudFormation 堆栈中的 EC2 实例元数据可能会出现问题,原因如下:

  • CloudFormation 堆栈的一个或多个实例上未安装 cfn-init 帮助程序脚本。要解决此问题,请完成验证是否已安装 cfn-init 帮助程序脚本部分中的步骤。
  • 实例未连接到互联网。要解决此问题,请完成验证实例是否已连接到互联网部分中的步骤。
  • CloudFormation 模板包含语法错误或不正确的值。要解决此问题,请完成在 cloud-init 或 cfn-init 日志中搜索错误部分中的步骤。

重要提示:在完成以下解决方法之前,请将 CloudFormation 堆栈的故障时回滚选项设置为

注意:以下解决方法特定于使用 Linux 实例创建的 CloudFormation 堆栈。

解决方法

验证是否已安装 cfn-init 帮助程序脚本

要确认配置为向 CloudFormation 资源发送信号的实例上是否已安装 cfn-init,请执行以下操作:

1.    使用 SSH 连接到实例

2.    运行以下命令之一,验证目录中是否已安装 cfn-init 或 aws-cfn-bootstrap 软件包。

cfn-init:

$ sudo find / -name cfn-init
/opt/aws/bin/cfn-init
/opt/aws/apitools/cfn-init
/opt/aws/apitools/cfn-init-1.4-34.24.amzn1/bin/cfn-init
/var/lib/cfn-init

-或者-

aws-cfn-bootstrap 软件包:

$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-34.24.amzn1.noarch

重要提示:前述命令仅适用于使用 RPM Package Manager 的分配。

注意:原定设置下,CloudFormation 帮助程序脚本安装在 Amazon Linux Amazon Machine Image (AMI) 上。如果未安装 CloudFormation 帮助程序脚本,请参阅 CloudFormation 帮助程序脚本参考,查看如何安装的说明。

验证实例是否已连接到互联网

如果实例位于 Amazon Virtual Private Cloud (Amazon VPC) 中,则可以通过以下方式连接到互联网:

  • 私有子网中的 NAT 设备
  • 公有子网中的互联网网关

要测试实例的互联网连接,请访问公有网页(如 AWS),然后在实例上运行 curl 命令。例如:

curl -I https://aws.amazon.com

注意:如果实例已连接到互联网,则该命令将返回 HTTP 200 状态代码。

如果使用的是接口 VPC 终端节点,则该端点必须与实例位于同一 AWS 区域。此外,附上接口端点的安全组必须允许从 Amazon VPC 的私有子网在端口 443 上进行传入连接。

在 cloud-init 或 cfn-init 日志中搜索错误

要在 cloud-init 日志或 cfn-init 日志中搜索错误,请执行以下操作:

1.    使用 SSH 连接到您的实例

2.    通过在以下日志中搜索关键词“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/var/log/cloud-init 文件中出现“error”或“failure”一词的所有实例,请运行以下命令:

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

注意:上述命令会返回文件名、行号和错误消息。

查找 cfn-init.log。如果查找不到,则表示 cfn-init 没有运行。您还必须检查 cloud-init-output.logcloud-init.log,查看运行用户数据时是否出现故障。识别错误后,根据错误消息进行修复,然后重新创建堆栈。

如果 cfn-init.log 存在,则表示 cfn-init 已运行,但发生了故障。请检查 cfn-init.log,查看出现了什么问题,然后根据错误消息进行修复。

要确认 UserData 属性已配置为运行 cfn-init,请完成以下步骤:

  1. 在代码编辑器中,打开堆栈的 AWS CloudFormation 模板,然后找到 UserData 属性部分。
  2. 检查错误,包括语法错误、缺少空格、拼写错误和其他排印错误。
  3. 确认堆栈、资源和区域属性值是否正确。
  4. 对于 UserData 属性的 Fn::Join 内置函数,请使用 -v 选项以详细模式运行 cfn-init。请参阅 JSON 和 YAML 示例模板