如何解决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”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。