Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?

Wie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?

PHPz
PHPznach vorne
2024-02-10 11:03:09797Durchsuche

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

Der PHP-Editor Banana stellt Ihnen heute vor, wie Sie eine benutzerdefinierte Terraform-Datenquellenanbieterarchitektur für eine Karte mit Kartenwerten erstellen. Wenn wir Terraform für die Orchestrierung der Infrastruktur verwenden, müssen wir für die dynamische Konfiguration häufig Daten von externen Systemen oder Diensten abrufen. Und ein benutzerdefinierter Datenquellenanbieter kann uns dabei helfen, dieses Ziel zu erreichen. Durch die Erstellung eines benutzerdefinierten Datenquellenanbieterschemas können wir die benötigten Daten einfach aus der Karte der Kartenwerte abrufen und in unserer Terraform-Konfiguration anwenden. Als nächstes lernen wir, wie man es erreicht!

Frageninhalt

Ich habe eine Golang-Funktion, die einen map[string]map[string]stringRollentyp

zurückgibt

Zum Beispiel:

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]]

Ich habe ein Schema dafür erstellt, wie unten gezeigt...

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

Und die Erstellungsmethode zum Übergeben des Rollenwerts an das Schema

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
}

Aber die Terraform-Ausgabe ist eine leere Karte, wie kann ich das beheben, bitte helfen Sie :)

outputs:

output = {
  "roles" = tomap(null) /* of map of string */
  "id" = tostring(null)
}

Die erwartete Ausgabe ist wie folgt

Outputs:

output = {
  "roles" = { foo    = {name = "abc" env = "dev" id= 465 project = "e-1"}
              boo    = {name = "efg" env = "prd" id= 82 project = "e-2"}       
            },
  "id" = "-"
}

Workaround

Die alte Version von Terraform SDK, die Sie verwenden, erreicht nicht das, was Sie hier erreichen möchten. Zuordnungen können nur primitiven Typs sein: typestringtypeinttypebool.

Um diese Struktur zu erstellen, müssen Sie auf das neue Framework migrieren, das für das Typsystem des modernen Terraform erstellt wurde, und nicht (wie es bei SDKv2 der Fall ist) für das Typsystem des klassischen Terraform v0.11 und früher.

Im Terraform-Plugin-Framework ist die äquivalente Struktur zu dem, was Sie hier beschreiben möchten, mapnestedattribute, und im Folgenden wird die Architekturstruktur beschrieben, die Sie in Ihrer Frage zeigen:

schema.mapnestedattribute{
    nestedobject: schema.nestedattributeobject{
        attributes: map[string]schema.attribute{
            "name": schema.stringattribute{
                // ...
            },
            "env": schema.stringattribute{
                // ...
            },
            "id": schema.numberattribute{
                // ...
            },
            "project": schema.stringattribute{
                // ...
            },
        },
    },
}

Dies stellt eine Zuordnung von Objekten mit bestimmten Eigenschaften dar, sodass der obige Schematyp der folgenden Typeinschränkung entspricht, die mithilfe der Typeinschränkungssyntax der Terraform-Sprache verwendet werden kann:

map(
  object({
    name    = string
    env     = string
    id      = number
    project = string
  })
)

Das obige ist der detaillierte Inhalt vonWie erstelle ich ein benutzerdefiniertes Terraform-Datenquellenanbieterschema für eine Karte mit Kartenwerten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen