Nature as it should be

#datapipeline: Bereitstellen der serverlosen Datenpipeline zu GCP mit Terraform

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.

Stromdaten-Pipeline
Stromdaten-Pipeline

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.


Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *