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-07dfba995513840b5 是 Red 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 实例资源。
注意:resource
即ec2
的指定名称可以是您选择的任何值。您可以将其命名为 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”。
经历 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-07dfba995513840b5 是 Red 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 实例资源。
注意:resource
即ec2
的指定名称可以是您选择的任何值。您可以将其命名为 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”。