Aplikasi Fungsi Peristiwa Penyimpanan adalah direktori gambar dan pembuat thumbnail. Komponen ini terdiri dari komponen berikut:
- Aplikasi klien tempat pengguna dapat mengupload gambar.
- Situs statis dan API yang dihosting container - Golang - Cloud Run
- Penyimpanan - Penyimpanan File - Cloud Storage
- Prosesor gambar yang membuat thumbnail gambar.
- Functions as a Service - Golang - Cloud Functions
- Pipeline deployment.
- Deployment - Cloud Build
Mulai
Klik link berikut untuk mendapatkan salinan kode sumber di Cloud Shell. Setelah ada, satu perintah akan menjalankan salinan aplikasi yang berfungsi di project Anda..
Komponen Aplikasi Fungsi Peristiwa Penyimpanan
Arsitektur Aplikasi Fungsi Peristiwa Penyimpanan menggunakan beberapa produk. Berikut ini daftar komponen, beserta informasi selengkapnya tentang komponen, termasuk link ke video terkait, dokumentasi produk, dan panduan interaktif.Skrip
Skrip penginstalan menggunakan file yang dapat dieksekusi yang ditulis di alat CLI Terraform dan go
untuk mengambil project kosong dan menginstal aplikasi di dalamnya. Output harus berupa aplikasi yang berfungsi dan URL untuk alamat IP load balancing.
./main.tf
Mengaktifkan layanan
Layanan Google Cloud dinonaktifkan dalam project secara default. Untuk menggunakan salah satu solusi 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 container 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
}
Tetapkan 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 menjalankan aktivitas Akun Layanan
- Aktifkan Akun Layanan Cloud Build untuk memublikasikan ke Cloud Run
- Aktifkan Akun Layanan Cloud Build untuk menyimpan container 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 Storage
Membuat lokasi Storage 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 container 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]
}
Membangun container untuk aplikasi Cloud Run
Perintah berikut 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
Yang 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
Kirim 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
Container API Build
Berikut ini adalah pembuatan 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
Mengirim container ke Artifact Registry memungkinkan Cloud Run 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 agar nilai tersebut dapat diubah pada waktu deployment.
substitutions:
_REGION: us-central1
_BASENAME: scaler
Kesimpulan
Anda sekarang memiliki solusi pembuatan thumbnail yang berjalan di project Anda menggunakan Cloud Functions untuk merespons perubahan dalam Bucket Storage. Anda juga memiliki semua kode untuk memodifikasi atau memperluas solusi ini