Terraform:启动源实例时出错:InvalidAMIID.Malformed

问题描述

经历terraform tutorial时,我偶然发现了此错误

Error: Error launching source instance: InvalidamIID.NotFound: The image id '[ami-830c94e3]' does not exist
    status code: 400,request id: 4c3e0252-c3a5-471e-8b57-3f6e349628af

这是我的代码。我所做的唯一更改是将区域从us-west-2更改为eu-central-1

provider "aws" {
  profile = "default"
  region = "eu-central-1"
}

resource "aws_instance" "example" {
  ami = "ami-830c94e3"
  instance_type = "t2.micro"
}

解决方法

您应该考虑使用aws_ami data source来代替对AMI ID进行硬编码。

这使您可以更轻松地指定所需的AMI类型,并让Terraform自动使用该AMI,包括在符合您的条件的较新AMI可用时自动更新正在使用的AMI的选项。还将简化在不同区域中使用相同AMI的管理,因为AMI ID复制到的每个区域都不相同。

aws_instance resource documentation很好地说明了使用Canonical在该地区发布的最新Ubuntu 20.04 AMI:

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"

  tags = {
    Name = "HelloWorld"
  }
}

如果在不同的区域中运行以下命令,它将自动在该区域中使用正确的Ubuntu 20.04 AMI。 Canonical发布更新的Ubuntu 20.04 AMI时,它还将使用最新的AMI重新创建实例。

,

这很简单。显然AMI for Amazon每个区域的图像都不同。我必须复制AMI所在区域中存在的图像。例如, ami-07dfba995513840b5 eu-central-1 区域中 Red Hat Enterprise Linux 8(HVM),SSD卷类型的ID。转到AWS控制台,单击C2,再单击启动实例,然后找到您感兴趣的图像的AMI

,

确保为您注册了要在其中创建实例的区域。 验证一下: EC2 仪表板 -> 服务运行状况 -> 区域

区域名称区域 ID us-east-2a use2-az1 us-east-2b use2-az2 us-east-2c use2-az3

,

尝试使用 Terraform 创建 Ubuntu 20.04 AWS EC2实例时,我遇到了类似的错误。

运行terraform apply命令时遇到了此错误:

错误:启动源实例时出错:InvalidAMIID。格式错误:无效的ID:“ data.aws_ami.ubuntu.id”(预期为“ ami -...”) 状态码:400,请求ID:9cb0ddbc-1f5e-43e7-bef2-541832aa002e

我的代码如下:

provider "aws" {
  region = "us-east-1"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "ec2" {
  ami = "data.aws_ami.ubuntu.id"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}

这是我修复的方式

问题是我将data.aws_ami.ubuntu.id放在了引号中,这是data函数的调用/调用操作:

resource "aws_instance" "ec2" {
  ami = "data.aws_ami.ubuntu.id"
  instance_type = "t2.micro"

我必须删除data.aws_ami.ubuntu.id中的引号:

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

所以我的代码此后看起来像这样:

provider "aws" {
  region = "us-east-1"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "ec2" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}

这一次,当我运行terraform apply命令时,它在我指定的区域中为 ubuntu 20.04 aws ec2实例打印了正确的 ami id

data.aws_ami.ubuntu: Refreshing state... [id=ami-0885b1f6bd170450c]

,然后创建aws实例资源。

注意resource的指定名称ec2可以是您选择的任何值。您可以将其命名为web或任何您想要的名称:

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

仅此而已。

我希望这会有所帮助

,

昨晚刚遇到这个问题。确保您的 .tf 文件中的提供商区域与您的 AWS 管理控制台区域相匹配。我的提供商区域是“us-east-1”,但管理控制台中的区域是“us-east-2”。