1
votes

Terraform: Erreur lors du lancement de l'instance source: InvalidAMIID.Malformed

En parcourant le didacticiel terraform, je suis tombé sur cette erreur.

provider "aws" {
  profile = "default"
  region = "eu-central-1"
}

resource "aws_instance" "example" {
  ami = "ami-830c94e3"
  instance_type = "t2.micro"
}

Ceci est mon code. Le seul changement que j'ai fait était le changement de région de us-west-2 à eu-central-1

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


0 commentaires

3 Réponses :


1
votes

C'était simple. Apparemment, l' AMI pour Amazon Images de chaque région est différente. J'ai dû copier l' AMI de l'image qui était présente dans ma région. Par exemple, ami-07dfba995513840b5 est l'identifiant de Red Hat Enterprise Linux 8 (HVM), type de volume SSD dans la région eu-central-1 . Accédez à la console AWS, cliquez sur C2, cliquez ensuite sur l'instance de lancement et recherchez l' AMI d'une image qui vous intéresse.


0 commentaires

3
votes

Au lieu de coder en dur les ID AMI, vous devriez aws_ami envisager d'utiliser la source de données aws_ami .

Cela vous permet de spécifier plus facilement le type d'AMI que vous souhaitez et que Terraform utilise automatiquement cette AMI, y compris la possibilité de la mettre à jour automatiquement l'AMI utilisée lorsque de nouvelles AMI correspondant à vos critères sont disponibles. Cela facilitera également la gestion de l'utilisation de la même AMI dans différentes régions, car l'ID AMI est différent pour chaque région dans laquelle il est copié.

La documentation des ressources aws_instance a un bon exemple d'utilisation de la plus récente AMI Ubuntu 20.04 publiée par Canonical dans la région:

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

Si vous exécutez ce qui suit dans différentes régions, il utilisera automatiquement l'AMI Ubuntu 20.04 correcte pour la région. Il recréera également l'instance avec la dernière AMI lorsqu'une nouvelle AMI Ubuntu 20.04 est publiée par Canonical.


1 commentaires

Très intelligent. Merci d'avoir partagé cette astuce!



0
votes

J'ai eu une erreur similaire en essayant de créer une instance Ubuntu 20.04 AWS EC2 à l'aide de Terraform .

Je rencontrais cette erreur lorsque terraform apply commande terraform apply :

Erreur: Erreur lors du lancement de l'instance source: InvalidAMIID.Malformed: ID non valide: "data.aws_ami.ubuntu.id" (attendu "ami -...") code d'état: 400, ID de demande: 9cb0ddbc-1f5e-43e7-bef2-541832aa002e

Mon code ressemble à ceci:

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

Voici comment je l'ai résolu :

Le problème était que j'ai mis data.aws_ami.ubuntu.id entre guillemets, ce qui est une opération d'appel / d'invocation de la fonction de data :

data.aws_ami.ubuntu: Refreshing state... [id=ami-0885b1f6bd170450c]

J'ai dû supprimer les citations de data.aws_ami.ubuntu.id :

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

Donc mon code ressemblait à ceci après:

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

Cette fois, lorsque j'ai exécuté la commande terraform apply , il a imprimé l' ID ami correct pour l'instance ubuntu 20.04 aws ec2 dans ma région spécifiée:

resource "aws_instance" "ec2" {
  ami = "data.aws_ami.ubuntu.id"
  instance_type = "t2.micro"

puis créé la ressource d'instance aws.

Remarque : Le nom spécifié pour la resource qui est ec2 peut avoir n'importe quelle valeur de votre choix. Vous pouvez le nommer web ou le nom de votre choix:

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

C'est tout.

J'espère que ça aide


0 commentaires