arrow_back

Mit Terraform-Modulen interagieren

Anmelden Teilnehmen
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Mit Terraform-Modulen interagieren

Lab 1 Stunde universal_currency_alt 5 Guthabenpunkte show_chart Mittelstufe
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

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

Logo: Google Cloud-Labs zum selbstbestimmten Lernen

Übersicht

Beim Verwalten Ihrer Infrastruktur mit Terraform entstehen immer komplexere Konfigurationen. Die Komplexität einer Terraform-Konfigurationsdatei oder eines Terraform-Verzeichnisses ist nicht beschränkt, daher können Sie in einem einzigen Verzeichnis immer weitere Konfigurationsdateien erstellen und diese 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 wird riskanter, 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: Module erleichtern die Navigation in der Konfiguration, das Verständnis dafür sowie deren Aktualisierung, indem zusammengehörende Teile miteinander verbunden werden. Selbst eine mäßig komplexe Infrastruktur kann Hunderte oder Tausende von Konfigurationszeilen erfordern. Mithilfe von Modulen können Sie die Konfiguration durch logische Komponenten strukturieren.

  • Konfiguration zusammenfassen: Ein weiterer Vorteil von Modulen ist das Zusammenfassen der Konfiguration in einzelnen logischen Komponenten. So lassen sich unbeabsichtigte Folgen verhindern, z. B. dass eine Änderung an einem Teil der Konfiguration versehentlich zu Änderungen an anderer Infrastruktur führt. Außerdem sinkt die Wahrscheinlichkeit einfacher Fehler wie der Verwendung desselben 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. Durch Konsistenz wird eine komplexe Konfiguration leichter verständlich und sie trägt dazu bei, dass Best Practices auf die gesamte Konfiguration angewendet werden. 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 aktualisiert werden muss, können Sie dieses Update mithilfe eines Moduls an einem Ort ausführen und es auf alle Bereiche anwenden lassen, in denen dieses Modul zum Einsatz kommt.

Lernziele

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 die Ressourcen für das Lab verfügbar sind.

In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung selbst 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, 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: Wenn Sie über ein persönliches Google Cloud-Konto oder -Projekt verfügen, verwenden Sie es nicht für dieses Lab. So werden zusätzliche Kosten für Ihr Konto vermieden.

Lab starten und bei der Google Cloud Console anmelden

  1. Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Pop-up-Fenster 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
  2. 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.
  3. 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.

  4. Klicken Sie auf Weiter.

  5. 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.

  6. 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.
  7. 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 sich eine Liste der Google Cloud-Produkte und ‑Dienste ansehen möchten, klicken Sie oben links auf das Navigationsmenü. Symbol für Navigationsmenü

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.

  1. Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren Symbol für Cloud Shell-Aktivierung.

Wenn Sie verbunden sind, sind Sie bereits authentifiziert und das Projekt ist auf Ihre 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.

  1. (Optional) Sie können den aktiven Kontonamen mit diesem Befehl auflisten:
