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.
    • 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..

Buka di Cloud Shell

Lihat kode sumber di GitHub


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

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