Aplikasi Fungsi Peristiwa Penyimpanan

+

Arsitektur

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.

Buka di Cloud Shell

Melihat kode sumber di GitHub


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.
Video Dokumen Panduan
Cloud Run Cloud Run memungkinkan Anda menjalankan aplikasi dalam container, tetapi dengan cara serverless, tanpa harus mengonfigurasi jumlah instance, prosesor, atau memori. Upload penampung, dapatkan URL.
Cloud Storage Cloud Storage menyediakan penyimpanan file dan penayangan gambar secara publik melalui http(s).
Cloud Functions Cloud Functions adalah platform layanan fungsi yang memungkinkan Anda memproses upload file Cloud Storage dan menjalankan kode untuk membuat thumbnail-nya.
Cloud Build Cloud Build adalah alat yang memaketkan container dan men-deploynya agar tersedia sebagai layanan Cloud Run.

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