O app de funções de eventos do Storage é um criador de diretórios de imagens e miniaturas. Ela é composta dos seguintes componentes:
- Um aplicativo cliente em que os usuários podem fazer upload de imagens
- API e site estático hospedados em contêineres: Golang – Cloud Run
- Armazenamento - Armazenamento de arquivos - Cloud Storage
- Um processador de imagens que cria miniaturas das imagens.
- Funções como serviço - Golang - Cloud Functions
- Um pipeline de implantação.
- Implantação - Cloud Build
Primeiros passos
Clique no link a seguir para copiar o código-fonte no Cloud Shell. Uma vez lá, um único comando criará uma cópia de trabalho do aplicativo em seu projeto...
Componentes do app de função de evento do Storage
A arquitetura do app de função de evento do Storage usa vários produtos. A seguir, listamos os componentes, além de mais informações sobre os componentes, incluindo links para vídeos relacionados, documentação do produto e tutoriais interativos.Scripts
O script de instalação usa um executável escrito em go
e nas ferramentas de CLI do Terraform para
pegar um projeto vazio e instalar o aplicativo nele. A saída deve ser
aplicativo em funcionamento e um URL para o endereço IP de balanceamento de carga.
./main.tf
Ativar serviços
Por padrão, os serviços do Google Cloud ficam desativados em um projeto. Para usar qualquer das soluções aqui, precisamos ativar o seguinte:
- Cloud Build: cria imagens de contêiner e faz a implantação no Cloud Run.
- Cloud Storage: hospeda arquivos estáticos
- Cloud Functions: plataforma de funções como serviço
- Cloud Run: a ferramenta sem servidor que vai hospedar o contêiner e forneça URLs para acessar o aplicativo.
- Artifact Registry: armazena as imagens Docker para uso com o 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
}
Definir permissões
Define os papéis e as permissões do IAM que permitem que o Cloud Build implante todos os serviços.
- Ativar a conta de serviço do Cloud Build para implantar no Cloud Run
- Ativar a conta de serviço do Cloud Build para executar atividades da conta de serviço
- Ative a conta de serviço do Cloud Build para publicar no Cloud Run
- Ativar a conta de serviço do Cloud Build para armazenar contêineres no 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]
}
Criar buckets do Storage
Cria o local de armazenamento das imagens e miniaturas enviadas. e fornece um local de armazenamento temporário para o upload do 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
}
Criar repositório do Artifact Registry
O código a seguir descreve os parâmetros do Artifact Registry repositório em que os contêineres são armazenados.
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]
}
Criar contêiner para o aplicativo do Cloud Run
O comando a seguir cria uma imagem e faz upload dela para o Artifact Registry para uso com o 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
]
}
Implantar no Cloud Run
O comando a seguir usa o Cloud Build para implantar o app da Web cliente no 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
}
Implantar o código da função no Cloud Functions
Envie diretamente para as funções e ative.
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
Criar contêiner da API
O código abaixo cria uma imagem do Docker para o app da Web.
- name: "gcr.io/cloud-builders/docker"
args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]
Enviar o contêiner da API para o Artifact Registry
Ao enviar o contêiner para o Artifact Registry, o Cloud Run pode receber e veicular a imagem.
- name: "gcr.io/cloud-builders/docker"
args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]
Substituições
Crie uma variável com um padrão para que esses valores possam ser alterados no momento da implantação.
substitutions:
_REGION: us-central1
_BASENAME: scaler
Conclusão
Agora você tem uma solução de criação de miniaturas em execução no seu projeto usando o Cloud Functions para responder a alterações em um bucket do Storage. Você também tem todo o código para modificar ou estender essa solução