You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lightsail是否支持cloud-config用户数据?Terraform配置cloud-init失败问题排查咨询

问题根源与解决办法

我帮你拆解下当前遇到的问题:

从错误日志和生成的part-001脚本内容来看,核心问题有两个:

  1. cloud-config未被正确识别:Lightsail的user_data默认会被当作shell脚本执行,但你提供的cloud-config内容没有加上cloud-init要求的专属标识头,导致它被直接混入了Lightsail自带的初始化shell代码里,被当成shell命令执行,这才出现了write_files: not found这类错误。
  2. 换行符格式不兼容:错误信息里的^M是Windows风格的CRLF换行符,而Linux系统只认LF换行符,这种格式差异也会导致shell解析时出现异常。

另外你提到EC2用user_data_base64能正常工作,那是因为EC2的cloud-init在处理base64编码的user_data时,会自动识别内容类型,但Lightsail的user_data处理逻辑略有不同,需要我们明确标识内容格式。


具体修复步骤

1. 给cloud-config加上识别头

在你的cloud-init.tpl文件最开头必须加上#cloud-config,这是cloud-init识别配置文件的关键标记,没有这个头,cloud-init会默认把内容当作普通shell脚本处理。修改后的模板内容如下:

#cloud-config
write_files:
- path: /home/ubuntu/config
  permissions: '0644'
  owner: root:root
  encoding: gz+b64
  content: ${nginx_conf_base64_content}

2. 修复换行符问题

确保你的cloud-init.tpl使用Linux风格的LF换行符,如果是在Windows下编辑的,可以用VS Code这类编辑器转换:点击右下角的CRLF按钮,选择LF后保存即可。

3. 优化Terraform的user_data传递(推荐)

虽然Lightsail支持直接传文本格式的user_data,但为了避免编码和换行符的坑,建议像EC2那样用base64编码传递。修改aws_lightsail_instance资源的user_data字段:

resource "aws_lightsail_instance" "instance" {
  name              = "instance"
  availability_zone = "${data.aws_region.current.name}a"
  blueprint_id      = "ubuntu_20_04"
  bundle_id         = "micro_2_0"
  key_pair_name     = aws_lightsail_key_pair.initial_key_pair.name
  # 用base64编码包裹渲染后的模板内容
  user_data         = base64encode(data.template_file.script.rendered)
}

4. 验证cloud-init是否正常工作

AWS Lightsail确实支持cloud-init,尤其是Ubuntu、Amazon Linux这类主流系统的实例,都预装了cloud-init服务。实例启动后,你可以通过以下命令查看日志确认:

cat /var/log/cloud-init-output.log

如果配置正确,你会看到cloud-init执行模块的日志,并且/home/ubuntu/config文件会被正确创建。


额外提醒

  • 确认nginx.conf的路径正确,path.module指向的是你的Terraform模块根目录,避免出现文件找不到的情况。
  • 检查aws_lightsail_key_pair的配置是否正常,确保你能通过SSH登录实例,方便后续调试。

内容的提问来源于stack exchange,提问作者Alexey Subach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:18:16