web-dev-qa-db-fra.com

Se référant aux ressources nommées avec des variables dans Terraform

J'essaie de créer un module dans Terraform qui peut être instancié plusieurs fois avec différentes entrées de variables. Dans le module, comment référencer des ressources lorsque leurs noms dépendent d'une variable d'entrée? J'essaie de le faire via la syntaxe du support ("${aws_ecs_task_definition[var.name].arn}") mais je viens de le deviner.

(Mise en garde: je pourrais y aller complètement de la mauvaise façon)

Voici mon module (simplifié) main.tf fichier:

variable "name" {}

resource "aws_ecs_service" "${var.name}" {
    name = "${var.name}_service"
    cluster = ""
    task_definition = "${aws_ecs_task_definition[var.name].arn}"
    desired_count = 1
}

resource "aws_ecs_task_definition" "${var.name}" {
    family = "ecs-family-${var.name}"
    container_definitions = "${template_file[var.name].rendered}"
}

resource "template_file" "${var.name}_task" {
    template = "${file("task-definition.json")}"

    vars {
        name = "${var.name}"
    }
}

J'obtiens l'erreur suivante:

Error loading Terraform: Error downloading modules: module foo: Error loading .terraform/modules/af13a92c4edda294822b341862422ba5/main.tf: Error reading config for aws_ecs_service[${var.name}]: parse error: syntax error
14
Mike Ottum

Je me trompais fondamentalement sur le fonctionnement des modules.

Terraform ne prend pas en charge l'interpolation dans les noms de ressources (voir pertinentproblèmes ), mais cela n'a pas d'importance dans mon cas, car les ressources de chaque instance d'un module sont dans l'espace de noms de l'instance. J'étais inquiet de la collision de noms de ressources, mais le système de modules gère déjà cela.

22
Mike Ottum

L'image ci-dessous montre ce qui se passe.

La documentation terraform ne rend pas leur utilisation de "NOM" claire par rapport au "nom" valeurs utilisées pour les ressources réelles créées par le fournisseur d'infrastructure (comme AWS ou Google Cloud).

De plus, ce n'est pas toujours "name = , mais parfois, disons " endpoint = ou même "resource_group_name = ou autre chose.

Et il existe plusieurs façons de générer plusieurs valeurs "name" - en utilisant count, variables, etc., ou à l'intérieur de fichiers tfvar et en exécutant terraform apply -var-file = foo.tfvars

terraform resource

2
warrens