App für Speicherereignisfunktion

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Architektur

Die App für Speicherereignisfunktionen ist ein Image-Verzeichnis und eine Miniaturansicht. Sie besteht aus den folgenden Komponenten:

  • Eine Clientanwendung, mit der Nutzer Bilder hochladen können.
    • Containergehostete API und statische Website – Golang – Cloud Run
    • Speicher – Dateispeicher – Cloud Storage
  • Einen 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 zu erhalten. Dort wird mit einem einzigen Befehl eine funktionierende Kopie der Anwendung in Ihrem Projekt erstellt.

In Cloud Shell öffnen

Quellcode auf GitHub ansehen


App-Komponenten der Storage-Ereignisfunktion

In der Architektur der Storage-Ereignisfunktion werden mehrere Produkte verwendet. Im Folgenden sind die Komponenten und weitere Informationen zu den Komponenten aufgeführt, darunter 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, aber serverlos ausführen, ohne die Anzahl der Instanzen, Prozessoren oder des Arbeitsspeichers konfigurieren zu müssen. Laden Sie einen Container hoch und rufen Sie eine URL ab.
Cloud Storage Cloud Storage bietet Dateispeicher und öffentliche Bereitstellung von Bildern über HTTP(s).
Cloud Functions Cloud Functions ist eine Dienstplattform, auf der Sie Uploads von Cloud Storage-Dateien beobachten und Code zur Erstellung von Miniaturansichten ausführen können.
Cloud Build Cloud Build ist ein Tool, mit dem die Container verpackt und als Cloud Run-Dienste bereitgestellt werden.

Skripts

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

./main.tf

Dienste aktivieren

Google Cloud-Dienste sind in einem Projekt standardmäßig deaktiviert. Zur Verwendung einer dieser Lösungen müssen wir Folgendes aktivieren:

  • Cloud Build: Erstellt Container-Images und stellt sie in Cloud Run bereit.
  • Cloud Storage: hostet statische Dateien.
  • Cloud Functions: Functions as a Service
  • Cloud Run: Das serverlose Tool, das den Container hostet und ein URLS bereitstellt, über das auf die Anwendung zugegriffen werden kann.
  • Artifact Registry – speichert die Docker-Images zur Verwendung mit Cloud Build.
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

Legt IAM-Rollen und -Berechtigungen fest, mit denen Cloud Build alle Dienste bereitstellen kann.

  • Cloud Build-Dienstkonto zum Bereitstellen in Cloud Run aktivieren
  • Cloud Build-Dienstkonto aktivieren, um Dienstkontoaktivitäten auszuführen
  • Cloud Build-Dienstkonto zum Veröffentlichen in Cloud Run aktivieren
  • Cloud Build-Dienstkonto aktivieren, um Container in Artifact Registry zu speichern
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 Thumbnails 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 werden die Parameter für das Artifact Registry-Repository beschrieben, in dem die Container gespeichert sind.

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 Cloud Build verwendet, um die Client-Webanwendung in Cloud Run bereitzustellen.

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

Funktionen direkt übertragen 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 an Artifact Registry übertragen

Wenn Sie den Container per Push an Artifact Registry übertragen, 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 bei der Bereitstellung geändert werden können.

substitutions:
  _REGION: us-central1
  _BASENAME: scaler

Fazit

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