我在使用 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"
就是这样了。
希望这能帮到你
ami
参数上使用lifecycle.ignore_changes
。这样,您仍然可以以更声明性的方式描述所使用的AMI,并选择在适当时自动升级到新的AMI。 - ydaetskcoR