如何将自定义AMI name写入Packer manifest并解决属性不存在报错
报错根因
你遇到的报错是因为在build块的上下文中,source对象仅支持访问source.name和source.type两个属性,source块内部定义的ami_name属于构建器私有配置,无法直接通过source对象引用。
解决方案
最优方案是通过局部值(local)统一管理AMI名称,避免两处重复写相同逻辑导致的取值不一致问题:
# 新增局部值块,统一管理AMI名称生成逻辑 locals { generated_ami_name = "my-ami-${formatdate("YYYY-MM-DD-hhmmss", timestamp())}" } data "amazon-ami" "ubuntu" { filters = { name = "ubuntu-minimal/images/hvm-ssd/ubuntu-focal-20.04-amd64-minimal-*" root-device-type = "ebs" virtualization-type = "hvm" } most_recent = true region = "us-east-1" } source "amazon-ebs" "ui" { ami_name = local.generated_ami_name instance_type = "t3.small" region = "us-east-1" source_ami = data.amazon-ami.ubuntu.id ssh_pty = true ssh_username = "ubuntu" } build { sources = ["source.amazon-ebs.ui"] post-processor "manifest" { output = "manifest.json" strip_path = true custom_data = { version = local.generated_ami_name } } }
这种写法还能避免两次调用timestamp()生成不同时间戳,导致source里定义的AMI名称和manifest里记录的名称不一致的问题。
补充说明
如果你的需求只是获取最终构建生成的AMI名称,不需要单独把值存入custom_data,manifest后处理器默认生成的JSON文件中已经包含artifact_name字段,该字段的值就是最终创建的AMI的名称,你可以直接从输出的manifest.json中读取该字段使用。
内容的提问来源于stack exchange,提问作者user1584120
相关产品推荐
相关产品推荐

