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