App für Speicherereignisfunktion

+

Architektur

Die Storage Event Function App ist ein Bildverzeichnis und ein Thumbnail-Maker. Sie besteht aus den folgenden Komponenten:

  • Eine Clientanwendung, mit der Nutzer Bilder hochladen können.
    • In Containern gehostete API und statische Website – Golang – Cloud Run
    • Speicher – Dateispeicher – Cloud-Speicher
  • Ein Bildprozessor, der Miniaturansichten der Bilder erstellt.
    • Functions as a Service – Golang – Cloud Functions
  • Eine Bereitstellungspipeline.
    • Bereitstellung – Cloud Build

Jetzt starten

Klicken Sie auf den folgenden Link, um eine Kopie des Quellcodes in Cloud Shell aufzurufen. Dort können Sie mit einem einzigen Befehl eine funktionierende Kopie der Anwendung in Ihrem Projekt erstellen.

In Cloud Shell öffnen

Quellcode auf GitHub ansehen


App-Komponenten für die Funktion „Speicherereignis“

Die Architektur der App für Speicherereignisfunktionen nutzt mehrere Produkte. Im Folgenden finden Sie eine Liste der Komponenten sowie weitere Informationen zu den Komponenten, einschließlich Links zu ähnlichen Videos, Produktdokumentationen und interaktiven Schritt-für-Schritt-Anleitungen.
Video Docs Schritt-für-Schritt-Anleitungen
Cloud Run Mit Cloud Run können Sie Anwendungen in einem Container ausführen, aber auf serverlose Weise, ohne die Anzahl der Instanzen, Prozessoren oder des Arbeitsspeichers konfigurieren zu müssen. Container hochladen, URL abrufen
Cloud Storage Cloud Storage bietet Dateispeicher und die öffentliche Bereitstellung von Bildern über http(s).
Cloud Functions Cloud Functions ist eine Funktions- und Dienstplattform, mit der Sie auf Cloud Storage-Dateiuploads warten und Code ausführen können, um daraus Thumbnails zu erstellen.
Cloud Build Cloud Build ist das Tool, mit dem die Container verpackt und bereitgestellt werden, damit sie als Cloud Run-Dienste verfügbar sind.

Skripts

Das Installationsskript verwendet eine in go geschriebene ausführbare Datei und Terraform-Befehlszeilentools, um ein leeres Projekt zu erstellen und die Anwendung darin zu installieren. Die Ausgabe sollte eine funktionierende Anwendung und eine URL für die Load Balancing-IP-Adresse sein.

./main.tf

Dienste aktivieren

Google Cloud-Dienste sind in einem Projekt standardmäßig deaktiviert. Damit Sie eine der folgenden Lösungen verwenden können, müssen Sie Folgendes aktivieren:

  • Cloud Build: Erstellt Container-Images und stellt sie in Cloud Run bereit
  • Cloud Storage: Hostet statische Dateien
  • Cloud Functions: Function as a Service-Plattform
  • Cloud Run: Das serverlose Tool, das den Container hostet und eine URL bereitstellt, über die auf die Anwendung zugegriffen werden kann.
  • Artifact Registry: Hier werden die Docker-Images für die Verwendung mit Cloud Build gespeichert.
variable "gcp_service_list" {
    description = "The list of apis necessary for the project"
    type        = list(string)
    default = [
        "cloudbuild.googleapis.com",
        "storage.googleapis.com",
        "cloudfunctions.googleapis.com",
        "run.googleapis.com",
        "artifactregistry.googleapis.com",
    ]
}

resource "google_project_service" "all" {
    for_each                   = toset(var.gcp_service_list)
    project                    = var.project_number
    service                    = each.key
    disable_dependent_services = false
    disable_on_destroy         = false
}

Berechtigungen festlegen

Hiermit werden IAM-Rollen und -Berechtigungen festgelegt, die es Cloud Build ermöglichen, alle Dienste bereitzustellen.

  • Cloud Build-Dienstkonto für die Bereitstellung in Cloud Run aktivieren
  • Cloud Build-Dienstkonto für Dienstkontoaktivitäten aktivieren
  • Cloud Build-Dienstkonto für die Veröffentlichung in Cloud Run aktivieren
  • Cloud Build-Dienstkonto zum Speichern von Containern in Artifact Registry aktivieren
variable "build_roles_list" {
    description = "The list of roles that build needs for"
    type        = list(string)
    default = [
        "roles/run.developer",
        "roles/iam.serviceAccountUser",
        "roles/run.admin",
        "roles/cloudfunctions.admin",
        "roles/artifactregistry.admin",
    ]
}

resource "google_project_iam_member" "allbuild" {
    for_each   = toset(var.build_roles_list)
    project    = var.project_number
    role       = each.key
    member     = "serviceAccount:${local.sabuild}"
    depends_on = [google_project_service.all]
}

