【问题标题】:Terraform: Error launching source instance: InvalidAMIID.MalformedTerraform:启动源实例时出错:InvalidAMIID.Malformed
【发布时间】:2020-12-17 09:18:31
【问题描述】:

通过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"
}

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    这很简单。显然,每个地区的亚马逊图片的AMI 是不同的。我必须复制我所在地区的图像的AMI。例如 ami-07dfba995513840b5eu-central-1 区域中 Red Hat Enterprise Linux 8 (HVM), SSD Volume Type 的 ID。转到 AWS 控制台,从所有服务列表中单击 EC2,然后单击启动实例并找到您感兴趣的图像的 AMI

    【讨论】:

      【解决方案2】:

      您应该考虑使用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 Block 怎么样,没有它还能工作吗?...我问是因为我的文件文件只有“数据”和“资源”块!
      • @CristianetooGeova 是什么让您认为它不起作用?你试过运行它吗?
      • 请注意,如果使用此图像查找并且有更新的实例,您无法在不重新创建实例的情况下部署任何更改(例如增加磁盘)。
      • 如果您不希望它重新创建您的实例,您可以在 ami 参数上使用 lifecycle.ignore_changes。这样,您仍然可以使用更具声明性的方式来描述您使用的 AMI,并且可以选择在适当的时候将其自动升级到新的 AMI。
      【解决方案3】:

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

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

      错误:启动源实例时出错:InvalidAMIID.Malformed:无效 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"
      

      就是这样。

      我希望这会有所帮助

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2023-04-02
            • 2020-03-10
            • 1970-01-01
            • 2018-01-04
            • 2021-08-30
            • 1970-01-01
            • 1970-01-01
            • 2021-11-15
            • 1970-01-01
            相关资源
            最近更新 更多