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
相关产品推荐
相关产品推荐

