Aplikasi Fungsi Peristiwa Penyimpanan adalah direktori gambar dan pembuat thumbnail. Komponen ini terdiri dari komponen berikut:
- Aplikasi klien tempat pengguna dapat mengupload gambar.
- API yang dihosting container dan situs statis - Golang - Cloud Run
- Penyimpanan - Penyimpanan File - Cloud Storage
- Pemroses gambar yang membuat thumbnail gambar.
- Functions as a Service - Golang - Cloud Functions
- Pipeline deployment.
- Deployment - Cloud Build
Mulai
Klik link berikut untuk melihat salinan kode sumber di Cloud Shell. Setelah di sana, satu perintah akan membuat salinan aplikasi yang berfungsi di project Anda.
Komponen Aplikasi Fungsi Peristiwa Penyimpanan
Arsitektur Aplikasi Fungsi Peristiwa Penyimpanan menggunakan beberapa produk. Berikut adalah daftar komponen, beserta informasi selengkapnya tentang komponen tersebut, termasuk link ke video terkait, dokumentasi produk, dan panduan interaktif.Skrip
Skrip penginstalan menggunakan file yang dapat dieksekusi yang ditulis di go
dan alat Terraform CLI untuk mengambil project kosong dan menginstal aplikasi di dalamnya. Output-nya harus berupa aplikasi yang berfungsi dan URL untuk alamat IP load balancing.
./main.tf
Mengaktifkan layanan
Layanan Google Cloud dinonaktifkan di project secara default. Untuk menggunakan solusi apa pun di sini, kita harus mengaktifkan hal berikut:
- Cloud Build - membuat image container dan men-deploy ke Cloud Run
- Cloud Storage - menghosting file statis
- Cloud Functions - Platform Functions as a Service
- Cloud Run - alat serverless yang akan menghosting penampung dan menyediakan URL untuk mengakses aplikasi.
- Artifact Registry - menyimpan image Docker untuk digunakan dengan 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
}
Menetapkan izin
Menetapkan peran dan izin IAM yang memungkinkan Cloud Build men-deploy semua layanan.
- Mengaktifkan Akun Layanan Cloud Build untuk men-deploy ke Cloud Run
- Mengaktifkan Akun Layanan Cloud Build untuk melakukan aktivitas Akun Layanan
- Mengaktifkan Akun Layanan Cloud Build untuk memublikasikan ke Cloud Run
- Mengaktifkan Akun Layanan Cloud Build untuk menyimpan penampung di 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]
}
Membuat bucket Penyimpanan
Membuat lokasi Penyimpanan untuk gambar dan thumbnail yang diupload, serta menyediakan lokasi penyimpanan sementara untuk upload 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
}
Membuat repositori Artifact Registry
Kode berikut menguraikan parameter untuk repositori Artifact Registry tempat penampung disimpan.
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]
}
Mem-build container untuk aplikasi Cloud Run
Berikut adalah perintah untuk mem-build image dan menguploadnya ke Artifact Registry untuk digunakan dengan 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
]
}
Men-deploy ke Cloud Run
Berikut ini menggunakan Cloud Build untuk men-deploy aplikasi web klien ke 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
}
Men-deploy kode fungsi ke Cloud Functions
Tekan langsung ke fungsi dan aktifkan.
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
Membuat Penampung API
Berikut ini cara membuat image Docker untuk aplikasi web.
- name: "gcr.io/cloud-builders/docker"
args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]
Mengirim container API ke Artifact Registry
Dengan mengirim container ke Artifact Registry, Cloud Run dapat mendapatkan image dan menayangkannya.
- name: "gcr.io/cloud-builders/docker"
args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]
Substitusi
Buat variabel dengan default sehingga nilai ini dapat diubah pada waktu deployment.
substitutions:
_REGION: us-central1
_BASENAME: scaler
Kesimpulan
Sekarang Anda memiliki solusi pembuatan thumbnail yang berjalan di project menggunakan Cloud Functions untuk merespons perubahan di Bucket Penyimpanan. Anda juga memiliki semua kode untuk mengubah atau memperluas solusi ini