Terraform: sortie module
Nous avons trois espaces de travail dans app.terraform.io,
- TESTER
- DEV
- PRO
Ces espaces de travail ont des variables.
J'obtiens la valeur de avec ces variables avec ...
variable "environment" {}
Je veux utiliser cette variable pour sélectionner les ressources ou les modules chargés.
resource "aws_directory_service_directory" "ds" {
count = "${var.environment == "TEST" ? 0 : 1}"
name = "example.com"
short_name = "example"
password = "******"
type = "MicrosoftAD"
}
Cela fonctionne mais ...
La sortie habituelle de cette ressource est ...
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds.id
}
output access_url {
description = "The access URL for the directory"
value = aws_directory_service_directory.ds.access_url
}
output dns_ip_addresses {
description = "A list of IP addresses of the DNS servers for the directory or connector"
value = aws_directory_service_directory.ds.dns_ip_addresses
}
output security_group_id {
description = "The ID of the security group created by the directory"
value = aws_directory_service_directory.ds.security_group_id
}
Mais si j'utilise l'attribut count, la sortie échoue avec ...
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
mixture of literal strings and interpolations. This deprecation applies only
to templates that consist entirely of a single interpolation sequence.
Error: Missing resource instance key
on outputs.tf line 51, in output "security_group_id":
51: value = aws_directory_service_directory.ds.security_group_id
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
Quelle serait la bonne sortie?
J'ai essayé:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[0].id
}
et:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[1].id
}
Mais ne fonctionne pas (non plus)
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[0].id
|----------------
| aws_directory_service_directory.ds is empty tuple
The given key does not identify an element in this collection value.
Error: Invalid index
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[1].id
|----------------
| aws_directory_service_directory.ds is tuple with 1 element
The given key does not identify an element in this collection value.
J'ai essayé de voir comment cela se faisait, par exemple https://github.com/terraform-aws-modules/terraform-aws-vpc
output "vpc_id" {
description = "The ID of the VPC"
value = concat(aws_vpc.this.*.id, [""])[0]
}
alors ...
output id {
description = "The ID of the directory"
value = concat(aws_directory_service_directory.*.id, [""])[0]
}
mais ...
Error: Invalid reference
on outputs.tf line 36, in output "id":
36: value = concat(aws_directory_service_directory.*.id, [""])[0]
A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.
Réponses
Eh bien, rien de complexe, c'est juste que la sortie recherche la ressource qui n'est pas créée, car terraform fait toujours référence à cette ressource en raison de laquelle elle génère une erreur.
Bien qu'il existe plusieurs façons de résoudre ce problème, l'une d'entre elles consiste à concaténer toutes les ressources sous forme de liste en une seule étape et à récupérer un seul élément à l'aide des fonctions intégrées de terraform.
Votre sortie doit être quelque chose comme ceci lorsque vous utilisez le nombre comme condition pour créer des ressources. Si la ressource est créée, la sortie sera l'ID de la ressource. Lorsque le compte est égal à zéro, la sortie sera vide sans aucune erreur.
output id {
description = "The ID of the directory"
value = element(concat(aws_directory_service_directory.ds.*.id, list("")), 0)
}