Dieses Lab wurde mit unserem Partner HashiCorp entwickelt. Ihre personenbezogenen Daten werden möglicherweise an HashiCorp, den Lab-Sponsor, weitergegeben, wenn Sie in Ihrem Kontoprofil zugestimmt haben, Produktupdates, Mitteilungen und Angebote zu erhalten.
GSP751

Übersicht
Das Verwalten einer Infrastruktur mit Terraform führt nach und nach zur Erstellung immer komplexerer Konfigurationen. In Terraform ist die Komplexität von Konfigurationsdateien oder Verzeichnissen per se nicht beschränkt. Es lassen sich in einem Verzeichnis also immer weitere Konfigurationen erstellen und aktualisieren. Diese Vorgehensweise kann jedoch zu den folgenden Problemen führen:
- Es wird immer schwieriger, den Überblick über die Konfigurationsdateien zu behalten.
- Das Aktualisieren der Konfiguration kann heikel werden, da Änderungen an einem Block unbeabsichtigte Folgen für andere Konfigurationsblöcke haben können.
- Es kann zu mehr Duplikaten ähnlicher Konfigurationsblöcke kommen, beispielsweise wenn Sie separate Entwicklungs‑, Staging‑ und Produktionsumgebungen konfigurieren. Diese Teile der Konfiguration zu aktualisieren, kann kompliziert sein.
- Wenn Sie Elemente der Konfiguration zwischen Projekten und Teams teilen möchten, kann das Ausschneiden und Einfügen von Konfigurationsblöcken zu Fehlern führen und umständlich sein.
In diesem Lab lernen Sie, wie sich diese Probleme durch Module lösen lassen, welche Struktur Terraform-Module haben sowie welche Best Practices für das Verwenden und Erstellen von Modulen gelten.
Wozu dienen Module?
Module können die oben beschriebenen Probleme auf verschiedene Weise lösen:
-
Konfiguration strukturieren: In Modulen sind die Elemente einer Konfiguration zusammengefasst. Das erleichtert die Handhabung, das Durchführen von Änderungen sowie das Verständnis der Struktur. Selbst eine mäßig komplexe Infrastruktur kann Hunderte oder Tausende von Konfigurationszeilen erfordern. Mithilfe von Modulen können Sie die Konfiguration in logische Komponenten strukturieren.
-
Konfiguration kapseln: Ein weiterer Vorteil von Modulen ist das Kapseln der Konfiguration in einzelne logischen Komponenten. So lassen sich unbeabsichtigte Folgen verhindern, z. B. dass eine Änderung an einem Teil der Konfiguration versehentlich zu Änderungen an einer anderen Infrastruktur führt. Außerdem sinkt die Wahrscheinlichkeit einfacher Fehler, etwa die Verwendung des gleichen Namens für zwei verschiedene Ressourcen.
-
Konfiguration wiederverwenden: Die gesamte Konfiguration zu schreiben, ohne bereits vorhandenen Code zu verwenden, kann zeitaufwendig und fehleranfällig sein. Mit Modulen können Sie dagegen Zeit sparen und teure Fehler vermeiden, indem Sie Konfigurationen wiederverwenden, die von Ihnen selbst, Teammitgliedern oder anderen Terraform-Fachkräften geschrieben wurden, die Module veröffentlicht haben. Auch Sie können die von Ihnen geschriebenen Module für Ihr Team oder die Öffentlichkeit freigeben.
-
Für Konsistenz und die Anwendung von Best Practices sorgen: Module sorgen außerdem für mehr Konsistenz in Ihren Konfigurationen. Damit komplexe Konfigurationen überschaubar bleiben und Best Practices allgemein angewendet werden können, ist Konsistenz unerlässlich. Cloud-Anbieter bieten beispielsweise verschiedene Möglichkeiten zum Konfigurieren von Objektspeicherdiensten wie Amazon S3 (Simple Storage Service) oder Cloud Storage-Buckets von Google. Viele aufsehenerregende Sicherheitsvorfälle sind auf nicht ausreichend geschützte Objektspeicher zurückzuführen. Angesichts der Vielzahl komplexer Konfigurationsoptionen kann es leicht passieren, dass diese Dienste falsch konfiguriert werden.
Durch Module lassen sich solche Fehler reduzieren. Sie können zum Beispiel ein Modul erstellen, um festzulegen, wie die öffentlichen Website-Buckets Ihres Unternehmens konfiguriert werden, und ein weiteres für private Buckets für Logging-Anwendungen. Wenn die Konfiguration eines Ressourcentyps geändert werden muss, können Sie dies mithilfe eines Moduls für eine Ressource erledigen und auf alle Bereiche anwenden, in denen dieses Modul zum Einsatz kommt.
Ziele
Aufgaben in diesem Lab:
- Modul aus der Registry verwenden
- Modul erstellen
Einrichtung und Anforderungen
Vor dem Klick auf „Start Lab“ (Lab starten)
Lesen Sie diese Anleitung. Labs sind zeitlich begrenzt und können nicht pausiert werden. Der Timer beginnt zu laufen, wenn Sie auf Lab starten klicken, und zeigt Ihnen, wie lange Google Cloud-Ressourcen für das Lab verfügbar sind.
In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung durchführen – nicht in einer Simulations- oder Demo-Umgebung. Dazu erhalten Sie neue, temporäre Anmeldedaten, mit denen Sie für die Dauer des Labs auf Google Cloud zugreifen können.
Für dieses Lab benötigen Sie Folgendes:
- Einen Standardbrowser (empfohlen wird Chrome)
Hinweis: Nutzen Sie den privaten oder Inkognitomodus (empfohlen), um dieses Lab durchzuführen. So wird verhindert, dass es zu Konflikten zwischen Ihrem persönlichen Konto und dem Teilnehmerkonto kommt und zusätzliche Gebühren für Ihr persönliches Konto erhoben werden.
- Zeit für die Durchführung des Labs – denken Sie daran, dass Sie ein begonnenes Lab nicht unterbrechen können.
Hinweis: Verwenden Sie für dieses Lab nur das Teilnehmerkonto. Wenn Sie ein anderes Google Cloud-Konto verwenden, fallen dafür möglicherweise Kosten an.
Lab starten und bei der Google Cloud Console anmelden
-
Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Dialogfeld geöffnet, in dem Sie Ihre Zahlungsmethode auswählen können.
Auf der linken Seite befindet sich der Bereich „Details zum Lab“ mit diesen Informationen:
- Schaltfläche „Google Cloud Console öffnen“
- Restzeit
- Temporäre Anmeldedaten für das Lab
- Ggf. weitere Informationen für dieses Lab
-
Klicken Sie auf Google Cloud Console öffnen (oder klicken Sie mit der rechten Maustaste und wählen Sie Link in Inkognitofenster öffnen aus, wenn Sie Chrome verwenden).
Im Lab werden Ressourcen aktiviert. Anschließend wird ein weiterer Tab mit der Seite „Anmelden“ geöffnet.
Tipp: Ordnen Sie die Tabs nebeneinander in separaten Fenstern an.
Hinweis: Wird das Dialogfeld Konto auswählen angezeigt, klicken Sie auf Anderes Konto verwenden.
-
Kopieren Sie bei Bedarf den folgenden Nutzernamen und fügen Sie ihn in das Dialogfeld Anmelden ein.
{{{user_0.username | "Username"}}}
Sie finden den Nutzernamen auch im Bereich „Details zum Lab“.
-
Klicken Sie auf Weiter.
-
Kopieren Sie das folgende Passwort und fügen Sie es in das Dialogfeld Willkommen ein.
{{{user_0.password | "Password"}}}
Sie finden das Passwort auch im Bereich „Details zum Lab“.
-
Klicken Sie auf Weiter.
Wichtig: Sie müssen die für das Lab bereitgestellten Anmeldedaten verwenden. Nutzen Sie nicht die Anmeldedaten Ihres Google Cloud-Kontos.
Hinweis: Wenn Sie Ihr eigenes Google Cloud-Konto für dieses Lab nutzen, können zusätzliche Kosten anfallen.
-
Klicken Sie sich durch die nachfolgenden Seiten:
- Akzeptieren Sie die Nutzungsbedingungen.
- Fügen Sie keine Wiederherstellungsoptionen oder Zwei-Faktor-Authentifizierung hinzu (da dies nur ein temporäres Konto ist).
- Melden Sie sich nicht für kostenlose Testversionen an.
Nach wenigen Augenblicken wird die Google Cloud Console in diesem Tab geöffnet.
Hinweis: Wenn Sie auf Google Cloud-Produkte und ‑Dienste zugreifen möchten, klicken Sie auf das Navigationsmenü oder geben Sie den Namen des Produkts oder Dienstes in das Feld Suchen ein.
Cloud Shell aktivieren
Cloud Shell ist eine virtuelle Maschine, auf der Entwicklertools installiert sind. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud. Mit Cloud Shell erhalten Sie Befehlszeilenzugriff auf Ihre Google Cloud-Ressourcen.
-
Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren
.
-
Klicken Sie sich durch die folgenden Fenster:
- Fahren Sie mit dem Informationsfenster zu Cloud Shell fort.
- Autorisieren Sie Cloud Shell, Ihre Anmeldedaten für Google Cloud API-Aufrufe zu verwenden.
Wenn eine Verbindung besteht, sind Sie bereits authentifiziert und das Projekt ist auf Project_ID, eingestellt. Die Ausgabe enthält eine Zeile, in der die Project_ID für diese Sitzung angegeben ist:
Ihr Cloud-Projekt in dieser Sitzung ist festgelegt als {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
ist das Befehlszeilentool für Google Cloud. Das Tool ist in Cloud Shell vorinstalliert und unterstützt die Tab-Vervollständigung.
- (Optional) Sie können den aktiven Kontonamen mit diesem Befehl auflisten:
gcloud auth list
- Klicken Sie auf Autorisieren.
Ausgabe:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
Um das aktive Konto festzulegen, führen Sie diesen Befehl aus:
$ gcloud config set account `ACCOUNT`
- (Optional) Sie können die Projekt-ID mit diesem Befehl auflisten:
gcloud config list project
Ausgabe:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
Hinweis: Die vollständige Dokumentation für gcloud
finden Sie in Google Cloud in der Übersicht zur gcloud CLI.
Was ist ein Terraform-Modul?
Ein Terraform-Modul ist eine Gruppe von Terraform-Konfigurationsdateien in einem Verzeichnis. Selbst eine einfache Konfiguration, die aus einem Verzeichnis mit einer oder mehreren .tf
‑Dateien besteht, ist ein Modul. Wenn Sie Terraform-Befehle direkt aus einem solchen Verzeichnis ausführen, gilt es als Stammmodul. In diesem Sinne ist jede Terraform-Konfiguration Teil eines Moduls. Vielleicht haben Sie einen einfachen Satz Terraform-Konfigurationsdateien wie diesen:
├── LICENSE
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
Wenn Sie Terraform-Befehle aus dem Verzeichnis minimal-module
ausführen, gilt der Inhalt dieses Verzeichnisses als Stammmodul.
Module aufrufen
Für Terraform-Befehle werden nur die Konfigurationsdateien aus einem Verzeichnis direkt verwendet. Dies ist üblicherweise das aktuelle Arbeitsverzeichnis. Ihre Konfiguration kann jedoch Modulblöcke verwenden, um Module aus anderen Verzeichnissen aufzurufen. Bei Modulblöcken werden in Terraform dann die entsprechenden Konfigurationsdateien geladen und verarbeitet.
Ein Modul, das von einer anderen Konfiguration aufgerufen wird, wird manchmal als „untergeordnetes Modul“ dieser Konfiguration bezeichnet.
Lokale Module und Remotemodule
Module können entweder aus dem lokalen Dateisystem oder einer Remotequelle geladen werden. Terraform unterstützt verschiedene Remotequellen, einschließlich der Terraform Registry, der meisten Versionsverwaltungssysteme, HTTP-URLs sowie privater Terraform Cloud‑ oder Terraform Enterprise-Modul-Registries.
Best Practices für Module
Terraform-Module ähneln in vielerlei Hinsicht den Bibliotheken, Paketen oder Modulen der meisten Programmiersprachen und bieten ähnliche Vorzüge. Wie andere mehr oder weniger komplexe Computerprogramme sollten Terraform-Konfigurationen möglichst Module umfassen, um die oben genannten Vorteile zu ermöglichen.
Dafür werden die folgenden Best Practices empfohlen:
-
Planen Sie beim Schreiben Ihrer Konfiguration Module ein. Module sind trotz ihres höheren Zeitaufwands von Vorteil, selbst bei weniger komplexen Konfigurationen, die von einer Person verwaltet werden.
-
Verwenden Sie lokale Module, um Ihren Code zu strukturieren und zu kapseln. Selbst wenn Sie keine Remotemodule verwenden oder veröffentlichen, sinkt durch das Strukturieren der Konfiguration in Modulen von Anfang an der Aufwand für die Verwaltung und Aktualisierung der Konfiguration beträchtlich, wenn die Infrastruktur komplexer wird.
-
In der öffentlichen Terraform Registry finden Sie nützliche Module. So können Sie Ihre Konfiguration schnell und effektiv implementieren und sich dabei auf die Arbeit anderer stützen.
-
Veröffentlichen Sie Module und teilen Sie sie mit Ihrem Team. Infrastruktur wird meist von einem Team verwaltet und Module sind ein wichtiges Werkzeug, mit dem Teams Infrastruktur erstellen und verwalten können. Wie bereits erwähnt, können Sie Module öffentlich oder privat freigeben. Wie das funktioniert, erfahren Sie in einem anderen Lab dieser Reihe.
Aufgabe 1: Module aus der Registry verwenden
In diesem Abschnitt verwenden Sie Module aus der Terraform Registry, um eine Beispielumgebung in Google Cloud bereitzustellen. Die hier verwendeten Konzepte gelten für Module aus allen Quellen.
- Öffnen Sie die Terraform Registry-Seite für das Terraform-Modul „network“ in einem neuen Browsertab oder ‑fenster. Die Seite sieht so aus:

Die Seite enthält Informationen über das Modul und einen Link zum Quell-Repository. Auf der rechten Seite befinden sich ein Drop-down-Feld, in dem Sie die Modulversion auswählen können, sowie eine Anleitung zum Bereitstellen von Infrastruktur mit diesem Modul.
Zum Aufrufen eines Moduls wird das source
-Argument benötigt. In diesem Beispiel sucht Terraform in der Terraform Registry nach einem Modul, das mit dem angegebenen String übereinstimmt. Sie können aber auch eine URL oder einen lokalen Dateipfad als Quelle Ihrer Module verwenden. Eine Liste möglicher Modulquellen finden Sie in der Terraform-Dokumentation.
Das andere hier angezeigte Argument ist version
. Bei unterstützten Quellen können Sie darüber festlegen, welche Versionen des Moduls geladen werden sollen. In diesem Lab geben Sie eine genaue Versionsnummer für die verwendeten Module an. Weitere Möglichkeiten, Versionen festzulegen, finden Sie in der Dokumentation zu Modulen.
Andere Argumente für Modulblöcke werden als Eingabevariablen für die Module behandelt.
Terraform-Konfiguration erstellen
- Führen Sie zu Beginn die folgenden Befehle in Cloud Shell aus, um das einfache Beispielprojekt aus dem GitHub-Repository mit Terraform-Modulen von Google zu klonen und zum Zweig
v6.0.1
zu wechseln:
git clone https://github.com/terraform-google-modules/terraform-google-network
cd terraform-google-network
git checkout tags/v6.0.1 -b v6.0.1
So wird sichergestellt, dass Sie die richtige Versionsnummer verwenden.
-
Klicken Sie in der Cloud Shell-Symbolleiste auf Editor öffnen.
-
Wechseln Sie im Editor zu terraform-google-network/examples/simple_project
und öffnen Sie die Datei main.tf
. Ihre main.tf
-Konfiguration sollte so aussehen:
module "test-vpc-module" {
source = "terraform-google-modules/network/google"
version = "~> 6.0"
project_id = var.project_id
network_name = "my-custom-mode-network"
mtu = 1460
subnets = [
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
subnet_region = "us-west1"
},
{
subnet_name = "subnet-02"
subnet_ip = "10.10.20.0/24"
subnet_region = "us-west1"
subnet_private_access = "true"
subnet_flow_logs = "true"
},
{
subnet_name = "subnet-03"
subnet_ip = "10.10.30.0/24"
subnet_region = "us-west1"
subnet_flow_logs = "true"
subnet_flow_logs_interval = "INTERVAL_10_MIN"
subnet_flow_logs_sampling = 0.7
subnet_flow_logs_metadata = "INCLUDE_ALL_METADATA"
subnet_flow_logs_filter = "false"
}
]
}
Diese Konfiguration umfasst einen wichtigen Block:
-
module "test-vpc-module"
definiert eine Virtual Private Cloud (VPC), die Netzwerkdienste für den Rest Ihrer Infrastruktur bereitstellt.
Werte für Moduleingabevariablen festlegen
Einige Eingabevariablen sind erforderlich, d. h., das Modul hat keinen Standardwert dafür. Sie müssen einen Wert festlegen, damit Terraform korrekt ausgeführt wird.
Damit Sie Module verwenden können, müssen Sie in der Regel Eingabevariablen an die Modulkonfiguration übergeben. Die Konfiguration, die ein Modul aufruft, muss die Eingabewerte festlegen, die als Argumente an den Modulblock übergeben werden. Abgesehen von source
und version
legen die meisten Argumente für einen Modulblock Variablenwerte fest.
Auf der Terraform Registry-Seite für das „network“-Modul von Google Cloud werden im Tab „Eingaben“ alle Eingabevariablen beschrieben, die dieses Modul unterstützt.
Gemini Code Assist in der Cloud Shell-IDE aktivieren
Sie können Gemini Code Assist in einer integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) wie Cloud Shell verwenden, um Unterstützung beim Programmieren zu erhalten oder Probleme mit Ihrem Code zu lösen. Bevor Sie Gemini Code Assist verwenden können, müssen Sie das Tool aktivieren.
- Aktivieren Sie in Cloud Shell die Gemini for Google Cloud API mit dem folgenden Befehl:
gcloud services enable cloudaicompanion.googleapis.com
- Klicken Sie in der Cloud Shell-Symbolleiste auf Editor öffnen.
Hinweis: Klicken Sie zum Öffnen des Cloud Shell-Editors in der Cloud Shell-Symbolleiste auf Editor öffnen. Sie können zwischen Cloud Shell und dem Code-Editor wechseln. Klicken Sie dazu entsprechend auf Editor öffnen oder Terminal öffnen.
-
Klicken Sie im linken Bereich auf das Symbol Einstellungen und suchen Sie unter Einstellungen nach Gemini Code Assist.
-
Suchen Sie nach Gemini Code Assist: Aktivieren und prüfen Sie, ob das Kästchen ausgewählt ist. Schließen Sie dann die Einstellungen.
-
Klicken Sie in der Statusleiste unten auf dem Bildschirm auf Cloud Code – kein Projekt.
-
Autorisieren Sie das Plug-in wie beschrieben. Wenn kein Projekt automatisch ausgewählt wurde, klicken Sie auf Google Cloud-Projekt auswählen und wählen Sie aus.
-
Prüfen Sie, ob Ihr Google Cloud-Projekt () in der Cloud Code-Statusmeldung in der Statusleiste angezeigt wird.
Stammeingabevariablen definieren
Der Einsatz von Eingabevariablen in Modulen ähnelt dem von Variablen in anderen Terraform-Konfigurationen. Eine gängige Vorgehensweise ist zu überlegen, welche Moduleingabevariablen Sie in Zukunft möglicherweise ändern möchten, und entsprechende Variablen in der Datei variables.tf
der Konfiguration mit sinnvollen Standardwerten zu erstellen. Diese Variablen können dann als Argumente an den Modulblock übergeben werden.
Damit Sie produktiver arbeiten können und weniger Kontextwechsel erforderlich sind, bietet Gemini Code Assist KI-basierte intelligente Aktionen direkt in Ihrem Code-Editor. In dieser Aufgabe lassen Sie sich von Gemini Code Assist bei einigen Aktualisierungen Ihres Terraform-Codes unterstützen. Sie konfigurieren beispielsweise den Variablenblock für eine Projektressource, um ein „default“-Argument hinzuzufügen, und nehmen weitere Codeänderungen vor.
-
Öffnen Sie im Cloud Shell-Editor im selben Verzeichnis die Datei variables.tf
. Dadurch wird Gemini Code Assist aktiviert. Dies lässt sich am Symbol
rechts oben im Editor ablesen.
-
Klicken Sie in der Symbolleiste auf das Symbol für Gemini Code Assist: Intelligente Aktionen
.
-
Fügen Sie den folgenden Prompt in das Inline-Textfeld von Gemini Code Assist ein, das über die Symbolleiste geöffnet wird, um das Argument default
für die Variable project_id
zu aktualisieren:
In the configuration file variables.tf, update the variable block "project_id" resource by adding a "default" argument. Set the value to {{{project_0.project_id | PROJECT_ID}}}.
-
Drücken Sie die Eingabetaste, damit Gemini den Code entsprechend ändert.
-
Klicken Sie in der Ansicht „Unterschiede“ von Gemini auf Akzeptieren, wenn Sie dazu aufgefordert werden.
Das aktualisierte default
-Argument für die Variable project_id
in der Konfigurationsdatei variables.tf
sieht jetzt in etwa so aus:
variable "project_id" {
description = "The project ID to host the network in"
default = "{{{project_0.project_id | PROJECT_ID}}}"
}
-
Jetzt möchten Sie sich von Gemini Code Assist beim Definieren der Variablen network_name
in der Datei variables.tf
unterstützen lassen. Sie können den Namen example-vpc
oder einen beliebigen anderen verwenden.
-
Fügen Sie den folgenden Prompt in das Inline-Textfeld von Gemini Code Assist ein, das über die Symbolleiste geöffnet wird, um den default
-Wert für die Variable festzulegen.
In the configuration file variables.tf, define the variable "network_name" and set the value "example-vpc" to the "default" argument.
-
Drücken Sie die Eingabetaste, damit Gemini den Code entsprechend ändert.
-
Klicken Sie in der Ansicht „Unterschiede“ von Gemini auf Akzeptieren, wenn Sie dazu aufgefordert werden.
Die hinzugefügte Variable network_name
in der Konfigurationsdatei variables.tf
sieht jetzt so aus:
variable "network_name" {
description = "The name of the network to be created"
default = "example-vpc"
}
-
Öffnen Sie die Konfigurationsdatei main.tf
. Dadurch wird Gemini Code Assist aktiviert. Dies lässt sich am Symbol
rechts oben im Editor ablesen.
-
Klicken Sie in der Symbolleiste auf das Symbol für Gemini Code Assist: Intelligente Aktionen
.
-
Sie entscheiden sich, Gemini Code Assist zu verwenden, um das Argument network_name
zu aktualisieren, damit die Variable verwendet wird, die Sie gerade definiert haben. Dazu setzen Sie den Wert auf var.network_name
und aktualisieren die Subnetzregionen von us-west1
auf .
-
Fügen Sie den folgenden Prompt in das Inline-Textfeld von Gemini Code Assist ein, um die Argumente des Moduls test-vpc-module
in der Datei main.tf
zu aktualisieren:
Update the "test-vpc-module" module within the main.tf configuration file. Modify the network name from "my-custom-mode-network" to var.network_name and change the subnet region from us-west1 to {{{project_0.default_region | REGION}}}.
Das Modul sollte nun so aussehen:
module "test-vpc-module" {
source = "terraform-google-modules/network/google"
version = "~> 6.0"
project_id = var.project_id # Replace this with your project ID in quotes
network_name = var.network_name
mtu = 1460
subnets = [
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
},
{
subnet_name = "subnet-02"
subnet_ip = "10.10.20.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
subnet_private_access = "true"
subnet_flow_logs = "true"
},
{
subnet_name = "subnet-03"
subnet_ip = "10.10.30.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
subnet_flow_logs = "true"
subnet_flow_logs_interval = "INTERVAL_10_MIN"
subnet_flow_logs_sampling = 0.7
subnet_flow_logs_metadata = "INCLUDE_ALL_METADATA"
subnet_flow_logs_filter = "false"
}
]
}
Werte für die Stammausgabe definieren
Module haben auch Ausgabewerte, die im Modul mit der Variable output
definiert werden. Mithilfe von module.<MODULE NAME>.<OUTPUT NAME>
können Sie darauf zugreifen. Modulausgaben werden, ähnlich wie Eingabevariablen, in der Terraform Registry im Tab Outputs
(Ausgaben) aufgeführt.
Modulausgaben werden in der Regel entweder an andere Teile der Konfiguration übergeben oder als Ausgaben im Stammmodul definiert. In diesem Lab finden Sie Beispiele für beide Szenarien.
- Öffnen Sie die Datei
outputs.tf
im Verzeichnis Ihrer Konfiguration. Prüfen Sie, ob die Datei Folgendes enthält:
output "network_name" {
value = module.test-vpc-module.network_name
description = "The name of the VPC being created"
}
output "network_self_link" {
value = module.test-vpc-module.network_self_link
description = "The URI of the VPC being created"
}
output "project_id" {
value = module.test-vpc-module.project_id
description = "VPC project id"
}
output "subnets_names" {
value = module.test-vpc-module.subnets_names
description = "The names of the subnets being created"
}
output "subnets_ips" {
value = module.test-vpc-module.subnets_ips
description = "The IP and cidrs of the subnets being created"
}
output "subnets_regions" {
value = module.test-vpc-module.subnets_regions
description = "The region where subnets will be created"
}
output "subnets_private_access" {
value = module.test-vpc-module.subnets_private_access
description = "Whether the subnets will have access to Google API's without a public IP"
}
output "subnets_flow_logs" {
value = module.test-vpc-module.subnets_flow_logs
description = "Whether the subnets will have VPC flow logs enabled"
}
output "subnets_secondary_ranges" {
value = module.test-vpc-module.subnets_secondary_ranges
description = "The secondary ranges associated with these subnets"
}
output "route_names" {
value = module.test-vpc-module.route_names
description = "The routes associated with this VPC"
}
Infrastruktur bereitstellen
- Wechseln Sie in Cloud Shell zum Verzeichnis
simple_project
:
cd ~/terraform-google-network/examples/simple_project
- Initialisieren Sie Ihre Terraform-Konfiguration:
terraform init
- Erstellen Sie die VPC:
terraform apply
- Beantworten Sie den Prompt mit yes, um die Änderungen anzuwenden und fortzufahren.
Sehr gut! Sie haben Ihr erstes Modul verwendet. Die Ausgabe Ihrer Konfiguration sollte in etwa so aussehen.
Ausgabe:
Outputs:
network_name = "example-vpc"
network_self_link = "https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-01-a68489b0625b/global/networks/example-vpc"
project_id = "{{{project_0.project_id | PROJECT_ID}}}"
route_names = []
subnets_flow_logs = [
false,
true,
true,
]
subnets_ips = [
"10.10.10.0/24",
"10.10.20.0/24",
"10.10.30.0/24",
]
subnets_names = [
"subnet-01",
"subnet-02",
"subnet-03",
]
....
....
Funktionsweise von Modulen
Wenn Sie ein neues Modul zum ersten Mal verwenden, müssen Sie entweder terraform init
oder terraform get
ausführen, um das Modul zu installieren. Wird einer dieser Befehle ausgeführt, installiert Terraform neue Module im Verzeichnis .terraform/modules
im Arbeitsverzeichnis Ihrer Konfiguration. Für lokale Module erstellt Terraform einen Symlink zum Verzeichnis des Moduls. Aus diesem Grund sind Änderungen an lokalen Modulen sofort wirksam, ohne dass Sie terraform get
erneut ausführen müssen.
Infrastruktur bereinigen
Jetzt wissen Sie, wie Module aus der Terraform Registry verwendet werden, wie Sie diese Module mit Eingabevariablen konfigurieren und wie Sie Ausgabewerte aus diesen Modulen erhalten. Sie können die Umgebung nun bereinigen.
- Löschen Sie die erstellte Infrastruktur:
terraform destroy
-
Beantworten Sie den Prompt mit yes
.
Terraform löscht die von Ihnen erstellte Infrastruktur.
-
Löschen Sie anschließend auch den Ordner terraform-google-network
.
cd ~
rm -rd terraform-google-network -f
Klicken Sie auf Fortschritt prüfen.
Infrastruktur bereitstellen
Aufgabe 2: Modul erstellen
In der letzten Aufgabe haben Sie ein Modul aus der Terraform Registry verwendet, um ein VPC‑Netzwerk in Google Cloud zu erstellen. Vorhandene Terraform-Module korrekt einzusetzen, ist eine wichtige Fähigkeit, aber jede Terraform-Fachkraft sollte auch wissen, wie Module erstellt werden. Wir empfehlen, beim Konfigurieren eine modulare Nutzung in Betracht zu ziehen. Damit lassen sich Konfigurationen flexibel einsetzen, wiederverwenden und neu kombinieren.
Wie Sie wahrscheinlich bereits wissen, behandelt Terraform jede Konfiguration als Modul. Wenn Sie terraform
-Befehle ausführen oder Terraform Cloud bzw. Terraform Enterprise nutzen, um Terraform remote auszuführen, fungiert das Zielverzeichnis, das die Terraform-Konfiguration enthält, als Stammmodul.
In dieser Aufgabe erstellen Sie ein Modul zum Verwalten von Cloud Storage-Buckets für das Hosten statischer Websites.
Modulstruktur
Terraform behandelt lokale Verzeichnisse, auf die im source
-Argument eines module
-Blocks verwiesen wird, als Modul. Eine typische Dateistruktur eines neuen Moduls sieht so aus:
├── LICENSE
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
Hinweis: Diese Dateien sind nicht unbedingt erforderlich und sie haben bei der Verwendung des Moduls keine spezielle Bedeutung für Terraform. Sie können ein Modul mit einer einzelnen .tf
‑Datei erstellen oder eine beliebige andere Dateistruktur verwenden.
Jede dieser Dateien dient einem bestimmten Zweck:
-
LICENSE
enthält die Lizenz, unter der Ihr Modul bereitgestellt wird. Wenn Sie das Modul freigeben, finden andere Nutzer in der LICENSE-Datei die Bedingungen, zu der es verfügbar gemacht wurde. Terraform verwendet diese Datei nicht.
-
README.md
enthält eine Dokumentation im Markdown-Format, in der die Nutzung des Moduls beschrieben wird. Terraform verwendet diese Datei nicht, aber in Diensten wie Terraform Registry und GitHub wird ihr Inhalt Besuchern der Terraform Registry‑ oder GitHub-Seite des Moduls angezeigt.
-
main.tf
enthält die wichtigsten Konfigurationen des Moduls. Sie können auch noch weitere Konfigurationsdateien erstellen und sie so organisieren, wie es zu Ihrem Projekt passt.
-
variables.tf
enthält die Variablendefinitionen für das Modul. Wenn das Modul von anderen Nutzern verwendet wird, werden die Variablen im Modulblock als Argumente konfiguriert. Weil alle Terraform-Werte definiert sein müssen, werden alle Variablen, die keinen Standardwert haben, zu erforderlichen Argumenten. Eine Variable mit einem Standardwert kann aber auch als Modulargument bereitgestellt werden, wodurch der Standardwert überschrieben wird.
-
outputs.tf
enthält die Ausgabedefinitionen für das Modul. Modulausgaben werden für die Konfiguration verfügbar gemacht, die das Modul verwendet. Sie dienen häufig dazu, Informationen zu den Teilen der Infrastruktur, die durch das Modul definiert sind, an andere Teile der Konfiguration zu übergeben.
Achten Sie darauf, diese Dateien nicht als Teil des Moduls bereitzustellen:
- Die Dateien
terraform.tfstate
und terraform.tfstate.backup
beinhalten den Zustand von Terraform. Sie bilden so die Beziehung zwischen Konfiguration und bereitgestellter Infrastruktur ab.
- Das Verzeichnis
.terraform
enthält die Module und Plug‑ins zum Bereitstellen der Infrastruktur. Diese Dateien beziehen sich auf eine einzelne Terraform-Instanz beim Bereitstellen von Infrastruktur, nicht auf die Konfiguration der Infrastruktur, die in .tf
‑Dateien definiert ist.
-
*.tfvars
‑Dateien müssen nicht zusammen mit dem Modul bereitgestellt werden, außer Sie verwenden es auch als eigenständige Terraform-Konfiguration, denn Moduleingabevariablen werden für den Modulblock in der Konfiguration mithilfe von Argumenten festgelegt.
Hinweis: Wenn Sie die Änderungen am Modul über ein Versionsverwaltungssystem wie Git verfolgen, sollten Sie es so konfigurieren, dass diese Dateien ignoriert werden. Ein Beispiel hierfür ist diese .gitignore‑Datei in GitHub.
Modul erstellen
Wechseln Sie ins Basisverzeichnis und erstellen Sie ein Stammmodul, indem Sie eine neue main.tf
‑Konfigurationsdatei anlegen. Erstellen Sie als Nächstes ein Verzeichnis namens modules, das einen Ordner mit der Bezeichnung gcs-static-website-bucket
enthält. Sie arbeiten im Verzeichnis gcs-static-website-bucket
mit drei Terraform-Konfigurationsdateien: website.tf
, variables.tf
und outputs.tf
.
- Erstellen Sie das Verzeichnis für das neue Modul:
cd ~
touch main.tf
mkdir -p modules/gcs-static-website-bucket
- Rufen Sie das Modulverzeichnis auf und führen Sie die folgenden Befehle aus, um drei leere Dateien zu erstellen:
cd modules/gcs-static-website-bucket
touch website.tf variables.tf outputs.tf
- Führen Sie im Verzeichnis
gcs-static-website-bucket
den folgenden Befehl aus, um die Datei README.md
mit diesem Inhalt zu erstellen:
tee -a README.md <<EOF
# GCS static website bucket
This module provisions Cloud Storage buckets configured for static website hosting.
EOF
Hinweis: Die Wahl der richtigen Lizenz für Ihre Module ist nicht Teil dieses Labs. Hier wird die Open-Source-Lizenz Apache 2.0 verwendet.
- Erstellen Sie eine weitere Datei namens
LICENSE
mit folgendem Inhalt:
tee -a LICENSE <<EOF
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
EOF
Hinweis:
Diese Dateien sind nicht erforderlich und werden von Terraform nicht verwendet. Es empfiehlt sich jedoch, sie für Module anzulegen, die unter Umständen für andere freigegeben werden.
Die Verzeichnisstruktur Ihres Moduls sollte nun so aussehen:
main.tf
modules/
└── gcs-static-website-bucket
├── LICENSE
├── README.md
├── website.tf
├── outputs.tf
└── variables.tf
- Fügen Sie diese Cloud Storage-Bucket-Ressource der Datei
website.tf
im Verzeichnis modules/gcs-static-website-bucket
hinzu:
resource "google_storage_bucket" "bucket" {
name = var.name
project = var.project_id
location = var.location
storage_class = var.storage_class
labels = var.labels
force_destroy = var.force_destroy
uniform_bucket_level_access = true
versioning {
enabled = var.versioning
}
dynamic "retention_policy" {
for_each = var.retention_policy == null ? [] : [var.retention_policy]
content {
is_locked = var.retention_policy.is_locked
retention_period = var.retention_policy.retention_period
}
}
dynamic "encryption" {
for_each = var.encryption == null ? [] : [var.encryption]
content {
default_kms_key_name = var.encryption.default_kms_key_name
}
}
dynamic "lifecycle_rule" {
for_each = var.lifecycle_rules
content {
action {
type = lifecycle_rule.value.action.type
storage_class = lookup(lifecycle_rule.value.action, "storage_class", null)
}
condition {
age = lookup(lifecycle_rule.value.condition, "age", null)
created_before = lookup(lifecycle_rule.value.condition, "created_before", null)
with_state = lookup(lifecycle_rule.value.condition, "with_state", null)
matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null)
num_newer_versions = lookup(lifecycle_rule.value.condition, "num_newer_versions", null)
}
}
}
}
Die Dokumentation des Anbieters finden Sie bei GitHub.
- Rufen Sie die Datei
variables.tf
im Modul auf und fügen Sie folgenden Code hinzu:
variable "name" {
description = "The name of the bucket."
type = string
}
variable "project_id" {
description = "The ID of the project to create the bucket in."
type = string
}
variable "location" {
description = "The location of the bucket."
type = string
}
variable "storage_class" {
description = "The Storage Class of the new bucket."
type = string
default = null
}
variable "labels" {
description = "A set of key/value label pairs to assign to the bucket."
type = map(string)
default = null
}
variable "bucket_policy_only" {
description = "Enables Bucket Policy Only access to a bucket."
type = bool
default = true
}
variable "versioning" {
description = "While set to true, versioning is fully enabled for this bucket."
type = bool
default = true
}
variable "force_destroy" {
description = "When deleting a bucket, this boolean option will delete all contained objects. If false, Terraform will fail to delete buckets which contain objects."
type = bool
default = true
}
variable "iam_members" {
description = "The list of IAM members to grant permissions on the bucket."
type = list(object({
role = string
member = string
}))
default = []
}
variable "retention_policy" {
description = "Configuration of the bucket's data retention policy for how long objects in the bucket should be retained."
type = object({
is_locked = bool
retention_period = number
})
default = null
}
variable "encryption" {
description = "A Cloud KMS key that will be used to encrypt objects inserted into this bucket"
type = object({
default_kms_key_name = string
})
default = null
}
variable "lifecycle_rules" {
description = "The bucket's Lifecycle Rules configuration."
type = list(object({
# Object with keys:
# - type - The type of the action of this Lifecycle Rule. Supported values: Delete and SetStorageClass.
# - storage_class - (Required if action type is SetStorageClass) The target Storage Class of objects affected by this Lifecycle Rule.
action = any
# Object with keys:
# - age - (Optional) Minimum age of an object in days to satisfy this condition.
# - created_before - (Optional) Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition.
# - with_state - (Optional) Match to live and/or archived objects. Supported values include: "LIVE", "ARCHIVED", "ANY".
# - matches_storage_class - (Optional) Storage Class of objects to satisfy this condition. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY.
# - num_newer_versions - (Optional) Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition.
condition = any
}))
default = []
}
- Fügen Sie in der Moduldatei
outputs.tf
eine Ausgabe zum Modul hinzu:
output "bucket" {
description = "The created storage bucket"
value = google_storage_bucket.bucket
}
Ähnlich wie Variablen erfüllen Ausgaben in Modulen die gleiche Funktion wie im Stammmodul, wobei der Zugriff auf andere Weise erfolgt. Auf die Ausgaben eines Moduls können Sie als schreibgeschützte Attribute im Modulobjekt zugreifen, das in der Konfiguration verfügbar ist, die das Modul aufruft.
- Kehren Sie zur Datei
main.tf
im Stammverzeichnis zurück und fügen Sie einen Verweis auf das neue Modul hinzu:
module "gcs-static-website-bucket" {
source = "./modules/gcs-static-website-bucket"
name = var.name
project_id = var.project_id
location = "{{{project_0.default_region | REGION}}}"
lifecycle_rules = [{
action = {
type = "Delete"
}
condition = {
age = 365
with_state = "ANY"
}
}]
}
- Erstellen Sie im Stammverzeichnis die Datei
outputs.tf
für das Stammmodul:
cd ~
touch outputs.tf
- Fügen Sie in der Datei
outputs.tf
den folgenden Code hinzu:
output "bucket-name" {
description = "Bucket names."
value = "module.gcs-static-website-bucket.bucket"
}
- Erstellen Sie im Stammverzeichnis die Datei
variables.tf
:
touch variables.tf
- Fügen Sie der Datei
variables.tf
den folgenden Code hinzu:
variable "project_id" {
description = "The ID of the project in which to provision resources."
type = string
default = "{{{project_0.project_id | PROJECT_ID}}}"
}
variable "name" {
description = "Name of the buckets to create."
type = string
default = "{{{project_0.project_id | PROJECT_ID}}}"
}
Hinweis: Der Name des Speicher-Buckets muss global eindeutig sein. Ihr Name und das aktuelle Datum sind normalerweise eine gute Möglichkeit, einen eindeutigen Bucket-Namen zu erstellen.
Lokales Modul installieren
Wenn Sie einer Konfiguration ein neues Modul hinzufügen, muss Terraform dieses erst installieren, bevor es verwendet werden kann. Mit den Befehlen terraform get
und terraform init
werden Module installiert und aktualisiert. Durch den Befehl terraform init
werden außerdem Backends initialisiert und Plug‑ins installiert.
- Installieren Sie das Modul:
terraform init
- Stellen Sie den Bucket bereit:
terraform apply
- Beantworten Sie den Prompt mit yes. Der Bucket und andere Ressourcen werden bereitgestellt.
Dateien in den Bucket hochladen
Sie haben jetzt ein eigenes Modul konfiguriert und es verwendet, um eine statische Website zu erstellen. Vielleicht möchten Sie die statische Website besuchen. Im Moment ist der Bucket leer, daher ist auf der Website nichts zu sehen. Sie müssen Objekte in den Bucket hochladen, um die Website mit Inhalten zu füllen. Sie können den Inhalt des Verzeichnisses www
aus dem GitHub-Repository hochladen.
- Laden Sie den Beispielinhalt in Ihr Basisverzeichnis herunter:
cd ~
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html
- Kopieren Sie die Dateien in den Cloud Storage-Bucket :
gsutil cp *.html gs://{{{project_0.project_id | PROJECT_ID}}}
- Rufen Sie in einem neuen Browsertab die Website
https://storage.cloud.google.com/YOUR-BUCKET-NAME/index.html
auf und ersetzen Sie dabei YOUR-BUCKET-NAME
durch den Namen Ihres Speicher-Buckets .
Ihnen sollte eine einfache HTML-Webseite angezeigt werden, auf der Nothing to see here steht.
Klicken Sie auf Fortschritt prüfen.
Modul erstellen
Website und Infrastruktur bereinigen
Zum Schluss bereinigen Sie das Projekt, indem Sie die erstellte Infrastruktur wieder löschen.
- Löschen Sie Ihre Terraform-Ressourcen:
terraform destroy
Nachdem Sie den Prompt mit yes
beantwortet haben, löscht Terraform alle Ressourcen, die Sie im Laufe dieses Labs erstellt haben.
Das wars! Sie haben das Lab erfolgreich abgeschlossen.
In diesem Lab haben Sie die Grundlagen von Terraform-Modulen kennengelernt und erfahren, wie Sie ein vorhandenes Modul aus der Registry verwenden. Dann haben Sie ein eigenes Modul für eine statische Website erstellt, die in einem Cloud Storage-Bucket gehostet wird. Dabei haben Sie Eingaben, Ausgaben und Variablen für die Konfigurationsdateien definiert und die Best Practices für das Erstellen von Modulen kennengelernt.
Weitere Informationen
Unter diesen Links finden Sie weitere praxisorientierte Übungen mit Terraform:
Google Cloud-Schulungen und -Zertifizierungen
In unseren Schulungen erfahren Sie alles zum optimalen Einsatz unserer Google Cloud-Technologien und können sich entsprechend zertifizieren lassen. Unsere Kurse vermitteln technische Fähigkeiten und Best Practices, damit Sie möglichst schnell mit Google Cloud loslegen und Ihr Wissen fortlaufend erweitern können. Wir bieten On-Demand-, Präsenz- und virtuelle Schulungen für Anfänger wie Fortgeschrittene an, die Sie individuell in Ihrem eigenen Zeitplan absolvieren können. Mit unseren Zertifizierungen weisen Sie nach, dass Sie Experte im Bereich Google Cloud-Technologien sind.
Anleitung zuletzt am 20. August 2025 aktualisiert
Lab zuletzt am 20. August 2025 getestet
© 2025 Google LLC. Alle Rechte vorbehalten. Google und das Google-Logo sind Marken von Google LLC. Alle anderen Unternehmens- und Produktnamen können Marken der jeweils mit ihnen verbundenen Unternehmen sein.