L'application Storage Event Function est un répertoire d'images et un outil de création de vignettes. Elle est composée des composants suivants:
- Une application cliente dans laquelle les utilisateurs peuvent importer des images.
- API hébergée dans un conteneur et site statique – Golang – Cloud Run
- Stockage - Stockage de fichiers - Cloud Storage
- Un processeur d'images qui crée des miniatures des images.
- Functions as a Service - Golang - Cloud Functions
- Un pipeline de déploiement.
- Déploiement : Cloud Build
Premiers pas
Cliquez sur le lien suivant pour obtenir une copie du code source dans Cloud Shell. Une seule commande permet de lancer une copie fonctionnelle de l'application dans votre projet.
Afficher le code source sur GitHub
Composants de l'application de la fonction d'événement Storage
L'architecture de l'application de fonction d'événement de stockage utilise plusieurs produits. Vous trouverez ci-dessous la liste des composants, ainsi que des informations supplémentaires à leur sujet, y compris des liens vers des vidéos, des documentations produit et des tutoriels interactifs associés.Scripts
Le script d'installation utilise un exécutable écrit en go
et des outils de la CLI Terraform pour prendre un projet vide et y installer l'application. La sortie doit être une application fonctionnelle et une URL pour l'adresse IP d'équilibrage de charge.
./main.tf
Activer les services
Les services Google Cloud sont désactivés par défaut dans un projet. Pour utiliser l'une des solutions ci-dessous, vous devez activer les éléments suivants:
- Cloud Build : crée des images de conteneur et les déploie dans Cloud Run
- Cloud Storage : héberge les fichiers statiques
- Cloud Functions : plate-forme Functions as a Service
- Cloud Run : outil sans serveur qui hébergera le conteneur et fournira une URL à partir de laquelle accéder à l'application.
- Artifact Registry : stocke les images Docker à utiliser avec 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
}
Définir des autorisations
Définit les rôles et les autorisations IAM qui permettent à Cloud Build de déployer tous les services.
- Activer le compte de service Cloud Build pour le déploiement sur Cloud Run
- Autoriser le compte de service Cloud Build à effectuer des activités de compte de service
- Activer le compte de service Cloud Build pour publier sur Cloud Run
- Activer le compte de service Cloud Build pour stocker des conteneurs dans Artifact Registry
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]
}
Créer des buckets de stockage
Crée l'emplacement de stockage des images et des miniatures importées, et fournit un emplacement de stockage temporaire pour l'importation de Cloud Functions.
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
}
Créer un dépôt Artifact Registry
Le code suivant décrit les paramètres du dépôt Artifact Registry dans lequel les conteneurs sont stockés.
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]
}
Créer un conteneur pour une application Cloud Run
Le code suivant crée une image et la met en ligne dans Artifact Registry pour l'utiliser avec 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
]
}
Déployer dans Cloud Run
Le code suivant utilise Cloud Build pour déployer l'application Web cliente sur Cloud Run.
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
}
Déployer le code de fonction dans Cloud Functions
Transférez directement les données vers les fonctions et activez-les.
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
Créer un conteneur d'API
Le code suivant crée une image Docker pour l'application Web.
- name: "gcr.io/cloud-builders/docker"
args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]
Transférer le conteneur de l'API vers Artifact Registry
En transférant le conteneur vers Artifact Registry, Cloud Run peut récupérer l'image et l'afficher.
- name: "gcr.io/cloud-builders/docker"
args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]
Substitutions
Créez une variable avec une valeur par défaut afin que ces valeurs puissent être modifiées au moment du déploiement.
substitutions:
_REGION: us-central1
_BASENAME: scaler
Conclusion
Vous disposez désormais d'une solution de création de miniatures exécutée dans votre projet à l'aide de Cloud Functions pour répondre aux modifications apportées à un bucket Storage. Vous disposez également de tout le code nécessaire pour modifier ou étendre cette solution.