Ich habe kürzlich eine Datenpipeline gebaut, die ich in einem Artikel Datenpipeline den stündlichen Stromtarif geschrieben habe, was ich nicht erklärt habe, war, wie ich sie auf der Google Cloud Platform bereitgestellt habe. In diesem Artikel zeige ich Ihnen, wie ich Terraform verwendet habe, um es auf der Google Cloud Platform bereitzustellen.
Das größte Kommunikationsproblem ist, dass wir nicht zuhören, um zu verstehen, dass wir zuhören, um zu antworten
Terraform ist eine Open-Source-Infrastruktur als Code-Software-Tool, das einen konsistenten CLI-Workflow zur Verwaltung von Hunderten von Cloud-Diensten bietet.
Dieser Beitrag bietet einen Überblick über die Terraform-Ressourcen, die zum Konfigurieren der Infrastruktur für die Erstellung der Stromdatenpipeline auf der Google Cloud Platform (GCP) erforderlich sind, wie im folgenden Diagramm dargestellt.

Terraform Ressourcen
Um die oben genannte Infrastruktur in Terraform zu definieren, benötigen wir die folgenden Terraform-Ressourcen:
Definieren des Anbieters
Ich benutze Google Ich setze meinen Provider auf Google und definiere auch den GCP-Projektnamen
Anbieter "google" {
project = "<Projekt-ID>"
Region = "us-central1"
}
Definieren eines Buckets
Als Nächstes definiere ich den Bucket, in dem der Quellcode für die Cloud-Funktion gespeichert werden soll.
Ressource "google_storage_bucket" "Bucket" {
name = "swedish-electricty-prices" # Dieser Bucket-Name muss eindeutig sein
location = "uns"
}
Archivdatei definieren
Auf meinem lokalen Computer definiere ich, wo sich mein src befindet und wo die src.zip-Datei gespeichert werden soll – Verzeichnis, in dem sich Ihr Python-Quellcode befindet
Daten "archive_file" "src" {
typ = "zip"
source_dir = "${pfad.root}/.. /src" #
output_path = "${pfad.root}/.. /generated/src.zip"
}
Ressource "google_storage_bucket_object" "Archiv" {
name = "${data.archive_file.src.output_md5}.zip"
bucket = google_storage_bucket.bucket.name
source = "${pfad.root}/.. /generated/src.zip"
}
Definieren der Cloud-Funktion
Ich definiere die Cloud Function-Ressource, welche Region, welchen Speicher, welchen Laufzeittyp und den Einstiegspunkt des Codes. Und von wo aus der Code in der Cloud-Funktion bereitgestellt werden soll.
Ressource "google_cloudfunctions_function" "Funktion" {
name = "swedish-electricty-prices"
beschreibung = "Auslöser für schwedische Strompreise"
Laufzeit = "python37"
environment_variables = {
PROJECT_NAME = "<Projektname",
}
available_memory_mb = 256
Timeout = 360
source_archive_bucket = google_storage_bucket.bucket.name
source_archive_object = google_storage_bucket_object.archiv.name
trigger_http = wahr
entry_point = "main" # Dies ist der Name der Funktion, die in Ihrem Python-Code ausgeführt wird
}
Dienstkonto definieren
Ich muss ein Dienstkonto definieren, auf das von den verschiedenen GCP-Diensten automatisch ohne mein Eingreifen zugegriffen werden kann.
Ressource "google_service_account" "service_account" {
account_id = "swedish-electricty-prices"
display_name = "Cloud Function Swedish Electricty Prices Invoker Service Account"
}
IAM-Rolle festlegen
Damit der Cloud Scheduler eine Cloud-Funktion aufrufen kann, muss ich einige IAM-Rollen festlegen.
Ressource "google_cloudfunctions_function_iam_member" "Invoker" {
projekt = google_cloudfunctions_function.function.project
region = google_cloudfunctions_function.function.region
cloud_function = google_cloudfunctions_function.function.name
role = "roles/cloudfunctions.invoker"
member = "serviceAccount:${google_service_account.service_account.email}"
}
Definieren des Cloud Schedulers
Um die Cloud-Funktion aufzuwecken, muss ich in der Lage sein, einen geplanten Job zu erstellen, ich tue dies mit dem Cloud Scheduler und definiere in terraform die Details zum Festlegen eines Cloud Schedule-Jobs.
Ressource "google_cloud_scheduler_job" "Job" {
name = "swedish-electricty-prices"
description = "Trigger the ${google_cloudfunctions_function.function.name} Cloud Function Daily at 6:00."
Zeitplan = "10 0 * * *" # Täglich um 12:10 Uhr
time_zone = "Europa/Stockholm"
attempt_deadline = "320er"
http_target {
http_method = "GET"
uri = google_cloudfunctions_function.function.https_trigger_url
oidc_token {
service_account_email = google_service_account.service_account.email
}
}
}
Es gibt viele verschiedene Möglichkeiten, eine Datenpipeline mit einer flexiblen Lösung bereitzustellen, die die Funktionen von Terraform voll ausschöpft und gleichzeitig eine kostengünstige, skalierbare Infrastruktur schafft. Wenn Sie Fragen oder Ideen haben, wie Sie diesen Ansatz verbessern können, können Sie unten einen Kommentar abgeben.
Leave a Reply