Terraform: 启动源实例错误:InvalidAMIID.Malformed

18

在阅读terraform教程时,我遇到了这个错误。

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"
}
8个回答

36

这很简单。显然,每个地区的Amazon镜像(AMI)不同。我必须复制我所在地区的镜像AMI。例如,在eu-central-1地区,ami-07dfba995513840b5Red Hat Enterprise Linux 8 (HVM), SSD Volume Type的ID。前往AWS控制台,从所有服务列表中选择EC2,接下来点击启动实例并查找您感兴趣的图像的AMI


13

不应该硬编码AMI ID,而是应该考虑使用aws_ami数据源

这样可以更容易地指定您想要的AMI类型,并使Terraform自动使用该AMI,包括在满足您条件的新的AMI可用时自动更新正在使用的AMI的选项。它还将使在不同区域中使用相同的AMI更加容易,因为AMI ID对于每个复制到的区域都是不同的。

aws_instance资源文档提供了一个很好的示例,演示如何在该区域中使用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。


1
非常聪明。谢谢分享这个技巧! - Lukasz Dynowski
这个文件中的 Terraform 块怎么样?如果没有它,它能正常工作吗?我问这个问题是因为你的文件只有 "data" 和 "resource" 块! - Cristian Guaman
@CristianetooGeova,是什么让你认为它不会起作用?你试过运行它吗? - ydaetskcoR
请注意,如果使用此图像查找功能,并且有更新的实例,则无法在重新创建实例之前部署任何更改(例如增加磁盘)。 - Pieter
如果您不希望重新创建实例,可以在ami参数上使用lifecycle.ignore_changes。这样,您仍然可以以更声明性的方式描述所使用的AMI,并选择在适当时自动升级到新的AMI。 - ydaetskcoR

2

确保您在创建实例时注册了包含该实例的区域。 验证方法: EC2仪表板 -> 服务健康状况 -> 区域

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


1

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


0

使用aws configure命令检查aws凭证,确保secretkey、accesskey和region与您的配置代码匹配。 如果区域不同,请根据ami所在地更改区域。


0

请检查您的亚马逊控制台区域,有时默认选择不同。

根据地区,您的 AMI ID 是不同的。


0

我在使用 Terraform 创建 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函数的调用/执行操作:
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"

就是这样了。

希望这能帮到你


0
你可以像这样获取可用的Amazon EC2镜像列表:
$ aws ec2 describe-images

请注意,它会返回您默认地区的图像!
要获取有关特定图像的详细信息:
$ aws --region eu-central-1 ec2 describe-images --include-deprecated --image-ids ami-002c3687c157a3668 ami-0154a0c4f87fc839d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接