Terraform Data Sources, jak se dotazovat na zdroje v cloudu

Terraform je skvělý nástroj, který se profiluje jako jeden z leaderů nastupujícího trendu Infrastructure as Code (IaC). Vytvořit a zrušit infrastrukturu pomocí příkazů terraform apply a terraform destroy je jednoduché a přímočaré.

Když se nad tím ale zamyslíme, Terraform nedělá nic jiného, než že mapuje abstraktní DSL na API jednotlivých providerů. (Protože my znalci a evangelisti IaC víme, že všechny cloudy jsou API-driven.) Takže, když to hodně zjednoduším, většina zdrojů v cloudu se manipuluje pomocí CRUD volaným přes REST. 😈

Create a delete je v Terraformu jednoznačný. Update celkem taky. Co ale read (a eventuálně list)? 🤔 Částečně sem spadají output values, ale tak nějak cítíme, že to není opravdový read, ale spíš vedlejší produkt (či něco jako response) operací create a delete.

Data Sources

Naštěstí má Terraform koncept data sources. Ovšem jejich použití není úplně intuitivní, takže nebude na škodu si uvést malý příklad. Nicméně, first-thing-first — co to je data sources?

Data sources allow data to be fetched or computed for use elsewhere in Terraform configuration. Use of data sources allows a Terraform configuration to make use of information defined outside of Terraform, or defined by another separate Terraform configuration.

Each provider may offer data sources alongside its set of resource types.

Čili data source je objekt, který drží hodnoty daného zdroje — ať už byl ten zdroj vytvořen danou Terraform konfigurací, jinou Terraform konfigurací, anebo úplně externě.

Jak konkrétně daný data source vypadá, je daný specifickým providerem a jeho zdroji. Abychom si ukázali konkrétní příklad (a já si přihřál polívčičku, na čem jsem poslední rok a půl pracoval 😳), vezměme si instanci Big Data Service (BDS), což je velmi komplexní zdroj, avšak chceme-li se na něj dotázat, stačí následující kód:

data "oci_bds_bds_instance" "tf_bds_instance" {
    #Required
    bds_instance_id = "ocid1.bigdataservice.oc1.iad.abcdefg"
}

Kromě toho, že definujeme, že jde o data source (keyword data) daného typu (keyword oci_bds_bds_instance), s daným jménem (tf_bds_instance), tak už stačí jen jeden povinný parametr — identifikátor zdroje (bds_instance_id).

Statické a dynamické reference

Je dobré zmínit, že daný identifikátor můžu zadat buď jako konstantu (tj. dané ID už znám), nebo může jít o hodnotu, která teprve dynamicky vznikne (např. pokud daný zdroj Terraformem vytvářím/modifikuji). V druhém případě zadám identifikátor jako referenci na atribut zdroje.

Pokud mám v definici data source pouze statické hodnoty, potom jsou hodnoty daného data source načteny během refresh fáze (která probíhá před vytvořením Terraform plánu). Výsledek tak dostaneme příkazem terraform refresh.

Pokud mám v definici data source dynamické hodnoty, potom je potřeba, aby všechny tyto hodnoty byly prvně spočteny. V tom případě je vytvoření data source odloženo až do fáze apply, tj. je potřeba spustit příkaz terraform apply.

Kompletní příklad

Pokud mám definovaný data source, je potřeba ho “nějak” zasadit do naší Terraform konfigurace. Je možné ho přidat ke stávajícím zdrojům, anebo mít jen konfiguraci na dotazování (která žádné zdroje nevytváří).

Příkladem takové minimalistické dotazovací konfigurace je následující kód, který definuje providera, data source a výstupní hodnotu:

Pokud daná BDS instance existuje (a poskytli jsme pořebné vstupní proměnné), dostaneme příkazem terraform refresh následující výpis:

Výpis data source pro BDS (pouze malá část, zkráceno)

Výpis data source pro BDS (pouze malá část, zkráceno)

Související články