gcloud auth list
  1. 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`
  1. (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. Wenn Terraform einen Modulblock findet, lädt und verarbeitet es die Konfigurationsdateien dieses Moduls.

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. Selbst bei nur wenig komplexen Terraform-Konfigurationen, die von einer Person verwaltet werden, überwiegen die Vorteile von Modulen den zeitlichen Aufwand, sie korrekt einzusetzen.

  • Verwenden Sie lokale Module, um Ihren Code zu strukturieren und zusammenzufassen. 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:

Terraform Registry-Seite

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

  1. 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.

  1. Klicken Sie in der Cloud Shell-Symbolleiste auf Editor öffnen. Wenn Sie zwischen Cloud Shell und dem Code-Editor wechseln möchten, klicken Sie auf Editor öffnen bzw. Terminal öffnen oder auf In neuem Fenster öffnen, damit der Editor in einem eigenen Tab geöffnet bleibt.

  2. Wechseln Sie im Editor zu terraform-google-network/examples/simple_project und öffnen Sie die Datei main.tf. Ihre main.tf-Konfiguration sieht so aus:

module "test-vpc-module" { source = "terraform-google-modules/network/google" version = "~> 6.0" project_id = var.project_id # Replace this with your 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 beinhaltet 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.

  • Prüfen Sie im Modulblock "test-vpc-module" die Eingabevariablen, die Sie festlegen. Diese sind in der Terraform Registry dokumentiert. Die erforderlichen Eingaben für dieses Modul lauten:

    • network_name: Der Name des Netzwerks, das erstellt wird
    • project_id: Die ID des Projekts, in dem die VPC erstellt wird
    • subnets: Die Liste der Subnetze, die erstellt werden

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 „Inputs“ (Eingaben) alle Eingabevariablen beschrieben, die dieses Modul unterstützt.

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.

  1. Führen Sie den folgenden Befehl in Cloud Shell aus, um die Projekt‑ID abzurufen:
gcloud config list ‑‑format 'value(core.project)'
  1. Öffnen Sie im Editor im selben Verzeichnis die Datei variables.tf.

  2. Ersetzen Sie die Variable project_id durch die Ausgabe des vorherigen Befehls. Dabei müssen Sie sich an das unten angegebene Format halten und den default-Wert der Variablen festlegen:

variable "project_id" { description = "The project ID to host the network in" default = "FILL IN YOUR PROJECT ID HERE" }
  1. Fügen Sie die Variable network_name in die Datei variables.tf ein. Sie können den Namen example-vpc oder einen beliebigen anderen verwenden. Dabei müssen Sie sich an das unten angegebene Format halten und den default-Wert der Variablen festlegen:
variable "network_name" { description = "The name of the VPC network being created" default = "example-vpc" }
  1. Aktualisieren Sie in der Datei main.tf den Parameter network_name, um die Variable zu verwenden, die Sie gerade definiert haben, indem Sie den Wert auf var.network_name setzen.
module "test-vpc-module" { ... project_id = var.project_id network_name = var.network_name ...
  1. Ändern Sie in der Datei main.tf die Subnetzregionen in den Zeilen 35, 40 und 47 von us‑west1 in . So stellen Sie sicher, dass die Subnetze in der zulässigen Region Ihres Projekts erstellt werden. Das Modul sollte nun so aussehen:
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}}}" ... .. }

Stammausgabewerte definieren

Module haben auch Ausgabewerte, die im Modul mit dem Stichwort output definiert werden. Mithilfe von module.<MODULE NAME>.<OUTPUT NAME> können Sie darauf zugreifen. Modulausgaben werden 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 lernen Sie beide Verwendungsmöglichkeiten kennen.

  • Ö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

  1. Wechseln Sie in Cloud Shell zum Verzeichnis simple_project:
cd ~/terraform-google-network/examples/simple_project
  1. Initialisieren Sie Ihre Terraform-Konfiguration:
terraform init
  1. Erstellen Sie die VPC:
terraform apply
  1. 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 so aussehen:

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 = "" 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.

  1. Löschen Sie die erstellte Infrastruktur:
terraform destroy
  1. Beantworten Sie den Prompt mit yes. Terraform löscht die von Ihnen erstellte Infrastruktur.

  2. 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. Sie sollten jede Terraform-Konfiguration unter der Annahme erstellen, dass sie als Modul verwendet wird. So werden Ihre Konfigurationen flexibel, wiederverwendbar und zusammensetzbar.

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, erforderliche Argumente. 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 enthalten Informationen zum Terraform-Zustand. Damit verfolgt Terraform die Beziehung zwischen der Konfiguration und der dadurch bereitgestellten Infrastruktur.
  • 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.

  1. Erstellen Sie das Verzeichnis für das neue Modul:
cd ~ touch main.tf mkdir ‑p modules/gcs-static-website-bucket
  1. 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
  1. 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.
  1. 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
  1. 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.

  1. 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 = [] }
  1. 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 }

Wie Variablen haben auch Ausgaben in Modulen dieselbe Funktion wie im Stammmodul, aber der Zugriff erfolgt auf andere Weise. 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.

  1. 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" } }] }
  1. Erstellen Sie im Stammverzeichnis die Datei outputs.tf für das Stammmodul:
cd ~ touch outputs.tf
  1. 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" }
  1. Erstellen Sie im Stammverzeichnis die Datei variables.tf:
touch variables.tf
  1. Fügen Sie der Datei variables.tf den folgenden Code hinzu. Setzen Sie die Variablen project_id und name standardmäßig auf die Projekt-ID .
variable "project_id" { description = "The ID of the project in which to provision resources." type = string default = "FILL IN YOUR PROJECT ID HERE" } variable "name" { description = "Name of the buckets to create." type = string default = "FILL IN A (UNIQUE) BUCKET NAME HERE" } 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. Sie können aber auch die Projekt‑ID verwenden.

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.

  1. Installieren Sie das Modul:
terraform init
  1. Stellen Sie den Bucket bereit:
terraform apply
  1. 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.

  1. 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
  1. Kopieren Sie die Dateien in den Bucket und ersetzen Sie dabei YOUR-BUCKET-NAME durch den Namen Ihres Speicher-Buckets:
gsutil cp *.html gs://YOUR-BUCKET-NAME
  1. 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.

  1. 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.

Nächste Schritte / 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 26. Januar 2024 aktualisiert

Lab zuletzt am 11. Dezember 2023 getestet

© 2024 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.