Storage-Buckets erstellen

Erstellt den Speicherort für die hochgeladenen Bilder und Miniaturansichten und bietet einen temporären Speicherort für den Cloud Functions-Upload.

resource "google_storage_bucket" "target_bucket" {
    name     = var.bucket
    project  = var.project_number
    location = var.location
}

resource "google_storage_bucket" "function_bucket" {
    name     = "${var.project_id}-function-deployer"
    project  = var.project_number
    location = var.location
}

Artifact Registry-Repository erstellen

Im folgenden Code sind die Parameter für das Artifact Registry-Repository aufgeführt, in dem die Container gespeichert werden.

resource "google_artifact_registry_repository" "app" {
    provider      = google-beta
    format        = "DOCKER"
    location      = var.region
    project       = var.project_id
    repository_id = "${var.basename}-app"
    depends_on    = [google_project_service.all]
}

Container für Cloud Run-Anwendung erstellen

Im Folgenden wird ein Image erstellt und zur Verwendung mit Cloud Build in Artifact Registry hochgeladen.

resource "null_resource" "cloudbuild_app" {
    provisioner "local-exec" {
        working_dir = "${path.module}/code/app"
        command     = "gcloud builds submit . --substitutions=_REGION=${var.region},_BASENAME=${var.basename}"
    }

    depends_on = [
        google_artifact_registry_repository.app,
        google_project_service.all
    ]
}

In Cloud Run bereitstellen

Im Folgenden wird die Client-Webanwendung mit Cloud Build in Cloud Run bereitgestellt.

resource "google_cloud_run_service" "app" {
    name     = "${var.basename}-app"
    location = var.region
    project  = var.project_id

    template {
        spec {
            containers {
                image = "${var.region}-docker.pkg.dev/${var.project_id}/${var.basename}-app/prod"
                env {
                name  = "BUCKET"
                value = var.bucket
                }
            }
        }

        metadata {
            annotations = {
                "autoscaling.knative.dev/maxScale" = "1000"
                "run.googleapis.com/client-name"   = "terraform"
            }
        }
    }
    autogenerate_revision_name = true
    depends_on = [
        null_resource.cloudbuild_app,
    ]
}

data "google_iam_policy" "noauth" {
    binding {
        role = "roles/run.invoker"
        members = [
        "allUsers",
        ]
    }
}

resource "google_cloud_run_service_iam_policy" "noauth_app" {
    location    = google_cloud_run_service.app.location
    project     = google_cloud_run_service.app.project
    service     = google_cloud_run_service.app.name
    policy_data = data.google_iam_policy.noauth.policy_data
}

Funktionscode in Cloud Functions bereitstellen

Direkt an Funktionen senden und aktivieren.

resource "google_storage_bucket_object" "archive" {
    name   = "index.zip"
    bucket = google_storage_bucket.function_bucket.name
    source = "index.zip"
    depends_on = [
        google_project_service.all,
        google_storage_bucket.function_bucket,
        null_resource.cloudbuild_function
    ]
}

resource "google_cloudfunctions_function" "function" {
    name    = var.basename
    project = var.project_id
    region  = var.region
    runtime = "go116"

    available_memory_mb   = 128
    source_archive_bucket = google_storage_bucket.function_bucket.name
    source_archive_object = google_storage_bucket_object.archive.name
    entry_point           = "OnFileUpload"
    event_trigger {
        event_type = "google.storage.object.finalize"
        resource   = google_storage_bucket.target_bucket.name
    }

    depends_on = [
        google_storage_bucket.function_bucket,
        google_storage_bucket.target_bucket,
        google_storage_bucket_object.archive,
        google_project_service.all
    ]
}

./code/app/cloudbuild.yaml

API-Container erstellen

Im Folgenden wird ein Docker-Image für die Webanwendung erstellt.

- name: "gcr.io/cloud-builders/docker"
  args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]

API-Container per Push in die Artifact Registry übertragen

Durch das Pushen des Containers in die Artifact Registry kann Cloud Run das Image abrufen und bereitstellen.

- name: "gcr.io/cloud-builders/docker"
  args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]

Ersetzungen

Erstellen Sie eine Variable mit einem Standardwert, damit diese Werte zum Zeitpunkt der Bereitstellung geändert werden können.

substitutions:
  _REGION: us-central1
  _BASENAME: scaler

Fazit

Sie haben jetzt eine Lösung zum Erstellen von Thumbnails in Ihrem Projekt, die mit Cloud Functions auf Änderungen in einem Storage Bucket reagiert. Sie haben auch den gesamten Code, um diese Lösung zu ändern oder zu erweitern.