Only this pageAll pages
Powered by GitBook
1 of 15

Română (Romanian)

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Terragrunt

Infrastructură de dimensiune mică - Terraform

Acest exemplu conține un cod ca exemplu de structurare a configuraților Terraform pentru o infrastructură de dimensiuni mici, unde nu există dependențe externe.

  • Perfect pentru a începe și pentru a edita pe parcurs

  • Perfect pentru module cu resurse puține

  • Bun pentru un număr redus de resurse (mai puține de 20-30)

Un singur fișier de stare pentru toate resursele poate face procesul de lucru cu Terraform să încetinească dacă numărul de resurse crește (considerați folosirea unui argument ca-target pentru a limita numărul de resurse).

Sursă:

Bun pentru module de infrastructură mici si lineare (ex: )

https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraform
terraform-aws-atlantis

Infrastructură de dimensiune medie - Terraform

Acest exemplu conține un cod ca exemplu de structurare a configuraților Terraform pentru o infrastructură de dimensiuni medii care folosește:

  • 2 conturi AWS

  • 2 medii de lucru separate (prod și stage care nu au procese comune). Fiecare mediu de lucru există într-un cont AWS separat

  • Fiecare mediu de lucru folosește aceeași versiune a unui modul intern modules/network provenind din aceeași sursă locală (local directory)

  • Perfect pentru proiecte în care infrastructura este separată logic (conturi AWS separate)

  • Potrivit când nu este nevoie de modificarea resurselor partajate între conturile AWS (un mediu de lucru = un cont AWS = un fișier de stare)

  • Potrivit când nu este necesară orchestrarea schimbărilor între mediile de lucru

  • Potrivit când resursele care formează infrastructura sunt diferite in funcție de mediul de lucru cu un anumit scop și nu poate fi generalizată (ex.: anumite resurse nu există într-un mediu de lucru sau într-o anumită regiune)

O dată cu expansiunea proiectului, o să fie din ce în ce mai dificil de păstrat aceste medii de lucru la curent cu fiecare. Considerați folosirea modulelor de infrastructură (gata de folosire sau interne) pentru sarcini repetitive.

Sursă:

Fiecare mediu de lucru folosește o altă versiune a modulelor de infrastructură gata de folosire (alb) provenite din

https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/medium-terraform
Terraform Registry

Bine ați venit

Acest document este o încercare de a descrie cele mai bune practici pentru folosirea Terraform și de a oferi recomandări pentru cele mai frecvente probleme întâmpinate de utilizatorii Terraform.

Terraform este unul din cele mai puternice (poate chiar cel mai puternic) instrumente și unul din cele mai folosite pentru a defini infrastructura ca și cod. Le permite dezvoltatorilor să facă o mulțime de lucruri și nu îi împiedică să facă lucruri în moduri care vor fi greu de susținut sau de integrat în viitor.

Este posibil ca unele informații descrise în această carte să nu pară cele mai bune practici. Știu acest lucru și pentru a ajuta cititorii să separe cele mai bune practici stabilite de ceea ce este doar un alt mod de a face lucrurile într-un anumit fel, folosesc uneori indicii pentru a oferi context și pictograme pentru a specifica nivelul de maturitate pentru fiecare subsecțiune legată de cele mai bune practici.

Câțiva ani mai târziu, a fost actualizată cu mai multe bune practici disponibile cu Terraform 1.0. În cele din urmă, această carte ar trebui să conțină cele mai multe dintre cele mai bune practici și recomandări indiscutabile pentru utilizatorii Terraform.

Sponsori

—

Traduceri

Contactați-mă dacă doriți să ajutați la traducerea acestei cărți în alte limbi.

Contribuții

Îmi doresc întotdeauna să primesc feedback și să actualizez această carte pe măsură ce comunitatea se maturizează și noi idei sunt implementate și verificate în timp.

Autori

Licență

Această lucrare este licențiată sub Apache 2 License. Consultați LICENSE pentru detalii complete.

Autorii și colaboratorii la acest conținut nu pot garanta valabilitatea informațiilor găsite aici. Vă rugăm să vă asigurați că înțelegeți că informațiile furnizate aici sunt furnizate în mod liber și că nu este creat niciun fel de acord sau contract între dvs. și orice persoană asociată cu acest conținut sau proiect. Autorii și colaboratorii nu își asumă și nu își declină nicio responsabilitate față de orice parte pentru orice pierdere, daune sau întrerupere cauzată de erori sau omisiuni în informațiile conținute în, asociate cu sau legate de acest conținut, indiferent dacă astfel de erori sau omisiuni rezultă din neglijență, accident sau orice altă cauză.

Copyright © 2018-2023 Anton Babenko.

Structura codului

Întrebările legate de structura codului Terraform sunt de departe cele mai frecvente în comunitate. La un moment dat, toată lumea s-a gândit la cea mai bună structură de cod pentru proiect.

Cum ar trebui să-mi structurez configurațiile Terraform?

Aceasta este una dintre întrebările pentru care există o mulțime de soluții și este foarte greu să dai sfaturi universale, așa că este util să începem prin a înțelege cu ce avem de-a face.

  • Care este complexitatea proiectului?

    • Numărul de resurse aferente

    • Numărul de furnizori Terraform (vezi nota de mai jos despre „furnizorii logici”)

  • Cât de des se schimbă infrastructura proiectului?

    • De la o dată pe lună/săptămână/zi

    • La continuu (de fiecare dată când există un nou commit)

  • Tirggeri pentru schimbari in cod? Permiteți serverului CI să actualizeze Git repository atunci când este construit un nou artefact?

    • Doar dezvoltatorii pot face push în repository-ul de infrastructură

    • Toată lumea poate propune o schimbare la orice, deschizând un PR (inclusiv activități automate care rulează pe serverul CI)

  • Ce platformă de implementare sau serviciu de implementare utilizați?

    • AWS CodeDeploy, Kubernetes, sau OpenShift au nevoie de o abordare ușor diferită

  • Cum sunt grupate mediile?

    • După mediu, regiune, proiect

Introducere în structurarea fișierelor de configurație Terraform

Punerea întregului cod în main.tf este o idee bună atunci când începeți sau scrieți un exemplu de cod. În toate celelalte cazuri, va fi mai bine să aveți mai multe fișiere împărțite logic astfel:

  • main.tf - apelați module, informații locale și surse de date pentru a crea toate resursele

  • variables.tf - conține declarații ale variabilelor utilizate în main.tf

  • outputs.tf - conține rezultate din resursele create înmain.tf

  • versions.tf - conține cerințele de versiune pentru Terraform și furnizori

Cum să ne gândim la structura fișierelor de configurație Terraform?

Recomandări uzuale pentru structurarea codului

  • Este mai ușor și mai rapid să lucrezi cu un număr mai mic de resurse

    • terraform plan șiterraform apply ambele fac apeluri API în cloud pentru a verifica starea resurselor

    • Dacă aveți întreaga infrastructură într-o singură compoziție de infrastructură, acest lucru poate dura ceva timp

  • O rază de impact este mai mică, cu mai puține resurse

    • Izolarea resurselor care nu depind unele de altele prin plasarea lor în compoziții separate reduce riscul în cazul în care ceva nu merge bine

  • Începeți proiectul folosind remote state deoarece:

    • Laptopul nu este un loc bun pentru stocarea stării infrastructurii

    • Gestionarea unui fișiertfstate în git este un coșmar

    • Mai târziu, când straturile de infrastructură vor începe să crească în mai multe direcții (număr de dependențe sau resurse), va fi mai ușor să țineți lucrurile sub control

    • La fel ca în cazul codului procedural, codul Terraform ar trebui scris pentru ca oamenii să-l citească mai întâi, consecvența va ajuta atunci când vor avea loc schimbări peste șase luni

    • Este posibil să mutați resurse în fișierul de stare Terraform, dar poate fi mai greu de făcut dacă aveți o structură și o denumire inconsecventă

  • Păstrați modulele de resurse cât mai simple posibil

  • Nu puneți simplu text (hardcoded) valorile care pot fi transmise ca variabile sau descoperite folosind surse de date

  • Utilizați surse de date șiterraform_remote_state în special ca legatură între modulele de infrastructură din cadrul compoziției

În această carte, exemplele de proiecte sunt grupate în funcție de complexitate - de la infrastructuri mici la infrastructuri foarte mari. Această separare nu este strictă, așa că verificați și alte structuri.

Orchestrarea modulelor și compozițiilor de infrastructură

A avea o infrastructură mică înseamnă că există un număr mic de dependențe și puține resurse. Pe măsură ce proiectul crește, necesitatea de a înlănțui execuția configurațiilor Terraform, conectarea diferitelor module de infrastructură și transmiterea valorilor într-o compoziție, devine evidentă.

Există cel puțin 5 grupuri distincte de soluții de orchestrare pe care dezvoltatorii le folosesc:

  1. Doar Terraform. Foarte simplu, dezvoltatorii trebuie să cunoască doar Terraform pentru a duce treaba la bun sfârșit.

  2. Terragrunt. Instrument de orchestrare pur, care poate fi folosit pentru a orchestra întreaga infrastructură, precum și pentru a gestiona dependențe. Terragrunt operează cu module de infrastructură și compoziții în mod nativ, astfel încât reduce duplicarea codului.

  3. Scripturi interne. Adesea, acest lucru se întâmplă ca punct de plecare către orchestrare și înainte de a descoperi Terragrunt.

  4. Instrument de automatizare Ansible sau altceva asemănător. Utilizat de obicei atunci când Terraform este adoptat după Ansible sau când Ansible UI este utilizat în mod activ.

Având în vedere acest lucru, această carte trece în revistă primele două dintre aceste structuri de proiect, doar Terraform și Terragrunt.

Exemple de structuri de cod

Structuri de cod Terraform

Exemplele următoare prezintă cazul în care AWS a fost ales ca furnizor, dar majoritatea principiilor descrise pot fi refolosite pentru ceilalți furnizori de cloud și de asemenea în cazul în care alegem alți furnizori în general (de DNS, baze de date, monitorizare, etc.).

Structuri de cod Terragrunt

Formatarea codului

  • Exemplele și modulele Terraform ar trebui să conțină documentație care explică caracteristicile și modul de utilizare a acestora.

  • Toate linkurile din fișierele README.md ar trebui să fie absolute pentru ca site-ul Terraform Registry să le arate corect.

Documentație

Documentație generată automat

Cu configurații Terraform pre-commit poate fi folosit pentru a formata și valida codul, precum și pentru a actualiza documentația.

terraform-docs

@todo: Versiuni ale modulelor de documente, release, acțiuni GH

Resurse

Concepte cheie

Acest capitol descrie conceptele cheie folosite în această carte.

Resurse

Resursele sunt, de exemplu, aws_vpc, aws_db_instance, etc. O resursă aparține unui furnizor (provider), acceptă argumente, întoarce atribute și are cicluri de viață. O resursă poate fi creată, preluată, actualizată și ștearsă.

Modulul de resurse

Modulul de infrastructură

Un modul de infrastructură este o colecție de module de resurse, care în mod logic nu pot fi conectate, dar în situația actuală/proiectul/setarea servesc aceluiași scop. Acesta definește configurația pentru furnizori, care este transmisă modulelor de resurse din interior și resurselor. În mod normal, este limitat să funcționeze într-o singură entitate per separator logic (de exemplu, Regiune AWS, Proiect Google).

Compoziţia de infrastructură

Compoziţia este o colecție de module de infrastructură, care se pot întinde pe mai multe zone separate logic (de exemplu, regiuni AWS, mai multe conturi AWS). Compoziţia este utilizată pentru a descrie infrastructura completă necesară pentru întreaga organizație sau întreagul proiect.

O compoziţie este constituită din module de infrastructură, care sunt constituite din module de resurse, care implementează resurse individuale.

Sursa de date

Sursa de date efectuează o operație doar de citire și depinde de configurația furnizorului, este utilizată într-un modul de resurse și într-un modul de infrastructură.

Sursa de date terraform_remote_state acționează ca o legătură între module de nivel superior și compoziții.

Remote state

Provider, provisioner, etc

Providers, provisioners, și alți câțiva termeni sunt descriși foarte bine în documentația oficială și nu are rost să repet aici. După părerea mea, au puțin de-a face cu scrierea unor module bune de Terraform.

De ce atât de dificil?

Accesul la date între molecule (module de resurse și module de infrastructură) se realizează folosind datele de ieșire ale modulelor (outputs) și sursele de date (data sources).

Când puneți conceptele descrise mai sus în pseudo-relații, acestea pot arăta astfel:

Infrastructură de dimensiune mare - Terraform

Acest exemplu conține un cod ca exemplu de structurare a configuraților Terraform pentru o infrastructură de dimensiuni mari care folosește:

  • 2 conturi AWS

  • 2 regiuni

  • 2 medii de lucru separate (prod și stage care nu au procese comune). Fiecare mediu de lucru există într-un cont AWS separat și conține resurse în două regiuni

  • Fiecare mediu de lucru folosește aceeași versiune a unui modul intern modules/network provenind din aceeași sursă locală (local directory)

  • Perfect pentru proiecte în care infrastructura este separată logic (conturi AWS separate)

  • Potrivit când nu este nevoie de modificarea resurselor partajate între conturile AWS (un mediu de lucru = un cont AWS = un fișier de stare)

  • Potrivit când nu este necesară orchestrarea schimbărilor între mediile de lucru

  • Potrivit când resursele care formează infrastructura sunt diferite in funcție de mediul de lucru cu un anumit scop și nu poate fi generalizată (ex.: anumite resurse nu există într-un mediu de lucru sau într-o anumită regiune)

O dată cu expansiunea proiectului, o să fie din ce în ce mai dificil de păstrat aceste medii de lucru la curent cu fiecare. Considerați folosirea modulelor de infrastructură (gata de folosire sau interne) pentru sarcini repetitive.

este un proiect nou (ca și majoritatea tool-urilor de DevOps) și a fost creat în 2014.

Cartea a început în însoritul Madrid în 2018 și este disponibilă gratuit aici - .

Please if you want to become a sponsor.

— Terraform Compliance Simplified. Make your Terraform modules compliance-ready.

Dacă sunteți interesați de anumite subiecte vă rogdeschideți (o problemă), sau dați "Like" la o problemă existentă pe care doriți să o abordați cel mai mult. Dacă simțiți că aveți conținut și doriți să contribui, scrieți un text și trimiteți un pull request (nu vă faceți griji dacă scrieți un text bun în acest moment!).

Această carte este menținută de cu ajutorul diferiților colaboratori și traducători.

Furnizorii logici lucrează în întregime în logica Terraform și de foarte multe ori nu interacționează cu niciun alt serviciu, așa că ne putem gândi la complexitatea lor ca O(1). Cei mai comuni furnizori logici includ: , , , , .

terraform.tfvars nu trebuie folosit nicăieri decât in .

Vă rog să vă asigurați că înțelegeți conceptele cheie - , și , așa cum sunt utilizate în exemplele următoare.

Practicați o structură consecventă și o convenție de denumire a resurselor ( convention):

și alte soluții inspirate de Kubernetes. Uneori, este logic să utilizați ecosistemul Kubernetes și să folosiți o funcție de buclă de reconciliere pentru a obține starea dorită a configurațiilor Terraform. Vizualizați videoclipul pentru mai multe informații.

Vezi exemple de structuri de cod pentru sau în capitolul următor.

Tip
Descriere
Disponibilitate
Tip
Descriere
Disponibilitate

Documentația poate include diagrame create cu și schițe create cu .

Folosiți to asigurați-vă că codul este valid, formatat corespunzător și documentat automat înainte de a fi salvat în git și revizuit de oameni.

este un cadru (framework) pentru gestionarea și menținerea pre-commit hooks în mai multe limbi. Este scris în Python și este un instrument puternic pentru a face ceva automat pe mașina unui dezvoltator înainte ca acel cod să fie salvat într-un git repository. În mod normal, este folosit pentru a rula linters și pentru a formata cod (vezi ).

Verificați pentru a vă familiariza cu acesta și cu repositories existente (ex.: ) unde acesta este deja folosit.

este un instrument care generează documentație din modulele Terraform în diverse formate de ieșire. Îl puteți rula manual (fără pre-commit hooks) sau puteți utiliza pentru a actualiza automat documentația.

Blog post de :

Documentația oficială pentru Terraform descrie . Citiți-o cu atenție pentru a înțelege restul capitolului.

Modulul de resurse este o colecție de resurse conectate care realizează împreună o acțiune comună (de exemplu, creează VPC, subrețele, NAT gateway etc.). Depinde de configurația furnizorului, care poate fi definită în acesta, sau în structuri de nivel superior (de exemplu, în modulul de infrastructură).

De exemplu, modulul folosește module de resurse ca și pentru a gestiona infrastructura necesară rulării în .

Un alt exemplu este modulul unde mai multe module de sunt utilizate împreună pentru a gestiona infrastructura, precum și pentru a folosi resursele Docker pentru a face build, push, și deploy imaginilor de Docker. Toate într-un singur set.

Sursa externă de date permite unui program extern să acționeze ca sursă de date, expunând date arbitrare pentru a fi utilizate în altă parte în configurația Terraform. Iată un exemplu din modulul în care numele fișierului este calculat prin apelarea unui script de Python extern.

Sursa de date face o solicitare HTTP GET către adresa URL dată și exportă informații despre răspuns, care sunt adesea utile pentru a obține informații de la punctele finale (endpoints) în care nu există un furnizor Terraform nativ.

Modulele de infrastructură și compozițiile ar trebui să-și păstreze într-o locație la distanță numită remote state, unde pot fi preluate de către alții într-un mod controlabil (de exemplu, specificații ACL, versionări, logging).

În timp ce resursele individuale sunt ca atomii din infrastructură, modulele de resurse sunt ca moleculele. Un modul este cea mai mică unitate versionabilă și partajabilă. Are o listă exactă de argumente, implementează logica de bază pentru ca o astfel de unitate să facă funcția necesară. De exemplu, modulul creează resursele aws_security_groupși aws_security_group_rule pe baza informației de intrare. Acest modul de resurse poate fi folosit împreună cu alte module pentru a crea modulul de infrastructură.

Accesul între compoziții se realizează adesea folosind surse de date de la distanță (remote state data sources). Există mai .

Sursă:

Fiecare mediu de lucru folosește o altă versiune a modulelor de infrastructură gata de folosire (alb) provenite din

Într-un proiect de dimensiuni mari ca cel descris aici, beneficiile utilizării Terragrunt devin foarte vizibile. Vezi .

Terraform
https://www.terraform-best-practices.com/
contact me
un issue
Anton Babenko
random
local
terraform
null
time
naming
Crossplane
Crossplane vs Terraform
Terraform
Terragrunt

medie

Mai multe conturi de AWS și medii de lucru, module de infrastructură gata de folosire, model de compoziție folosind Terragrunt.

Nu

mare

Mai multe conturi de AWS, multiple regiuni, nevoie urgentă de a reduce folosirea metodei copy-paste, module de infrastructură personalizate, utilizare ridicata a compoziției de cod. Folosind Terragrunt.

Nu

foarte mare

Furnizori multiplii (AWS, GCP, Azure). Implementări multi-cloud. Folosind Terragrunt.

Nu

composition-1 {
  infrastructure-module-1 {
    data-source-1 => d1

    resource-module-1 {
      data-source-2 => d2
      resource-1 (d1, d2)
      resource-2 (d2)
    }

    resource-module-2 {
      data-source-3 => d3
      resource-3 (d1, d3)
      resource-4 (d3)
    }
  }

}
Compoziţia de infrastructură
modulul de resurse
modulul de infrastructură
compoziția de infrastructură
Compliance.tf
mermaid
cloudcraft.co
Terraform pre-commit hooks
pre-commit
supported hooks
pre-commit-terraform repository
terraform-aws-vpc
terraform-docs
pre-commit-terraform hooks
pre-commit framework homepage
Collection of git hooks for Terraform to be used with pre-commit framework
Dean Wilson
pre-commit hooks and terraform - a safety net for your repositories
toate aspectele configurației în detaliu
modulul Terraform pentru AWS VPC
terraform-aws-atlantis
terraform-aws-vpc
terraform-aws-security-group
Atlantis
AWS Fargate
terraform-aws-cloudquery
terraform-aws-modules
terraform-aws-lambda
http
starea Terraform
terraform-aws-security-group
multe moduri de a partaja date între configurații
https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/large-terraform
Terraform Registry
Exemple de structuri de cod - Terragrunt

FAQ

PFT (Probleme Frecvente cu Terrafom)

Care sunt instrumentele pe care ar trebui să le cunosc și pe care ar trebui să le folosesc?

Ar trebui specificate versiunile modulelor de resurse și infrastructură. Furnizorii de infrastructură (providers) ar trebui configurați în afara modulelor, dar numai în compoziție. Versiunea furnizorilor și cea a Terraform pot fi, de asemenea, blocate.

Puține resurse, fără dependențe externe. Un singur cont AWS. O singura regiune. Un singur mediu.

Da

Câteva conturi AWS și medii de lucru, module de infrastructură gata de folosire cu Terraform.

Da

Mai multe conturi de AWS, mai multe regiuni, nevoie urgentă de a reduce folosirea metodei copy-paste, module de infrastructură personalizate, utilizare ridicata a compoziției de cod. Folosind Terraform.

În lucru

foarte mare

Furnizori multiplii (AWS, GCP, Azure). Implementări multi-cloud. Folosind Terraform.

Nu

- Instrument de orchestrare

- Cod linter

- Manager de versiuni

- Automatizare pentru Pull Requests

- O colecție de git hooks pentru Terraform pentru a fi folosite cu

Care sunt soluțiile pentru iadul dependenței - , cu module?

Nu există un instrument principal de gestionare a dependenței, dar există câteva sfaturi pentru a face iadul dependenței mai puțin problematic. De exemplu, poate fi folosit pentru a automatiza actualizările dependenței. Dependabot creează pull requests pentru a vă menține dependențele în siguranță și actualizate. Dependabot acceptă configurații Terraform.

mică
medie
mare
Terragrunt
tflint
tfenv
Atlantis
pre-commit-terraform
pre-commit framework
dependency hell
Dependabot

Workshop

Există, de asemenea, un workshop pentru persoanele care doresc să exerseze lucrurile descrise în acest ghid.

Scrierea configurațiilor Terraform

Utilizați locals pentru a specifica dependențe explicite între resurse

Un mod util de a da un indiciu pentru Terraform că unele resurse ar trebui șterse înainte chiar și atunci când nu există nicio dependență directă în configurațiile Terraform.

Terraform 0.12 - Argumente obligatorii vs argumente opționale

  1. Argumentul obligatoriu index_document trebuie setat, dacă var.website nu este o hartă (map) goală.

  2. Argumentul opțional error_document poate fi omis.

Conținutul poate fi accesat aici -

https://github.com/antonbabenko/terraform-best-practices-workshop
main.tf
variable "website" {
  type    = map(string)
  default = {}
}

resource "aws_s3_bucket" "this" {
  # omitted...

  dynamic "website" {
    for_each = length(keys(var.website)) == 0 ? [] : [var.website]

    content {
      index_document = website.value.index_document
      error_document = lookup(website.value, "error_document", null)
    }
  }
}
terraform.tfvars
website = {
  index_document = "index.html"
}
https://raw.githubusercontent.com/antonbabenko/terraform-best-practices/master/snippets/locals.tf
العربية (Arabic)
Bosanski (Bosnian)
Español (Spanish)
Français (French)
Português (Brazilian Portuguese)
ελληνικά (Greek)

Convenții de numire

Convenții generale

Nu există niciun motiv să nu se respecte măcar aceste convenții :)

Atenție că resursele din cloud în realitate au adesea restricții în numele permise. Unele resurse, de exemplu, nu pot conține cratimă, unele trebuie sa fie scrise cu majuscule mediale (CamelCase). Convenția din aceasta carte se referă la numele din Terraform în sine.

  1. Folosiți _ (underscore) în loc de - (cratimă) peste tot (numele resurselor, numele surselor de date, numele variabilelor, outputs, etc).

  2. De preferat să utilizați litere mici și cifre (chiar dacă UTF-8 este acceptat).

Argumentele resurselor și surselor de date

  1. Nu repetați tipul de resursă în numele resursei (nu parțial, nici complet):

    resource "aws_route_table" "public" {}

    resource "aws_route_table" "public_route_table" {}

    resource "aws_route_table" "public_aws_route_table" {}

  2. Folosiți întotdeauna substantive la singular pentru nume.

  3. Folosiți - în interiorul valorilor argumentelor și în locurile în care valoarea va fi expusă unui om (ex.: în interiorul numelui DNS al instanței RDS).

  4. Includeți argumentulcount / for_each în interiorul blocului de resurse sau sursă de date ca prim argument în partea de sus și separat prin linie nouă după acesta.

  5. Includeți argumentul tags, dacă este suportat de resursă, ca ultimul argument real, urmat de depends_on și lifecycle, dacă este necesar. Toate acestea ar trebui separate printr-o singură linie goală.

  6. Când folosiți condiții într-un argumentcount / for_each este de preferat să se folosească valori booleene în loc de length sau alte expresii.

Exemple de cod pentru resurse (resource)

Folosirea count / for_each

main.tf
resource "aws_route_table" "public" {
  count = 2

  vpc_id = "vpc-12345678"
  # ... remaining arguments omitted
}

resource "aws_route_table" "private" {
  for_each = toset(["one", "two"])

  vpc_id = "vpc-12345678"
  # ... remaining arguments omitted
}
main.tf
resource "aws_route_table" "public" {
  vpc_id = "vpc-12345678"
  count  = 2

  # ... remaining arguments omitted
}

Folosirea tags

main.tf
resource "aws_nat_gateway" "this" {
  count = 2

  allocation_id = "..."
  subnet_id     = "..."

  tags = {
    Name = "..."
  }

  depends_on = [aws_internet_gateway.this]

  lifecycle {
    create_before_destroy = true
  }
}   
main.tf
resource "aws_nat_gateway" "this" {
  count = 2

  tags = "..."

  depends_on = [aws_internet_gateway.this]

  lifecycle {
    create_before_destroy = true
  }

  allocation_id = "..."
  subnet_id     = "..."
}

Condiții în count

outputs.tf
resource "aws_nat_gateway" "that" {    # Best
  count = var.create_public_subnets ? 1 : 0
}

resource "aws_nat_gateway" "this" {    # Good
  count = length(var.public_subnets) > 0 ? 1 : 0
}

Variabile

  1. Nu reinventați roata în modulele de resurse: folosiți name, description, și valoarea default pentru variabile cum sunt definite în secțiunea "Argument Reference" (din documentația oficială Terraform) pentru resursa de care aveți nevoie.

  2. Suportul pentru validarea variabilelor este destul de limitat (de exemplu, nu pot accesa alte variabile sau nu pot face căutări). Planificați în consecință, deoarece în multe cazuri această caracteristică este inutilă.

  3. Utilizați forma de plural într-un nume de variabilă atunci când tipul este list(...) sau map(...).

  4. Ordonați cheile într-un bloc de variabilă astfel: description , type, default, validation.

  5. Includeți întotdeauna description pentru toate variabilele chiar dacă vi se pare că este evident ce fac (veți avea nevoie de această informație în viitor).

  6. De preferință, alegeți folosirea unor tipuri simple (number, string, list(...), map(...), any) în loc de tipuri ca object() cu excepția cazului în care trebuie să aveți constrângeri stricte pentru fiecare cheie.

  7. De preferință, alegeți folosirea tipurilor specifice, camap(map(string)) dacă toate elementele din map au același tip (ex.: string) sau pot fi convertite (ex.: tipul number poate fi convertit la tipul string).

  8. Utilizați tipul any pentru a dezactiva validarea tipului începând de la o anumită adâncime sau atunci când mai multe tipuri ar trebui să fie acceptate.

  9. Valoarea {} este uneori de tip map (hartă), dar alteori un obiect. Utilizați tomap(...) pentru a o face de tip map pentru că nu există nicio modalitate de a face un obiect.

Outputs

Faceți rezultatele (outputs) consistente și ușor de înțeles în afara domeniului de aplicare (atunci când un utilizator folosește un modul, ar trebui să fie evident care este tipul și atributul valorii returnate).

  1. Numele rezultatului ar trebui să descrie proprietatea pe care o conține și să aibă o formă mai puțin liberă decât v-ați dori în mod normal

  2. O structură bună pentru numele de ieșire arată ca {name}_{type}_{attribute} , unde:

    1. {name} este o resursă sau un nume de sursă de date fără prefix de furnizor. {name} pentru aws_subnet este subnet, pentruaws_vpc este vpc.

    2. {type} este un tip de sursă de resurse.

    3. {attribute} este un atribut returnat de rezultate (outputs).

  3. Includeți întotdeauna description pentru toate rezultatele (outputs) chiar dacă vi se pare că este ceva evident.

  4. Evitați setarea sensitive pentru argumente cu excepția cazului în care controlați pe deplin utilizarea acestui rezultat în toate locurile din toate modulele.

  5. De preferință, alegețitry() (disponibil începând cu Terraform 0.13) în loc de element(concat(...)) (abordarea legacy folosită înainte de versiunea 0.13)

Exemple de cod pentru output

Returnați cel mult un ID al grupului de securitate:

outputs.tf
output "security_group_id" {
  description = "The ID of the security group"
  value       = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
}

Când aveți mai multe resurse de același tip, .this ar trebui să fie omis în numele ieșirii:

outputs.tf
output "this_security_group_id" {
  description = "The ID of the security group"
  value       = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
}

Folosiți numele la plural dacă valoarea returnată este o listă

outputs.tf
output "rds_cluster_instance_endpoints" {
  description = "A list of all cluster instance endpoints"
  value       = aws_rds_cluster_instance.this.*.endpoint
}

Numele resursei ar trebui să fie ales this dacă nu mai există un nume descriptiv și general disponibil sau dacă modulul de resurse creează o singură resursă de acest tip (ex.: în există o singură resursă de tip aws_nat_gateway și resurse multiple de tipaws_route_table, așadar aws_nat_gateway ar trebui să primească numele this și aws_route_table ar trebui să primească nume mai descriptive - cum ar fi private, public, database).

.

Dacă rezultatul returnează o valoare cu funcții de interpolare și resurse multiple, {name} și {type} ar trebui să fie cât mai generice (this ca prefix ar trebui să fie omis). .

Dacă valoarea returnată este o listă, aceasta ar trebui să aibă un nume la plural..

AWS VPC module
Vezi exemple
Vezi exemple
Vezi exemplu
English
עברית (Hebrew)
हिंदी (Hindi)
Bahasa Indonesia (Indonesian)
ქართული (Georgian)

Terraform

O compoziţie de infrastructură simplă
Deutsch (German)

Referințe

Există o mulțime de oameni care creează conținut grozav și gestionează proiecte open-source relevante pentru comunitatea Terraform, dar nu mă pot gândi la cea mai bună structură pentru a obține aceste link-uri enumerate aici fără a copia liste precum .

- Lista de oameni care lucrează cu Terraform foarte activ și vă pot spune multe (dacă îi întrebați).

- Lista organizată de resurse pentru Terraform HashiCorp.

- "Your Weekly Dose of Terraform" canalul de YouTube al lui Anton Babenko. Live stream cu recenzii, interviuri, întrebări și răspunsuri, codare live și ceva hacking cu Terraform.

- Terraform Weekly newsletter. Diverse știri din lumea Terraform (proiecte, anunțuri, discuții) scrise de Anton Babenko.

awesome-terraform
https://twitter.com/antonbabenko/lists/terraform-experts
https://github.com/shuaibiyy/awesome-terraform
http://bit.ly/terraform-youtube
https://weekly.tf
Polski (Polish)
日本語 (Japanese)
ಕನ್ನಡ (Kannada)
简体中文 (Simplified Chinese)
Italiano (Italian)
한국어 (Korean)
اردو (Urdu)
Українська (Ukrainian)
Türkçe (Turkish)