Terraform: sortie module

Oct 30 2020

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

3 BinaryMonster Oct 30 2020 at 09:49

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