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

Terraform问题:Windows实例cloud-init无法从SSM Parameter Store部署文件

问题:Windows EC2实例cloud-config写入文件失效(Linux环境正常)

用户配置Terraform代码从AWS SSM Parameter Store获取证书、私钥及配置文件,通过cloud-init写入Windows EC2实例指定路径。当前PowerShell脚本init.ps1可正常执行,但cloud-config部分无法生效,文件未写入目标路径(该配置在Linux环境下测试正常)。

Terraform配置代码如下:

data "aws_ssm_parameter" "certificate" {
  name = "/project/certificate"
}
    
data "aws_ssm_parameter" "private" {
  name = "/project/private"
}
    
data "aws_ssm_parameter" "config" {
  name = "/project/config"
}
    
data "cloudinit_config" "userdata" {
  gzip          = false
  base64_encode = false
    
  part {
    filename     = "init.ps1"
    content_type = "text/x-shellscript"
    content      = file("${path.module}/scripts/init.ps1")
  }

  part {
    content_type = "text/cloud-config"
    content = yamlencode({
      write_files = [
        {
           content     = data.aws_ssm_parameter.certificate.value
           path        = "C:\\aws-iot-device-client\\certs\\certificate.pem.crt"
           permissions = "0744"
        },
        {
           content     = data.aws_ssm_parameter.private.value
           path        = "C:\\aws-iot-device-client\\certs\\private.pem.key"
           permissions = "0744"
        },
        {
           content     = data.aws_ssm_parameter.config.value
           path        = "C:\\aws-iot-device-client\\aws-iot-device-client.conf"
           permissions = "0744"
        },
      ]
    })
  }
}
    
resource "aws_instance" "win_device_agent_ec2" {
  ami                  = var.ec2_ami
  subnet_id            = var.ec2_network
  key_name             = var.ec2_ssh_key
  instance_type        = var.instance_type
  iam_instance_profile = var.ec2_iam_role
    
  vpc_security_group_ids = [
     var.ec2_sg,
  ]
    
  user_data = data.cloudinit_config.userdata.rendered
    
  tags = {
     Name = var.instance_name
  }
}

排查原因及解决方法

1. 目标路径父目录不存在

cloud-init的write_files模块默认不会自动创建不存在的父目录。如果C:\aws-iot-device-client\certs目录未提前创建,写入操作会直接失败。

  • 解决方法:在init.ps1中添加目录创建逻辑,示例:
    New-Item -Path "C:\aws-iot-device-client\certs" -ItemType Directory -Force
    

2. Linux风格权限格式不兼容Windows

Windows不识别Linux的八进制权限(如0744),cloud-init在Windows环境下解析该字段会出错,导致文件写入流程中断。

  • 解决方法:直接移除permissions字段,或替换为Windows兼容的权限配置,比如指定文件所有者:
    {
      content     = data.aws_ssm_parameter.certificate.value
      path        = "C:/aws-iot-device-client/certs/certificate.pem.crt"
      owner       = "Administrator:Administrators"
    }
    

3. 路径转义问题

YAML中双反斜杠\\会被解析为单个反斜杠,但Windows路径在cloud-init中可直接使用正斜杠/,能避免转义逻辑带来的潜在错误。

  • 解决方法:将路径中的双反斜杠替换为正斜杠,示例:C:/aws-iot-device-client/certs/certificate.pem.crt

4. 查看cloud-init日志定位具体错误

登录Windows实例查看cloud-init日志,可直接获取写入失败的具体原因:

  • 日志路径:C:\ProgramData\cloud-init\log\cloud-init.log
  • 搜索write_files相关条目,查看是否存在路径不存在、权限配置无效等明确报错信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:25:00