web-dev-qa-db-fra.com

Terraform: comment lire la liste des cartes?

Voir l'exemple ci-dessous:

data "aws_kms_secrets" "api_key" {
  count = "${length(keys(var.keys))}"

  secret {
    name    = "secret_name"
    payload = "${element(values(var.keys), count.index)}"
  }
}

resource "aws_api_gateway_api_key" "access_key" {
  count = "${length(keys(var.keys))}"

  name  = "${var.environment}-${element(keys(var.keys), count.index)}"
  value = "${lookup(element(data.aws_kms_secrets.api_key.*.plaintext, count.index), "secret_name")}"
}

Il semble impossible de rechercher les valeurs en texte brut à partir de la ressource de données.

value = "${lookup(element(data.aws_kms_secrets.api_key.*.plaintext, count.index), "secret_name")}"

Résultats dans lookup: argument 1 should be type map, got type string in:

J'ai essayé de nombreuses combinaisons de element, lookup, * Et la syntaxe du dictionnaire, rien ne fonctionne.

mon var.keys ressemble à:

keys = {
  key-name-one = "sssss"
  key-name-two = "sss"
}
5
Rick Burgess

L'astuce ici est d'utiliser la syntaxe du dictionnaire pour remplacer l'appel d'élément, il se comporte mieux avec les listes de cartes.

value = "${lookup(data.aws_kms_secrets.api_key.*.plaintext[count.index], "secret_name")}"

c'est tentant de faire data.aws_kms_secrets.api_key[count.index].plaintext qui n'est pas valide HCL

3
Rick Burgess

Vous pouvez également accéder à plusieurs secrets sans utiliser count et simplement ajouter plusieurs blocs secret comme ceci:

data "aws_kms_secrets" "example" {
  secret {
    # ... potentially other configration ...
    name    = "master_password"
    payload = "AQEC..."
  }

  secret {
    # ... potentially other configration ...
    name    = "master_username"
    payload = "AQEC..."
  }
}

resource "aws_rds_cluster" "example" {
  # ... other configuration ...
  master_password = "${data.aws_kms_secrets.example.plaintext["master_password"]}"
  master_username = "${data.aws_kms_secrets.example.plaintext["master_username"]}"
}

Cet exemple est donné dans le AWS Provider version 2 upgrade guide comme aws_kms_secret source de données est incompatible avec Terraform 0.12 et est donc remplacé par aws_kms_secrets (notez la pluralisation) à la place.

J'ai mis à jour les documents pour le aws_kms_secrets exemple de source de données pour correspondre à cela également.

Dans Terraform 0.12, ces blocs secrets pourront également être dynamiques , vous devriez donc pouvoir faire quelque chose comme ceci:

data "aws_kms_secrets" "example" {
  dynamic "secret" {
    for_each = var.keys

    content {
      name    = secret.name
      payload = secret.payload
    }
  }
}

resource "aws_api_gateway_api_key" "access_key" {
  count = "${length(var.keys)}"

  name  = "${var.environment}-${element(keys(var.keys), count.index)}"
  value = "${lookup(data.aws_kms_secrets.api_key.plaintext), element(keys(var.keys), count.index)}"
}
1
ydaetskcoR