La app de función de eventos de almacenamiento es un directorio de imágenes y creador de miniaturas. Consta de los siguientes componentes:
- Una aplicación cliente en la que los usuarios pueden subir imágenes
- API alojada en contenedor y sitio estático: Golang - Cloud Run
- Almacenamiento - Almacenamiento de archivos - Cloud Storage
- Un procesador de imágenes que crea miniaturas de las imágenes.
- Funciones como servicio: Golang - Cloud Functions
- Una canalización de implementación
- Deployment: Cloud Build
Comenzar
Haz clic en el siguiente vínculo para obtener una copia del código fuente en Cloud Shell. Una vez ahí, un solo comando iniciará una copia de trabajo de la aplicación en tu proyecto...
Consulta el código fuente en GitHub
Componentes de la app de función de evento de almacenamiento
La arquitectura de la app de función de evento de almacenamiento usa varios productos. A continuación, se enumeran los componentes, junto con más información sobre el componentes, incluidos los vínculos a videos relacionados, la documentación del producto y con explicaciones interactivas.Secuencias de comandos
La secuencia de comandos de instalación usa un ejecutable escrito en go
y las herramientas de la CLI de Terraform para
tomar un proyecto vacío y, luego, instalar la aplicación en él. El resultado debe ser una
y una URL para la dirección IP
del balanceo de cargas.
./main.tf
Habilita los servicios
Los servicios de Google Cloud están inhabilitados en un proyecto de forma predeterminada. Para usar cualquiera de las soluciones que se indican a continuación, debemos activar lo siguiente:
- Cloud Build: Crea imágenes de contenedor y realiza implementaciones en Cloud Run
- Cloud Storage: Aloja archivos estáticos.
- Cloud Functions: Plataforma de funciones como servicio
- Cloud Run: La herramienta sin servidores que alojará el contenedor y proporcionará una URL desde la que acceder a la aplicación.
- Artifact Registry: Almacena las imágenes de Docker para usarlas con 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
}
Configurar permisos
Establece roles y permisos de IAM que permiten que Cloud Build implemente todos los servicios.
- Habilita la cuenta de servicio de Cloud Build para implementar en Cloud Run
- Habilitar la cuenta de servicio de Cloud Build para realizar actividades en ella
- Habilita la cuenta de servicio de Cloud Build para publicar en Cloud Run
- Habilitar la cuenta de servicio de Cloud Build para almacenar contenedores en 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]
}
Crea buckets de Storage
Crea la ubicación de almacenamiento para las imágenes y miniaturas subidas. y proporciona una ubicación de almacenamiento temporal para la carga 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
}
Crea el repositorio de Artifact Registry
En el siguiente código, se describen los parámetros de Artifact Registry en el que se almacenan los contenedores.
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]
}
Contenedor de compilación para la aplicación de Cloud Run
A continuación, se compila una imagen y se la sube a Artifact Registry para usarlos con 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
]
}
Implementa en Cloud Run
En el siguiente ejemplo, se usa Cloud Build para implementar la app web del cliente en 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
}
Implementa el código de la función en Cloud Functions
Envía directamente a las funciones y activa.
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
Contenedor de API de compilación
A continuación, se crea una imagen de Docker para la aplicación web.
- name: "gcr.io/cloud-builders/docker"
args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]
Envía el contenedor de API a Artifact Registry
Enviar el contenedor a Artifact Registry permite que Cloud Run obtenga la imagen y la entregue.
- name: "gcr.io/cloud-builders/docker"
args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]
Sustituciones
Crea una variable con un valor predeterminado para que estos valores se puedan cambiar en el momento de la implementación.
substitutions:
_REGION: us-central1
_BASENAME: scaler
Conclusión
Ahora tienes una solución para crear miniaturas ejecutándose en tu proyecto con Cloud Functions para responder a los cambios en un bucket de Storage. También tienes todo el código para modificar o extender esta solución.