Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mencipta skema penyedia sumber data rupa bumi tersuai untuk peta nilai peta?

Bagaimana untuk mencipta skema penyedia sumber data rupa bumi tersuai untuk peta nilai peta?

PHPz
PHPzke hadapan
2024-02-10 11:03:09795semak imbas

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

editor php Banana akan memperkenalkan anda hari ini cara mencipta seni bina pembekal sumber data rupa bumi tersuai untuk peta nilai peta. Apabila menggunakan Terraform untuk orkestrasi infrastruktur, kita selalunya perlu mendapatkan data daripada sistem atau perkhidmatan luaran untuk konfigurasi dinamik. Dan pembekal sumber data tersuai boleh membantu kami mencapai matlamat ini. Dengan mencipta skema penyedia sumber data tersuai, kami boleh mendapatkan data yang kami perlukan dengan mudah daripada peta nilai peta dan menggunakannya dalam konfigurasi Terraform kami. Seterusnya, mari belajar bagaimana untuk mencapainya!

Kandungan soalan

Saya mempunyai fungsi golang yang mengembalikan peranan jenis map[string]map[string]string

Contohnya:

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

Saya mencipta skema untuknya seperti yang ditunjukkan di bawah...

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

Dan kaedah penciptaan untuk menghantar nilai peranan kepada skema

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
}

Tetapi output terraform adalah peta kosong, bagaimana saya boleh membetulkannya, tolong bantu :)

outputs:

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

Keluaran yang dijangkakan adalah seperti berikut

Outputs:

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

Penyelesaian

Versi lama terraform sdk yang anda gunakan tidak mencapai apa yang anda cuba lakukan di sini. Pemetaan hanya boleh daripada jenis primitif:

. typestringtypeinttypebool

Untuk mencipta struktur ini anda perlu

berhijrah ke rangka kerja baharu yang dibina untuk sistem jenis terraform moden dan bukannya (seperti yang berlaku dengan sdkv2) sistem jenis terraform klasik v0.11 dan lebih awal.

Dalam rangka kerja pemalam terraform, struktur yang setara dengan apa yang anda cuba huraikan di sini ialah

mapnestedattribute, dan yang berikut menerangkan struktur seni bina yang anda tunjukkan dalam soalan anda:

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

Ini mewakili pemetaan objek dengan sifat yang diberikan, jadi jenis skema di atas adalah bersamaan dengan kekangan jenis berikut, yang boleh digunakan menggunakan sintaks kekangan jenis

bahasa terraform:

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

Atas ialah kandungan terperinci Bagaimana untuk mencipta skema penyedia sumber data rupa bumi tersuai untuk peta nilai peta?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam