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

Terraform: Error launching source instance: 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"
}

很简单。显然,AMI for Amazon Images 每个地区都不一样。我必须复制我所在地区的图像的 AMI。例如 ami-07dfba995513840b5Red Hat Enterprise Linux 8 (HVM) 的 ID,SSD 卷类型 eu-central-1地区。转到 AWS 控制台,从所有服务列表中单击 EC2,然后单击启动实例并找到您感兴趣的图像的 AMI

您应该考虑使用 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 重新创建实例。

我在尝试使用 Terraform.[=25 创建 Ubuntu 20.04 AWS EC2 实例时遇到了类似的错误=]

当我 运行 terraform apply 命令时,我 运行 遇到了这个错误:

Error: Error launching source instance: InvalidAMIID.Malformed: Invalid id: "data.aws_ami.ubuntu.id" (expecting "ami-...") status code: 400, request 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 函数的 call/invocation 操作::

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 打印了正确的 ami id 我指定区域的 aws ec2 实例:

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

然后创建了 aws 实例资源。

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

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

就这些了。

希望对您有所帮助

确保您在创建实例的区域已为您注册。 验证它: EC2 仪表板 -> 服务运行状况 -> 区域

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

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