在 AWS CloudFormation 中,我使用 AWS::CloudFormation::Init 在 Amazon Elastic Cloud Compute (Amazon EC2) 实例上包含元数据。但是,我在实例上看不到变化。
解决方法
先决条件:将 CloudFormation 堆栈的失败时回滚选项设置为否。
如果将失败时回滚设置为否仍无法在 EC2 实例上包含元数据,请执行以下操作。
**注意:**以下解决方法步骤适用于使用 Linux 实例创建的 CloudFormation 堆栈。
验证 cfn-init 帮助程序脚本是否已安装
要确认您已经配置为向 CloudFormation 资源发送信号的实例上安装了 cfn-init,请完成以下步骤:
- 使用 SSH 连接到实例。
- 验证在您的目录中是否安装 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-bootstrapaws-cfn-bootstrap-1.4-34.24.amzn1.noarch
**注意:**前面的命令仅适用于使用 RPM 包管理器的发行版。
默认情况下,CloudFormation 帮助程序脚本安装在 Amazon Linux 亚马逊机器映像(AMI)上。
验证该实例是否已连接到互联网
如果实例位于 Amazon Virtual Private Cloud (Amazon VPC) 中,则该实例可以通过以下方法连接到互联网:
- 私有子网中的 NAT 设备
- 公有子网中的互联网网关
要测试实例的互联网连接,请打开亚马逊云科技主页等公共网页。然后,在实例上运行 curl 命令。示例:
curl -I https://aws.amazon.com
如果该实例已连接到互联网,则该命令会返回 HTTP 200 状态码。
如果您使用接口 VPC 端点,则该端点必须与实例位于同一 AWS 区域。此外,连接到接口端点的安全组必须允许端口 443 上来自 Amazon VPC 私有子网的传入连接。
在 cloud-init 或 cfn-init 日志中搜索错误
要在 cloud-init 日志或 cfn-init 日志中搜索语法错误或不正确的值,请完成以下步骤:
- 使用 SSH 连接到您的实例。
- 要查找详细的错误消息,请在以下日志中搜索错误或失败关键字:
/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 文件中所有带有错误或失败字样的记录,请运行以下命令:
grep -ni 'error\|failure' $(sudo find /var/log -name cfn-init\* -or -name cloud-init\*)
**注意:**前面的命令返回文件名、行号和错误消息。
- 参考详细的错误消息排除错误,然后更新堆栈。
如果 cfn-init.log 不存在,则 CloudFormation 模板不会运行 cfn-init。
要确认您已将 UserData 属性配置为运行 cfn-init,请完成以下步骤:
- 在代码编辑器中,打开堆栈的 CloudFormation 模板。
- 在 UserData 下,检查语法错误、缺少空格、拼写错误和其他拼写错误等错误。
- 确认堆栈、资源和区域属性的值正确无误。
- 对于 UserData 属性的 Fn::Join 内置函数,使用 -v 在详细模式下运行 cfn-init。有关输出示例,请参见示例。
相关信息
CloudFormation VPC 端点的考虑因素
AWS::CloudFormation::Init
如何解决 AWS CloudFormation 中的“Failed to receive X resource signal(s) within the specified duration”错误?