2017-05-15 4 views
1

Ich spiele ein wenig mit Terraform herum und frage mich, ob das möglich ist. Es empfiehlt sich, jeder Ressource, die Sie in AWS erstellen, Tags zuzuordnen (z. B.). Was Sie also zuerst tun, ist eine Tagging-Strategie (zB welche Geschäftseinheit, ein Name der App, ein dafür verantwortliches Team, ...).Tags im zentralen Bereich in TerraForm definieren

In Terraform bedeutet dies jedoch, dass Sie jeden Tag-Block für jede Ressource wiederholen müssen. Dies ist nicht sehr praktisch. Wenn Sie einen der Tag-Namen aktualisieren möchten, müssen Sie jede von Ihnen erstellte Ressource aktualisieren.

Zum Beispiel:

resource "aws_vpc" "vpc" { 
    cidr_block = "${var.cidr}" 

    tags { 
    Name   = "${var.name}" 
    Project  = "${var.projectname}" 
    Environment = "${var.environment}" 
    } 
} 

Wenn ich ein Subnetz und EC2 in dieser VPC mit den gleichen Tags erstellen will, muß ich, dass die Tags-Block zu wiederholen. Wenn ich später einen der Tag-Namen aktualisieren möchte, muss ich jede Ressource einzeln aktualisieren, was sehr zeitaufwendig und mühsam ist.

Gibt es eine Möglichkeit, einen Block von Tags an einem zentralen Ort zu erstellen und darauf Bezug zu nehmen? Ich habe an Module gedacht, aber das passt nicht zur Definition eines Moduls.

+0

Obwohl es nicht vollständig ist, was ich will, ist es ein Anfang. Ich habe mir das Github-Repository mit den Terraform-Community-Modulen angeschaut und einen wesentlich saubereren Weg gefunden: https://github.com/terraform-community-modules/tf_aws_vpc/. – Bjorn121

+0

Warum also nicht Ihre eigene Frage beantworten? – BMW

Antwort

4

Sie können auch versuchen local values von Version 0.10.3. Sie können einem Ausdruck einen symbolischen lokalen Namen zuweisen, so dass er mehrfach in der Konfiguration ohne Wiederholung verwendet werden kann.

# Define the common tags for all resources 
locals { 
    common_tags = { 
    Component = "awesome-app" 
    Environment = "production" 
    } 
} 

# Create a resource that blends the common tags with instance-specific tags. 
resource "aws_instance" "server" { 
    ami   = "ami-123456" 
    instance_type = "t2.micro" 

    tags = "${merge(
    local.common_tags, 
    map(
     "Name", "awesome-app-server", 
     "Role", "server" 
    ) 
)}" 
} 
+0

Danke dafür. Beim Lesen der Dokumente sind diese modulspezifisch gemeint. Ich hätte gerne einen Standardsatz von Tags für alle AWS-Ressourcen und separate Module "vpc", "subnet" usw. Gibt es eine Best Practice, um diese von einer Top-Level-Definition in jedes Modul zu übertragen? – nikobelia

+0

Was meinen Sie mit modulspezifisch? Mit dem hier gezeigten Ansatz können Sie einen allgemeinen Satz von Tags in Ihrer Definition auf oberster Ebene definieren und diese an alle Ressourcen oder Module weitergeben, die das Tagging unterstützen. In einigen Fällen können Sie einfach 'tags = $ {local.common_tags}' 'setzen, oder wenn Sie zusätzlich zu den häufigen einige ressourcenspezifische Tags hinzufügen müssen, können Sie' merge' wie gezeigt verwenden. – glucas