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
3 Réponses :
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.
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.
Très intelligent. Merci d'avoir partagé cette astuce!
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