Maison > développement back-end > Golang > Comment créer un schéma de fournisseur de source de données Terraform personnalisé pour une carte de valeurs de carte ?

Comment créer un schéma de fournisseur de source de données Terraform personnalisé pour une carte de valeurs de carte ?

PHPz
Libérer: 2024-02-10 11:03:09
avant
844 Les gens l'ont consulté

如何为地图值的地图创建自定义 terraform 数据源提供程序架构?

L'éditeur php Banana vous présentera aujourd'hui comment créer une architecture de fournisseur de source de données Terraform personnalisée pour une carte de valeurs de carte. Lorsque nous utilisons Terraform pour l'orchestration de l'infrastructure, nous avons souvent besoin d'obtenir des données de systèmes ou de services externes pour une configuration dynamique. Et un fournisseur de sources de données personnalisées peut nous aider à atteindre cet objectif. En créant un schéma de fournisseur de source de données personnalisé, nous pouvons facilement obtenir les données dont nous avons besoin à partir de la carte des valeurs de la carte et les appliquer dans notre configuration Terraform. Ensuite, apprenons comment y parvenir !

Contenu de la question

J'ai une fonction golang qui renvoie un map[string]map[string]string type de rôle

Par exemple :

map[foo:map[name:abc env:dev id:465 project:e-1] boo:map[name:def env:prd id:82 project:e-1] :doo[name:ght env:stg id:353 project:e-3]]
Copier après la connexion

J'ai créé un schéma pour cela comme indiqué ci-dessous...

func datasourceaccounthelper() *schema.resource {
    return &schema.resource{
        read: accounthelperread,

        schema: map[string]*schema.schema{
        
            "roles": {
                type: schema.typemap,
                elem: &schema.schema{
                    type:     schema.typemap,
                    computed: true,
                    elem: &schema.schema{
                        type: schema.typestring,
                    },
                },

                computed: true,
            },

            "id": &schema.schema{
                computed: true,
                type:     schema.typestring,
            },
        },
    }
}
Copier après la connexion

Et la méthode de création pour transmettre la valeur du rôle au schéma

func rolesread(d *schema.resourcedata, m interface{}) error {
    filteredroles := filteraccounts("john") // returns `map[string]map[string]string`



    if err := d.set("account_map", filteredroles); err != nil {
        return err
    }

    //accountmaps := make(map[string]interface{})

    d.setid("-")

    return nil
}
Copier après la connexion

Mais la sortie de Terraform est une carte vide, comment puis-je la réparer, aidez-moi s'il vous plaît :)

outputs:

output = {
  "roles" = tomap(null) /* of map of string */
  "id" = tostring(null)
}
Copier après la connexion

Le résultat attendu est le suivant

Outputs:

output = {
  "roles" = { foo    = {name = "abc" env = "dev" id= 465 project = "e-1"}
              boo    = {name = "efg" env = "prd" id= 82 project = "e-2"}       
            },
  "id" = "-"
}
Copier après la connexion

Solution de contournement

L'ancienne version du SDK Terraform que vous utilisez ne réalise pas ce que vous essayez de faire ici. Les mappages ne peuvent être que de types primitifs : typestringtypeinttypebool.

Pour créer cette structure, vous devez migrer vers le nouveau framework, qui est construit pour le système de types de Terraform moderne, plutôt que (comme c'est le cas avec sdkv2) le système de types de Terraform classique v0.11 et versions antérieures.

Dans le framework du plugin Terraform, la structure équivalente à ce que vous essayez de décrire ici est mapnestedattribute, et ce qui suit décrit la structure d'architecture que vous montrez dans votre question :

schema.mapnestedattribute{
    nestedobject: schema.nestedattributeobject{
        attributes: map[string]schema.attribute{
            "name": schema.stringattribute{
                // ...
            },
            "env": schema.stringattribute{
                // ...
            },
            "id": schema.numberattribute{
                // ...
            },
            "project": schema.stringattribute{
                // ...
            },
        },
    },
}
Copier après la connexion

Cela représente un mappage d'objets avec des propriétés données, donc le type de schéma ci-dessus est équivalent à la contrainte de type suivante, qui peut être utilisée en utilisant la syntaxe de contrainte de type du langage Terraform :

map(
  object({
    name    = string
    env     = string
    id      = number
    project = string
  })
)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal