arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 15

ελληνικά (Greek)

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Terragrunt

Παραδείγματα δομής κώδικα

hashtag
Δομές κώδικα Terraform

circle-info

Αυτά τα παραδείγματα δείχνουν τον πάροχο AWS, αλλά η πλειονότητα των αρχών που παρουσιάζονται στα παραδείγματα μπορούν να εφαρμοστούν σε άλλους παρόχους δημόσιου cloud καθώς και σε άλλα είδη παρόχων (DNS, DB, Monitoring κ.λπ.).

Τυπος
Περιγραφή
Ετοιμότητα

hashtag
Δομές κώδικα Terragrunt

Τύπος
Περιγραφή
Ετοιμότητα

Terraform

Τα παρακάτω είναι τα άρθρα αυτής της ενότητας:

Υποδομή μικρού μεγέθους με Terraform

Υποδομή μεσαίου μεγέθους με Terraform

Υποδομή μεγάλου μεγέθους με Terraform

Όχι

μικρός

Λίγοι πόροι, χωρίς εξωτερικές εξαρτήσεις. Ενιαίος λογαριασμός AWS. Μία μόνο περιοχή. Ενιαίο περιβάλλον.

Ναι

μεσαίος

Διάφοροι λογαριασμοί και περιβάλλοντα AWS, έτοιμες μονάδες υποδομής με χρήση της Terraform.

Ναι

μεγάλος

Πολλοί λογαριασμοί AWS, πολλά regions, επείγουσα ανάγκη μείωσης της αντιγραφής-επικόλλησης, προσαρμοσμένες ενότητες υποδομής, έντονη χρήση συνθέσεων. Χρήση της Terraform.

Σε εξέλιξη

πολύ μεγάλος

μεσαίος

Διάφοροι λογαριασμοί και περιβάλλοντα AWS, έτοιμες μονάδες υποδομής, σύνθεση με χρήση της Terragrunt.

Όχι

μεγάλος

Πολλοί λογαριασμοί AWS, πολλά regions, επείγουσα ανάγκη μείωσης της αντιγραφής-επικόλλησης, προσαρμοσμένες ενότητες υποδομής, έντονη χρήση συνθέσεων. Χρήση της Terragrunt.

Όχι

πολύ μεγάλος

Διάφοροι πάροχοι (AWS, GCP, Azure). Εγκαταστάσεις πολλαπλών cloud. Χρήση της Terragrunt.

Όχι

Εγκαταστάσεις πολλαπλών παρόχων cloud. Χρήση της Terraform.

Εργαστήριο

Υπάρχει επίσης ένα εργαστήριο για άτομα που θέλουν να εφαρμόσουν στην πράξη κάποια από τα πράγματα που περιγράφονται σε αυτόν τον οδηγό.

Το περιεχόμενο βρίσκεται εδώ -

https://github.com/antonbabenko/terraform-best-practices-workshoparrow-up-right

Δομή κώδικα

Οι ερωτήσεις που σχετίζονται με τη δομή του κώδικα της Terraform είναι μακράν οι πιο συχνές στην κοινότητα. Όλοι σκέφτηκαν επίσης κάποια στιγμή για την καλύτερη δομή κώδικα για το έργο.

hashtag
Πώς προτείνεται να δομώ τις Terraform ρυθμίσεις μου;

Αυτή είναι μία από τις ερωτήσεις όπου υπάρχουν πολλές πιθανές λύσεις και είναι πολύ δύσκολο να δώσουμε γενικές οδηγίες, οπότε ας ξεκινήσουμε με την κατανόηση του τι αντιμετωπίζουμε.

  • Ποια είναι η πολυπλοκότητα του έργου σας;

    • Αριθμός σχετικών πόρων

    • Αριθμός παρόχων Terraform (βλ. σημείωση παρακάτω σχετικά με τους "λογικούς παρόχους")

  • Πόσο συχνά αλλάζει η υποδομή σας;

    • Από μία φορά το μήνα/εβδομάδα/ημέρα

    • Μέχρι συνεχώς (κάθε φορά που υπάρχει ένα νέο commit)

  • Εναύσματα αλλαγής κώδικα; Αφήνετε τον CI server να ενημερώνει το repository όταν κατασκευάζεται ένα νέο artifact;

    • Μόνο οι προγραμματιστές μπορούν να κάνουν push στο repository υποδομής

    • Όλοι μπορούν να προτείνουν μια αλλαγή σε ο,τιδήποτε ανοίγοντας ένα PR (συμπεριλαμβανομένων των αυτοματοποιημένων εργασιών που εκτελούνται στον CI server)

  • Ποια πλατφόρμα ανάπτυξης ή υπηρεσία ανάπτυξης χρησιμοποιείτε;

    • Το AWS CodeDeploy, το Kubernetes ή το OpenShift απαιτούν μια ελαφρώς διαφορετική προσέγγιση

  • Πώς ομαδοποιούνται τα περιβάλλοντα;

    • Ανά περιβάλλον, περιοχή, έργο

circle-info

Οι λογικοί πάροχοι λειτουργούν εξ ολοκλήρου εντός της λογικής του Terraform και πολύ συχνά δεν αλληλεπιδρούν με άλλες υπηρεσίες, οπότε μπορούμε να σκεφτούμε την πολυπλοκότητά τους ως O(1). Οι πιο συνηθισμένοι λογικοί πάροχοι περιλαμβάνουν τις , , , , .

hashtag
Ξεκινώντας με τη δόμηση των ρυθμίσεων της Terraform

Η τοποθέτηση όλου του κώδικα στο main.tf είναι μια καλή ιδέα όταν ξεκινάτε ή όταν γράφετε ένα παράδειγμα κώδικα. Σε όλες τις άλλες περιπτώσεις θα είναι καλύτερα να έχετε διάφορα αρχεία χωρισμένα λογικά όπως αυτό:

  • main.tf - κλήση μονάδων, τοπικών μονάδων και πηγών δεδομένων για τη δημιουργία όλων των πόρων

  • variables.tf - περιέχει δηλώσεις των μεταβλητών που χρησιμοποιούνται στο main.tf

  • outputs.tf

Το terraform.tfvars δεν πρέπει να χρησιμοποιείται πουθενά αλλού εκτός από

hashtag
Πώς να σκεφτείτε τη δομή ρυθμίσεων του Terraform;

circle-info

Βεβαιωθείτε ότι έχετε κατανοήσει τις βασικές έννοιες - , και , όπως χρησιμοποιούνται στα παρακάτω παραδείγματα.

hashtag
Κοινές συστάσεις για τη δόμηση του κώδικα

  • Είναι ευκολότερο και γρηγορότερο να εργάζεστε με μικρότερο αριθμό πόρων

    • Το terraform plan και το terraform apply πραγματοποιούν και τα δύο κλήσεις cloud API για να επαληθεύσουν την κατάσταση των πόρων

Σε αυτό το βιβλίο τα παραδείγματα έργων ομαδοποιούνται ανάλογα με την πολυπλοκότητα - από μικρές έως πολύ μεγάλες υποδομές. Αυτός ο διαχωρισμός δεν είναι αυστηρός, οπότε ελέγξτε και άλλες δομές.

hashtag
Ενορχήστρωση μονάδων υποδομής και συνθέσεων

Η ύπαρξη μιας μικρής υποδομής σημαίνει ότι υπάρχει μικρός αριθμός εξαρτήσεων και λίγοι πόροι. Καθώς το έργο μεγαλώνει, γίνεται εμφανής η ανάγκη για την αλυσιδωτή εκτέλεση των ρυθμίσεων του Terraform, τη σύνδεση διαφορετικών μονάδων υποδομής και τη μεταβίβαση τιμών εντός μιας σύνθεσης.

Υπάρχουν τουλάχιστον 5 διακριτές ομάδες λύσεων ενορχήστρωσης που χρησιμοποιούν οι προγραμματιστές:

  1. Μόνο Terraform. Πολύ απλό, οι προγραμματιστές πρέπει να γνωρίζουν μόνο το Terraform για να κάνουν τη δουλειά τους.

  2. Terragrunt. Καθαρό εργαλείο ενορχήστρωσης το οποίο μπορεί να χρησιμοποιηθεί για την ενορχήστρωση ολόκληρης της υποδομής καθώς και για το χειρισμό των εξαρτήσεων. Το Terragrunt λειτουργεί με ενότητες υποδομής και συνθέσεις εγγενώς, οπότε μειώνει την επανάληψη του κώδικα.

  3. Εσωτερικά scripts. Συχνά αυτό συμβαίνει ως σημείο εκκίνησης προς την ενορχήστρωση και πριν την ανακάλυψη του Terragrunt.

Έχοντας αυτό κατά νου, αυτό το βιβλίο εξετάζει τις δύο πρώτες από αυτές τις δομές έργων, το Terraform only και το Terragrunt.

Δείτε παραδείγματα δομών κώδικα για ή στο επόμενο κεφάλαιο.

Υποδομή μικρού μεγέθους με Terraform

Πηγή: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraformarrow-up-right

Αυτό το παράδειγμα περιέχει κώδικα ως παράδειγμα δόμησης των ρυθμίσεων του Terraform για μια υποδομή μικρού μεγέθους, όπου δεν χρησιμοποιούνται εξωτερικές εξαρτήσεις.

circle-check
  • Ιδανικό για να ξεκινήσετε και να αναδιαμορφώσετε καθώς προχωράτε

  • Ιδανικό για μικρές ενότητες πόρων

  • Καλό για μικρές και γραμμικές ενότητες υποδομής (π.χ. )

  • Καλό για μικρό αριθμό πόρων (λιγότερους από 20-30)

circle-exclamation

Το ενιαίο αρχείο κατάστασης για όλους τους πόρους μπορεί να κάνει τη διαδικασία εργασίας με το Terraform αργή αν ο αριθμός των πόρων αυξάνεται (εξετάστε το ενδεχόμενο να χρησιμοποιήσετε ένα όρισμα -target για να περιορίσετε τον αριθμό των πόρων)

- περιέχει τα outpus από τους πόρους που δημιουργήθηκαν στο main.tf
  • versions.tf - περιέχει απαιτήσεις versioning για το Terraform και τους παρόχους

  • Εάν έχετε ολόκληρη την υποδομή σας σε μία μόνο σύνθεση αυτό μπορεί να πάρει αρκετό χρόνο
  • Η ακτίνα επίδρασης (σε περίπτωση παραβίασης της ασφάλειας) είναι μικρότερη με λιγότερους πόρους

    • Η απομόνωση μη συνδεδεμένων πόρων μεταξύ τους με την τοποθέτησή τους σε ξεχωριστές συνθέσεις μειώνει τον κίνδυνο αν κάτι πάει στραβά

  • Ξεκινήστε το έργο σας χρησιμοποιώντας απομακρυσμένη κατάσταση επειδή:

    • Ο φορητός σας υπολογιστής δεν είναι κατάλληλο μέρος για την «πηγή αλήθειας» της υποδομής σας

    • Η διαχείριση ενός αρχείου tfstate στο git είναι εφιάλτης

    • Αργότερα, όταν τα επίπεδα υποδομής αρχίσουν να αυξάνονται προς πολλές κατευθύνσεις (αριθμός εξαρτήσεων ή πόρων) θα είναι ευκολότερο να κρατήσετε τα πράγματα υπό έλεγχο

  • Εφαρμόστε μια συνεπή δομή και σύμβαση ονομασίας:

    • Όπως και ο διαδικαστικός κώδικας, ο κώδικας Terraform θα πρέπει να γράφεται πρώτα για να τον διαβάζουν οι άνθρωποι, η συνέπεια θα βοηθήσει όταν θα γίνουν αλλαγές σε έξι μήνες από τώρα.

    • Είναι δυνατή η μετακίνηση πόρων στο αρχείο κατάστασης Terraform, αλλά μπορεί να είναι πιο δύσκολο να γίνει αν έχετε ασυνεπή δομή και ονοματοδοσία

  • Διατηρήστε τις ενότητες πόρων όσο το δυνατόν πιο απλές

  • Μην γράφετε hardcoded τιμές που μπορούν να περάσουν ως μεταβλητές ή να ανακαλυφθούν με τη χρήση πηγών δεδομένων

  • Χρησιμοποιήστε τις πηγές δεδομένων και το terraform_remote_state ειδικά ως "συγκολλητικό υλικό" μεταξύ των μονάδων υποδομής εντός της σύνθεσης

  • Ansible ή παρόμοιο εργαλείο αυτοματοποίησης γενικού σκοπού. Συνήθως χρησιμοποιείται όταν το Terraform υιοθετείται μετά το Ansible ή όταν χρησιμοποιείται ενεργά το Ansible UI.

  • Crossplanearrow-up-right και άλλες λύσεις εμπνευσμένες από το Kubernetes. Μερικές φορές έχει νόημα να αξιοποιήσετε το οικοσύστημα Kubernetes και να χρησιμοποιήσετε μια λειτουργία βρόχου «συμφιλίωσης» για να επιτύχετε την επιθυμητή κατάσταση των ρυθμίσεων του Terraform σας. Δείτε το βίντεο Crossplane vs Terraformarrow-up-right για περισσότερες πληροφορίες.

  • randomarrow-up-right
    localarrow-up-right
    terraformarrow-up-right
    nullarrow-up-right
    timearrow-up-right
    τη σύνθεση
    μονάδα πόρου
    μονάδα υποδομής
    σύνθεση
    Terraform
    Terragrunt
    terraform-aws-atlantisarrow-up-right

    Υποδομή μεγάλου μεγέθους με Terraform

    Πηγή: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/large-terraformarrow-up-right

    Αυτό το παράδειγμα περιέχει κώδικα ως παράδειγμα δόμησης των ρυθμίσεων της Terraform για μια υποδομή μεγάλου μεγέθους που χρησιμοποιεί:

    • 2 λογαριασμούς AWS

    • 2 regions

    • 2 ξεχωριστά περιβάλλοντα (prod και stage που δεν διαμοιράζονται τίποτα). Κάθε περιβάλλον ζει σε ξεχωριστό λογαριασμό AWS και καλύπτει πόρους μεταξύ 2 regions

    • Κάθε περιβάλλον χρησιμοποιεί διαφορετική έκδοση της έτοιμης μονάδας υποδομής (alb) που προέρχεται από το .

    • Κάθε περιβάλλον χρησιμοποιεί την ίδια έκδοση μιας εσωτερικής μονάδας modules/network, καθώς προέρχεται από έναν τοπικό κατάλογο.

    circle-info

    Σε ένα μεγάλο έργο όπως αυτό που περιγράφεται εδώ, τα οφέλη από τη χρήση της Terragrunt γίνονται πολύ ορατά. Ανατρέξτε στην ενότητα .

    circle-check
    • Ιδανικό για έργα όπου η υποδομή είναι λογικά διαχωρισμένη (ξεχωριστοί λογαριασμοί AWS)

    • Καλό όταν δεν υπάρχει ανάγκη τροποποίησης πόρων που διαμοιράζονται μεταξύ λογαριασμών AWS (ένα περιβάλλον = ένας λογαριασμός AWS = ένα αρχείο κατάστασης)

    circle-exclamation

    Καθώς το έργο μεγαλώνει, θα είναι πιο δύσκολο να διατηρούνται αυτά τα περιβάλλοντα ενημερωμένα μεταξύ τους. Εξετάστε το ενδεχόμενο χρήσης μονάδων υποδομής (έτοιμων ή εσωτερικών) για επαναλαμβανόμενες εργασίες.

    hashtag

    Καλό όταν δεν υπάρχει ανάγκη για την ενορχήστρωση των αλλαγών μεταξύ των περιβαλλόντων

  • Καλό όταν οι πόροι υποδομής είναι διαφορετικοί ανά περιβάλλον επίτηδες και δεν μπορούν να γενικευτούν (π.χ. κάποιοι πόροι απουσιάζουν από ένα περιβάλλον ή από ορισμένες περιοχές)

  • Terraform Registryarrow-up-right
    Παραδείγματα Δομών Κώδικα με Terragrunt

    Αναφορές

    circle-info

    Υπάρχουν πολλοί άνθρωποι που δημιουργούν σπουδαίο περιεχόμενο και διαχειρίζονται έργα ανοιχτού κώδικα σχετικά με την κοινότητα Terraform, αλλά δεν μπορώ να σκεφτώ την καλύτερη δομή για να παραθέσω αυτούς τους συνδέσμους εδώ χωρίς να αντιγράψω λίστες όπως η awesome-terraformarrow-up-right.

    https://twitter.com/antonbabenko/lists/terraform-expertsarrow-up-right - Λίστα ανθρώπων που εργάζονται πολύ ενεργά με το Terraform και μπορούν να σας πουν πολλά (αν τους ρωτήσετε).

    https://github.com/shuaibiyy/awesome-terraformarrow-up-right - Επιμελημένος κατάλογος πηγών σχετικά με το Terraform της HashiCorp.

    http://bit.ly/terraform-youtubearrow-up-right - Το κανάλι "Η εβδομαδιαία δόση σας από το Terraform" στο YouTube από τον Anton Babenko. Ζωντανές ροές με κριτικές, συνεντεύξεις, ερωταπαντήσεις, ζωντανό coding και λίγο hacking με την Terraform.

    - Εβδομαδιαίο ενημερωτικό δελτίο για το Terraform. Διάφορα νέα στον κόσμο του Terraform (έργα, ανακοινώσεις, συζητήσεις) από τον Anton Babenko.

    https://weekly.tfarrow-up-right

    Συχνές ερωτήσεις

    FTP (Frequent Terraform Problems)

    hashtag
    Ποια είναι τα εργαλεία που πρέπει να γνωρίζω και να εξετάσω τη χρήση τους;

    • Terragruntarrow-up-right - Εργαλείο ενορχήστρωσης

    • - Linter κώδικα

    • - Διαχειριστής έκδοσης

    • - Αυτοματοποίηση αιτημάτων pull

    • - Συλλογή git hooks για την Terraform που μπορούν να χρησιμοποιηθούν με το

    • - Εκτιμήσεις κόστους cloud για την Terraform σε pull requests. Λειτουργεί επίσης με την Terragrunt, το Atlantis και το pre-commit-terraform.

    hashtag
    Ποιες είναι οι λύσεις για την «» με τις ενότητες;

    Οι εκδόσεις των μονάδων πόρων και υποδομών θα πρέπει να προσδιορίζονται. Οι πάροχοι θα πρέπει να διαμορφώνονται εκτός των μονάδων, αλλά μόνο στη σύνθεση. Η έκδοση των παρόχων και του Terraform μπορεί επίσης να κλειδωθεί.

    Δεν υπάρχει κύριο εργαλείο διαχείρισης εξαρτήσεων, αλλά υπάρχουν ορισμένες συμβουλές για να γίνουν οι προδιαγραφές εξαρτήσεων λιγότερο προβληματικές. Για παράδειγμα, το μπορεί να χρησιμοποιηθεί για την αυτοματοποίηση των ενημερώσεων των εξαρτήσεων. Το Dependabot δημιουργεί pull requests για να διατηρείτε τις εξαρτήσεις σας ασφαλείς και ενημερωμένες. Το Dependabot υποστηρίζει ρυθμίσεις Terraform.

    Γράφοντας ρυθμίσεις για την Τerraform

    hashtag
    Χρησιμοποιήστε locals για να καθορίσετε ρητές εξαρτήσεις μεταξύ πόρων

    Χρήσιμος τρόπος για να δώσετε μια υπόδειξη στην Terraform ότι κάποιοι πόροι πρέπει να διαγραφούν πριν, ακόμη και όταν δεν υπάρχει άμεση εξάρτηση στις ρυθμίσεις της Terraform.

    tflintarrow-up-right
    tfenvarrow-up-right
    Atlantisarrow-up-right
    pre-commit-terraformarrow-up-right
    pre-commit frameworkarrow-up-right
    Infracostarrow-up-right
    κόλαση των εξαρτήσεωνarrow-up-right
    Dependabotarrow-up-right
    hashtag
    Terraform 0.12 - Απαιτούμενα εναντίον Προαιρετικών ορισμάτων
    1. Το Απαιτούμενο όρισμα index_document πρέπει να οριστεί, αν το var.website δεν είναι ένα κενό map.

    2. Το προαιρετικό όρισμα error_document μπορεί να παραληφθεί.

    https://raw.githubusercontent.com/antonbabenko/terraform-best-practices/master/snippets/locals.tfarrow-up-right
    terraform.tfvars
    website = {
      index_document = "index.html"
    }
    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)
        }
      }
    }

    Συμβάσεις ονοματοδοσίας

    hashtag
    Γενικές συμβάσεις

    circle-info

    Δεν θα πρέπει να υπάρχει κανένας λόγος να μην ακολουθείτε τουλάχιστον αυτές τις συμβάσεις :)

    circle-info

    Προσέξτε ότι οι πραγματικοί πόροι του cloud συχνά έχουν περιορισμούς στα επιτρεπόμενα ονόματα. Ορισμένοι πόροι, για παράδειγμα, δεν μπορούν να περιέχουν παύλες, ενώ ορισμένοι πρέπει να είναι γραμμένοι με κεφαλαία γράμματα. Οι συμβάσεις σε αυτό το βιβλίο αναφέρονται στα ίδια τα ονόματα του Terraform.

    1. Χρησιμοποιήστε _ (υπογράμμιση) αντί για - (παύλα) παντού (σε ονόματα πόρων, ονόματα πηγών δεδομένων, ονόματα μεταβλητών, εξόδους κλπ.).

    2. Προτιμήστε να χρησιμοποιείτε πεζά γράμματα και αριθμούς (παρόλο που υποστηρίζεται το UTF-8).

    hashtag
    Ορίσματα πηγής πόρων και δεδομένων

    1. Μην επαναλαμβάνετε τον τύπο του πόρου στο όνομα του πόρου (ούτε μερικώς ούτε πλήρως):

    circle-check
    triangle-exclamation
    triangle-exclamation
    1. Το όνομα του πόρου θα πρέπει να ονομάζεται this εάν δεν υπάρχει πιο περιγραφικό και γενικό όνομα ή εάν η μονάδα πόρων δημιουργεί έναν μόνο πόρο αυτού του τύπου (π.χ. στη υπάρχει ένας μόνο πόρος τύπου aws_nat_gateway και πολλαπλοί πόροι τύπου aws_route_table, οπότε το aws_nat_gateway θα πρέπει να ονομάζεται this και το aws_route_table θα πρέπει να έχει πιο περιγραφικά ονόματα - όπως private, public

    hashtag
    Παραδείγματα κώδικα πόρου

    hashtag
    Χρήση του count / for_each

    circle-check
    triangle-exclamation

    hashtag
    Τοποθέτηση ετικετών/tags

    circle-check
    triangle-exclamation

    hashtag
    Συνθήκες σε count

    circle-check

    hashtag
    Μεταβλητές

    1. Μην ανακαλύπτετε ξανά τον τροχό στις μονάδες πόρων: χρησιμοποιήστε το όνομα/name, την περιγραφή/description και την προεπιλεγμένη/default τιμή για τις μεταβλητές όπως ορίζονται στην ενότητα «Αναφορά ορίσματος» για τον πόρο με τον οποίο εργάζεστε.

    hashtag
    Outputs

    Κάντε τα outputs συνεπή και κατανοητά εκτός του πεδίου εφαρμογής της (όταν ένας χρήστης χρησιμοποιεί μια μονάδα θα πρέπει να είναι προφανές τι τύπο και τι ιδιότητα έχει η τιμή που επιστρέφει).

    1. Το όνομα του output θα πρέπει να περιγράφει την ιδιότητα που περιέχει και να είναι λιγότερο «ελεύθερο» από ό,τι θα θέλατε κανονικά.

    2. Μια καλή δομή για το όνομα του output μοιάζει με {name}_{type}_{attribute} , όπου:

      1. {name}

    hashtag
    Παραδείγματα κώδικαoutput

    Επιστρέψτε το πολύ ένα ID τoυ security group

    circle-check

    Όταν υπάρχουν πολλαπλοί πόροι του ίδιου τύπου, το this θα πρέπει να παραλείπεται στο όνομα τoυ output:

    triangle-exclamation

    hashtag
    Χρησιμοποιήστε όνομα πληθυντικού αν η τιμή που επιστρέφει είναι λίστα

    circle-check
    ,
    database
    ).
  • Χρησιμοποιείτε πάντα ουσιαστικά στον ενικό αριθμό για τα ονόματα.

  • Χρησιμοποιήστε - μέσα σε τιμές ορισμάτων και σε σημεία όπου η τιμή θα είναι εκτεθειμένη σε άνθρωπο (π.χ. μέσα στο όνομα DNS του RDS instance).

  • Συμπεριλάβετε το όρισμα count / for_each μέσα σε μπλοκ πόρων ή πηγής δεδομένων ως το πρώτο όρισμα στην κορυφή και διαχωρίστε το με νέα γραμμή μετά από αυτό.

  • Συμπεριλάβετε το όρισμα tags, εάν υποστηρίζεται από τον πόρο, ως το τελευταίο πραγματικό όρισμα, ακολουθούμενο από τα depends_on και lifecycle, εάν είναι απαραίτητο. Όλα αυτά θα πρέπει να διαχωρίζονται με μία κενή γραμμή.

  • Όταν χρησιμοποιείτε συνθήκες/conditions σε ένα argument count / for_each προτιμήστε boolean τιμές αντί να χρησιμοποιείτε length ή άλλες εκφράσεις.

  • Η υποστήριξη για επικύρωση σε μεταβλητές είναι μάλλον περιορισμένη (π.χ. δεν μπορεί να έχει πρόσβαση σε άλλες μεταβλητές ή να κάνει αναζητήσεις). Προγραμματίστε αναλόγως, διότι σε πολλές περιπτώσεις αυτή η λειτουργία είναι άχρηστη.
  • Χρησιμοποιήστε τον πληθυντικό αριθμό στο όνομα μιας μεταβλητής όταν ο τύπος είναι list(...) ή map(...).

  • Ταξινομήστε τα κλειδιά σε ένα μπλοκ μεταβλητών ως εξής: περιγραφή/description , τύπος/type, προεπιλογή/default, επικύρωση/validation.

  • Περιλαμβάνετε πάντα περιγραφή/description σε όλες τις μεταβλητές ακόμα και αν νομίζετε ότι είναι προφανές (θα σας χρειαστεί στο μέλλον).

  • Προτιμήστε τη χρήση απλών τύπων (number, string, list(...), map(...), any) έναντι ειδικών τύπων όπως object() εκτός αν χρειάζεται να έχετε αυστηρούς περιορισμούς σε κάθε κλειδί.

  • Χρησιμοποιήστε συγκεκριμένους τύπους όπως map(map(string)) αν όλα τα στοιχεία του map έχουν τον ίδιο τύπο (π.χ. string) ή μπορούν να μετατραπούν σε αυτόν (π.χ. ο τύπος number μπορεί να μετατραπεί σε string).

  • Χρησιμοποιήστε τύπο any για να απενεργοποιήσετε την επικύρωση τύπου ξεκινώντας από ένα συγκεκριμένο βάθος ή όταν πρέπει να υποστηρίζονται πολλαπλοί τύποι.

  • Η τιμή {} είναι μερικές φορές ένα map αλλά μερικές φορές ένα αντικείμενο. Χρησιμοποιήστε το tomap(....) για να φτιάξετε ένα map επειδή δεν υπάρχει τρόπος να φτιάξετε ένα αντικείμενο.

  • είναι ένα όνομα πόρου ή πηγής δεδομένων χωρίς πρόθεμα παρόχου. Το
    {name}
    για το
    aws_subnet
    είναι το
    subnet
    , για το
    aws_vpc
    είναι το
    vpc
    .
  • {type} είναι ο τύπος μιας πηγής πόρων.

  • {attribute} είναι ένα χαρακτηριστικό που επιστρέφεται από το output

  • .

  • Εάν το output επιστρέφει μια τιμή με συναρτήσεις παρεμβολής/interpolation functions και πολλαπλούς πόρους, τα {name} και {type} εκεί θα πρέπει να είναι όσο το δυνατόν πιο γενικά (το this ως πρόθεμα θα πρέπει να παραλείπεται). .

  • Αν η επιστρεφόμενη τιμή είναι μια λίστα θα πρέπει να έχει όνομα στον πληθυντικό. .

  • Πάντα να περιλαμβάνετε περιγραφή/description για όλα τα outputs ακόμα και αν νομίζετε ότι είναι προφανής.

  • Αποφύγετε να ορίσετε ευαίσθητο/sensitive όρισμα εκτός αν ελέγχετε πλήρως τη χρήση αυτού του output σε όλα τα σημεία σε όλες τις μονάδες.

  • Προτιμήστε την try() (διαθέσιμη από το Terraform 0.13) έναντι της element(concat(...)) (παλαιότερη προσέγγιση για την έκδοση πριν την 0.13)

  • μονάδα AWS VPCarrow-up-right
    `resource "aws_route_table" "public" {}`
    `resource "aws_route_table" "public_route_table" {}`
    `resource "aws_route_table" "public_aws_route_table" {}`
    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
    }
    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     = "..."
    }
    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
    }
    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, "")
    }
    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)
    }
    outputs.tf
    output "rds_cluster_instance_endpoints" {
      description = "A list of all cluster instance endpoints"
      value       = aws_rds_cluster_instance.this.*.endpoint
    }
    Δείτε παραδείγματα
    Δείτε παράδειγμα
    Δείτε παράδειγμα

    Βασικές έννοιες

    Η επίσημη τεκμηρίωση του Terraform περιγράφει όλες τις πτυχές της διαμόρφωσης με λεπτομέρειεςarrow-up-right. Διαβάστε την προσεκτικά για να κατανοήσετε το υπόλοιπο αυτής της ενότητας.

    Αυτή η ενότητα περιγράφει βασικές έννοιες που χρησιμοποιούνται μέσα στο βιβλίο.

    hashtag
    Πόρος

    Ως πόρος λογίζεται ένα aws_vpc, ένα aws_db_instance κλπ. Ένας πόρος ανήκει σε έναν πάροχο, δέχεται ορίσματα, εξάγει χαρακτηριστικά και έχει κύκλο ζωής. Ένας πόρος μπορεί να δημιουργηθεί, να ανακτηθεί, να ενημερωθεί και να διαγραφεί.

    hashtag
    Μονάδα (module) πόρων

    Η μονάδα πόρων είναι μια συλλογή συνδεδεμένων πόρων οι οποίοι εκτελούν από κοινού την κοινή ενέργεια (π.χ. η δημιουργεί VPC, subnets, NAT gateway κλπ.). Εξαρτάται από τη διαμόρφωση του παρόχου, η οποία μπορεί να οριστεί σε αυτήν ή σε δομές υψηλότερου επιπέδου (π.χ. στη μονάδα υποδομής).

    hashtag
    Μονάδα υποδομής

    Μια μονάδα υποδομής είναι μια συλλογή από μονάδες πόρων, οι οποίες μπορεί να μην συνδέονται λογικά, αλλά στην τρέχουσα κατάσταση/έργο/ρύθμιση εξυπηρετούν τον ίδιο σκοπό. Καθορίζει τη διαμόρφωση για τους παρόχους, η οποία μεταβιβάζεται στις μεταγενέστερες μονάδες πόρων και στους πόρους. Συνήθως περιορίζεται να δουλεύει σε μία οντότητα ανά λογικό διαχωριστή (π.χ. AWS Region, Google Project).

    Για παράδειγμα, η μονάδα χρησιμοποιεί μονάδες πόρων όπως οι και για τη διαχείριση της υποδομής που απαιτείται για τη εκτέλεση σε .

    Ένα άλλο παράδειγμα είναι η μονάδα όπου πολλαπλές μονάδες χρησιμοποιούνται μαζί για τη διαχείριση της υποδομής καθώς και η χρήση πόρων Docker για τη δημιουργία, την προώθηση και την ανάπτυξη Docker images. Όλα σε ένα σύνολο.

    hashtag
    Σύνθεση

    Η σύνθεση είναι μια συλλογή μονάδων υποδομής, η οποία μπορεί να εκτείνεται σε διάφορες λογικά διαχωρισμένες περιοχές (π.χ. AWS regions, αρκετοί λογαριασμοί AWS). Η σύνθεση χρησιμοποιείται για να περιγράψει την πλήρη υποδομή που απαιτείται για ολόκληρο τον οργανισμό ή το έργο.

    Μια σύνθεση αποτελείται από μονάδες υποδομής, οι οποίες αποτελούνται από μονάδες πόρων, οι οποίες υλοποιούν μεμονωμένους πόρους.

    hashtag
    Πηγή δεδομένων

    Η πηγή δεδομένων εκτελεί μια λειτουργία μόνο για ανάγνωση και εξαρτάται από τη διαμόρφωση του παρόχου, χρησιμοποιείται σε μια μονάδα πόρων και μια μονάδα υποδομής.

    Η πηγή δεδομένων terraform_remote_state λειτουργεί ως «συγκολλητική ουσία» για μονάδες και συνθέσεις υψηλότερου επιπέδου.

    Η πηγή δεδομένων επιτρέπει σε ένα εξωτερικό πρόγραμμα να ενεργεί ως πηγή δεδομένων, εκθέτοντας αυθαίρετα δεδομένα για χρήση αλλού στην διαμόρφωση του Terraform. Ακολουθεί ένα παράδειγμα από τη μονάδα όπου το όνομα αρχείου υπολογίζεται με την κλήση ενός εξωτερικού Python script.

    Η πηγή δεδομένων πραγματοποιεί μια κλήση HTTP GET στη δεδομένη διεύθυνση URL και εξάγει πληροφορίες σχετικά με την απόκριση, η οποία είναι συχνά χρήσιμη για τη λήψη πληροφοριών από endpoints όπου δεν υπάρχει εγγενής πάροχος Terraform.

    hashtag
    Απομακρυσμένη κατάσταση

    Οι μονάδες υποδομής και οι συνθέσεις θα πρέπει να διατηρούν την σε μια απομακρυσμένη τοποθεσία όπου μπορεί να ανακτηθεί από άλλους με ελεγχόμενο τρόπο (π.χ. προσδιορισμός ACL, versioning, logging).

    hashtag
    Πάροχος, παροχέας, κλπ.

    Οι πάροχοι, οι παροχείς και μερικοί άλλοι όροι περιγράφονται πολύ καλά στo επίσημo εγχειρίδιο και δεν έχει νόημα να τα επαναλάβουμε εδώ. Κατά τη γνώμη μου, έχουν ελάχιστη σχέση με τη συγγραφή καλών μονάδων Terraform.

    hashtag
    Γιατί είναι τόσο δύσκολο;

    Ενώ οι μεμονωμένοι πόροι μοιάζουν με άτομα σε επίπεδο υποδομής, οι μονάδες πόρων μοιάζουν με μόρια (που αποτελούνται από άτομα). Μια μονάδα είναι η μικρότερη εκδοχή οντότητας που μπορεί να διαμοιραστεί. Έχει έναν ακριβή κατάλογο ορισμάτων, υλοποιεί τη βασική λογική μιας τέτοιας μονάδας για να κάνει την απαιτούμενη λειτουργία. π.χ., η μονάδα δημιουργεί τους πόρους aws_security_group και aws_security_group_rule με βάση τo input. Αυτή η μονάδα πόρων από μόνη της μπορεί να χρησιμοποιηθεί μαζί με άλλες μονάδες για τη δημιουργία της μονάδας υποδομής.

    Η πρόσβαση σε δεδομένα μεταξύ των μορίων (μονάδες πόρων και μονάδες υποδομής) πραγματοποιείται χρησιμοποιώντας τα output και τις πηγές δεδομένων των μονάδων.

    Η πρόσβαση μεταξύ συνθέσεων πραγματοποιείται συχνά με τη χρήση απομακρυσμένων πηγών δεδομένων κατάστασης. Υπάρχουν .

    Όταν τοποθετούμε τις έννοιες που περιγράφονται παραπάνω σε ψευδοσχέσεις μπορεί να μοιάζει ως εξής:

    μονάδα AWS VPC Terraformarrow-up-right
    terraform-aws-atlantisarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-aws-security-grouparrow-up-right
    Atlantisarrow-up-right
    AWS Fargatearrow-up-right
    terraform-aws-cloudqueryarrow-up-right
    terraform-aws-modulesarrow-up-right
    εξωτερικήarrow-up-right
    terraform-aws-lambdaarrow-up-right
    httparrow-up-right
    Terraform κατάστασή τουςarrow-up-right
    terraform-aws-security-grouparrow-up-right
    πολλοί τρόποι διαμοιρασμού δεδομένων μεταξύ συνθέσεωνarrow-up-right
    Απλή σύνθεση υποδομής
    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)
        }
      }
    }

    Διαμόρφωση κώδικα

    circle-info
    • Τα παραδείγματα και οι μονάδες Terraform θα πρέπει να περιέχουν ένα εγχειρίδιο που να εξηγεί τα χαρακτηριστικά και τον τρόπο χρήσης τους.

    • Όλοι οι σύνδεσμοι στα αρχεία README.md θα πρέπει να είναι απόλυτοι για να τους εμφανίζει σωστά η ιστοσελίδα του Terraform registry.

    • To εγχειρίδιο μπορεί να περιλαμβάνει διαγράμματα που δημιουργήθηκαν με το και σχέδια που δημιουργήθηκαν με το .

    • Χρησιμοποιήστε για να βεβαιωθείτε ότι ο κώδικας είναι έγκυρος, σωστά μορφοποιημένος και με αυτόματη καταγραφή εγχειριδίου πριν γίνει pushed στο git και ελεχγθεί από ανθρώπους.

    hashtag
    Εγχειρίδιο

    hashtag
    Αυτόματα παραγόμενο εγχειρίδιο

    Το είναι ένα framework για τη διαχείριση και τη συντήρηση πολυγλωσσικών pre-commit hooks. Είναι γραμμένο σε Python και είναι ένα ισχυρό εργαλείο για να κάνετε κάτι αυτόματα στο μηχάνημα ενός προγραμματιστή πριν ο κώδικας γίνει commit σε ένα git repository. Κανονικά, χρησιμοποιείται για την εκτέλεση linters και τη μορφοποίηση κώδικα (βλ. ).

    Με τις ρυθμίσεις Terraform το pre-commit μπορεί να χρησιμοποιηθεί για τη μορφοποίηση και την επικύρωση κώδικα, καθώς και για την ενημέρωση τoυ εγχειριδίου.

    Ελέγξτε το για να εξοικειωθείτε με αυτό, καθώς και υπάρχοντα repositories (π.χ. ) όπου αυτό χρησιμοποιείται ήδη.

    hashtag
    terraform-docs

    Το είναι ένα εργαλείο που κάνει τη δημιουργία εγχειριδίου από τις μονάδες Terraform σε διάφορες output μορφές . Μπορείτε να το εκτελέσετε χειροκίνητα (χωρίς pre-commit hooks) ή να χρησιμοποιήσετε για να ενημερώνεται αυτόματα το εγχειρίδιο.

    @todo: Εκδόσεις εγγράφων μονάδων, έκδοση, ενέργειες GH

    hashtag
    Πόροι

    1. Blog του :

    mermaidarrow-up-right
    cloudcraft.coarrow-up-right
    Terraform pre-commit hooksarrow-up-right
    pre-commitarrow-up-right
    υποστηριζόμενα hooksarrow-up-right
    pre-commit-terraform repositoryarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-docsarrow-up-right
    pre-commit-terraform hooksarrow-up-right
    αρχική σελίδα του pre-commit frameworkarrow-up-right
    Συλλογή git hooks για τhn Terraform που μπορούν να χρησιμοποιηθούν με το pre-commit frameworkarrow-up-right
    Dean Wilsonarrow-up-right
    pre-commit hooks και terraform - ένα δίχτυ ασφαλείας για τα repositories σαςarrow-up-right

    Υποδομή μεσαίου μεγέθους με Terraform

    Πηγή: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/medium-terraformarrow-up-right

    Αυτό το παράδειγμα περιέχει κώδικα ως παράδειγμα δόμησης των ρυθμίσεων Terraform για μια μεσαίου μεγέθους υποδομή που χρησιμοποιεί:

    • 2 λογαριασμούς AWS

    • 2 ξεχωριστά περιβάλλοντα (prod και stage που δεν διαμοιράζονται τίποτα). Κάθε περιβάλλον ζει σε ξεχωριστό λογαριασμό AWS

    • Κάθε περιβάλλον χρησιμοποιεί διαφορετική έκδοση της έτοιμης μονάδας υποδομής (alb) που προέρχεται από το

    • Κάθε περιβάλλον χρησιμοποιεί την ίδια έκδοση μιας εσωτερικής μονάδας modules/network, καθώς προέρχεται από έναν τοπικό κατάλογο.

    circle-check
    • Ιδανικό για έργα όπου η υποδομή διαχωρίζεται λογικά (ξεχωριστοί λογαριασμοί AWS)

    • Καλό όταν δεν υπάρχει ανάγκη τροποποίησης πόρων που διαμοιράζονται μεταξύ λογαριασμών AWS (ένα περιβάλλον = ένας λογαριασμός AWS = ένα αρχείο κατάστασης)

    circle-exclamation

    Καθώς το έργο μεγαλώνει, θα είναι πιο δύσκολο να διατηρούνται αυτά τα περιβάλλοντα ενημερωμένα μεταξύ τους. Εξετάστε το ενδεχόμενο χρήσης μονάδων υποδομής (έτοιμων ή εσωτερικών) για επαναλαμβανόμενες εργασίες.

    hashtag

    Καλό όταν δεν υπάρχει ανάγκη ενορχήστρωσης των αλλαγών μεταξύ των περιβαλλόντων

  • Καλό όταν οι πόροι υποδομής είναι διαφορετικοί ανά περιβάλλον επίτηδες και δεν μπορούν να γενικευτούν (π.χ. κάποιοι πόροι απουσιάζουν από ένα περιβάλλον ή από ορισμένες περιοχές)

  • Terraform registryarrow-up-right

    Καλώς ήρθατε

    Το παρόν έγγραφο αποτελεί μια προσπάθεια συστηματικής περιγραφής των βέλτιστων πρακτικών χρήσης του Terraform και παροχής συστάσεων για τα συχνότερα προβλήματα που αντιμετωπίζουν οι χρήστες του.

    Το Terraformarrow-up-right είναι ένα πολύ ισχυρό εργαλείο (αν όχι το ισχυρότερο που υπάρχει αυτή τη στιγμή) και ένα από τα πιο συχνά χρησιμοποιούμενα εργαλεία που επιτρέπουν τη διαχείριση της υποδομής ως κώδικα. Επιτρέπει στους προγραμματιστές να κάνουν πολλά πράγματα και δεν τους περιορίζει στο να κάνουν πράγματα με τρόπους που θα είναι δύσκολο να υποστηριχθούν ή να ενσωματωθούν.

    Ορισμένες πληροφορίες που περιγράφονται σε αυτό το βιβλίο μπορεί να μην φαίνονται ως οι βέλτιστες πρακτικές. Το γνωρίζω αυτό και για να βοηθήσω τους αναγνώστες να διαχωρίσουν ποιες είναι οι καθιερωμένες βέλτιστες πρακτικές και ποιος είναι απλώς ένας άλλος δογματικός τρόπος να γίνονται τα πράγματα, χρησιμοποιώ μερικές φορές υποδείξεις για να δώσω κάποιο πλαίσιο και εικονίδια για να προσδιορίσω το επίπεδο ωριμότητας σε κάθε υποενότητα που σχετίζεται με τις βέλτιστες πρακτικές.

    Το βιβλίο ξεκίνησε στην ηλιόλουστη Μαδρίτη το 2018 και είναι διαθέσιμο δωρεάν στην διεύθυνση https://www.terraform-best-practices.com/arrow-up-right.

    Λίγα χρόνια αργότερα έχει ενημερωθεί με περισσότερες πραγματικές βέλτιστες πρακτικές που είναι διαθέσιμες με το Terraform 1.0. Τελικά, αυτό το βιβλίο θα πρέπει να περιέχει τις περισσότερες από τις αδιαμφισβήτητες βέλτιστες πρακτικές και συστάσεις για τους χρήστες του Terraform.

    hashtag
    Χορηγοί

    Please if you want to become a sponsor.

    hashtag
    Μεταφράσεις

    Επικοινωνήστε μαζί μου αν θέλετε να βοηθήσετε στη μετάφραση αυτού του βιβλίου σε άλλες γλώσσες.

    hashtag
    Συνεισφορές

    Θέλω πάντα να λαμβάνω σχόλια και να ενημερώνω αυτό το βιβλίο καθώς η κοινότητα ωριμάζει και νέες ιδέες εφαρμόζονται και επαληθεύονται με την πάροδο του χρόνου.

    Αν ενδιαφέρεστε για συγκεκριμένα θέματα, παρακαλώ ανοίξτε ή κάντε 'thumb up' σε ένα θέμα που θέλετε να καλυφθεί. Αν αισθάνεστε ότι έχετε περιεχόμενο και θέλετε να συνεισφέρετε, γράψτε ένα προσχέδιο και υποβάλετε ένα pull request (μην ανησυχείτε για τη συγγραφή καλού κειμένου σε αυτό το σημείο!).\

    hashtag
    Συγγραφείς

    Αυτό το βιβλίο συντηρείται από τον με τη βοήθεια διαφόρων συνεργατών και μεταφραστών.\

    hashtag
    Άδεια

    Το έργο αυτό διατίθεται με άδεια Apache 2 License. Δείτε το LICENSE για πλήρεις λεπτομέρειες.

    Οι συγγραφείς και οι συντελεστές αυτού του περιεχομένου δεν μπορούν να εγγυηθούν την εγκυρότητα των πληροφοριών που βρίσκονται εδώ. Βεβαιωθείτε ότι κατανοείτε ότι οι πληροφορίες που παρέχονται εδώ παρέχονται δωρεάν και ότι δεν δημιουργείται κανενός είδους συμφωνία ή σύμβαση μεταξύ εσάς και οποιουδήποτε προσώπου που σχετίζεται με αυτό το περιεχόμενο ή το έργο. Οι συγγραφείς και οι συντελεστές δεν αναλαμβάνουν και αποποιούνται με το παρόν κάθε ευθύνη έναντι οποιουδήποτε μέρους για οποιαδήποτε απώλεια, ζημία ή διαταραχή που προκαλείται από λάθη ή παραλείψεις στις πληροφορίες που περιέχονται στο παρόν περιεχόμενο, σχετίζονται με αυτό ή συνδέονται με αυτό, είτε τα εν λόγω λάθη ή παραλείψεις οφείλονται σε αμέλεια, ατύχημα ή οποιαδήποτε άλλη αιτία.

    Copyright © 2018-2023 Anton Babenko.

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

    —

    contact mearrow-up-right
    العربية (Arabic)chevron-right
    Bosanski (Bosnian)chevron-right
    Português (Brazilian Portuguese)chevron-right
    Englishchevron-right
    Français (French)chevron-right
    ქართული (Georgian)chevron-right
    Deutsch (German)chevron-right
    עברית (Hebrew)chevron-right
    हिंदी (Hindi)chevron-right
    Bahasa Indonesia (Indonesian)chevron-right
    Italiano (Italian)chevron-right
    日本語 (Japanese)chevron-right
    ಕನ್ನಡ (Kannada)chevron-right
    한국어 (Korean)chevron-right
    Polski (Polish)chevron-right
    Română (Romanian)chevron-right
    简体中文 (Simplified Chinese)chevron-right
    Español (Spanish)chevron-right
    Türkçe (Turkish)chevron-right
    Українська (Ukrainian)chevron-right
    اردو (Urdu)chevron-right
    ένα θέμαarrow-up-right
    Anton Babenkoarrow-up-right
    arrow-up-right
    Compliance.tfarrow-up-right