Terraform部署AWS EC2实例遇InvalidAMIID.Malformed错误求助
解决Terraform部署EC2实例时的InvalidAMIID.Malformed错误
错误原因
你遇到的问题核心是误用了数据源属性:aws_ami_ids数据源的作用是返回匹配过滤条件的所有AMI ID的列表,它的id属性实际是匹配到的AMI总数,而非具体的AMI ID。报错里的"203304658"就是符合条件的AMI数量,不是AWS要求的ami-xxxxxx格式ID,因此触发InvalidAMIID.Malformed错误。
解决方案
方案一:改用aws_ami数据源(推荐)
aws_ami数据源会直接返回单个符合条件的AMI(默认取最新版本),更适配EC2实例的AMI参数需求:
data "aws_ami" "ubuntu" { owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"] } filter { name = "virtualization-type" values = ["hvm"] } # 确保获取最新的AMI most_recent = true } resource "aws_instance" "myec2" { ami = data.aws_ami.ubuntu.id instance_type = var.instancetype key_name = "devops-era" security_groups = [aws_security_group.allow_http_https.name] tags = { Name = var.aws_common_tag # 去掉引号,正确引用变量 } }
方案二:从aws_ami_ids的ids列表中选取ID
如果坚持使用aws_ami_ids,需要从它的ids列表属性中获取具体的AMI ID,比如取第一个匹配项:
resource "aws_instance" "myec2" { ami = data.aws_ami_ids.ubuntu.ids[0] # 调用ids列表的第一个元素 instance_type = var.instancetype key_name = "devops-era" security_groups = [aws_security_group.allow_http_https.name] tags = { Name = var.aws_common_tag # 修正变量引用,去掉引号 } }
额外注意事项
- 标签配置中
Name = "var.aws_common_tag"是错误写法,你把变量名当成了字符串,必须去掉引号,直接写var.aws_common_tag才能正确引用变量值。 - 确保
aws_security_group.allow_http_https资源已在你的Terraform配置中定义,否则会出现资源未找到的新错误。
内容的提问来源于stack exchange,提问作者Eravic
相关产品推荐
相关产品推荐

