Die Speicherereignis-Funktions-App ist ein Bildverzeichnis und ermöglicht das Erstellen von Miniaturansichten. Sie besteht aus den folgenden Komponenten:
- Eine Clientanwendung, in die Nutzer Bilder hochladen können.
- Von Containern gehostete API und statische Website – Golang – Cloud Run
- Speicher – Dateispeicher – Cloud Storage
- 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 den Quellcode in Cloud Shell zu kopieren. Einmal können Sie mit einem einzigen Befehl eine Arbeitskopie der Anwendung in Ihrem Projekt...
App-Komponenten für die Funktion „Speicherereignis“
Die Architektur der App für Speicherereignisfunktionen nutzt mehrere Produkte. Im Folgenden sind die Komponenten aufgeführt sowie weitere Informationen zu den Komponenten, Komponenten, einschließlich Links zu ähnlichen Videos, Produktdokumentation und interaktiven Schritt-für-Schritt-Anleitungen.Skripts
Das Installationsskript verwendet eine ausführbare Datei, die in go
geschrieben ist, und die Terraform-Befehlszeilentools, um
ein leeres Projekt zur Installation
der darin enthaltenen Anwendung. 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 – Functions-as-a-Service-Plattform
- Cloud Run: das serverlose Tool, das den Container und eine URL angeben, von der aus 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 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
Der folgende Code beschreibt die Parameter für Artifact Registry Repository, 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
Mit den folgenden Schritten wird ein Image erstellt und in Artifact Registry hochgeladen zur Verwendung mit Cloud Build.
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 auf Funktionen drücken 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 an 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 bei 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. Außerdem haben Sie Zugriff auf den gesamten Code, um diese Lösung zu ändern oder zu erweitern.