Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-10 11:03:09796parcourir

如何为地图值的地图创建自定义 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]]

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

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
}

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

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

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{
                // ...
            },
        },
    },
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer