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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:25:52