אפליקציית פונקציות של אירועי אחסון

ארכיטקטורה

אפליקציית הפונקציות של אירועי אחסון היא ספריית תמונות ויוצרת תמונות ממוזערות. הוא מורכב מהרכיבים הבאים:

  • אפליקציית לקוח שבה המשתמשים יכולים להעלות תמונות.
    • ממשק API שמתארח בקונטיינר ואתר סטטי – Golang –‏ Cloud Run
    • אחסון – אחסון קבצים – Cloud Storage
  • מעבד תמונות שיוצר תמונות ממוזערות של התמונות.
    • פונקציות כשירות (FaaS) – Golang – Cloud Functions
  • צינור עיבוד נתונים לפריסה.
    • פריסה – Cloud Build

שנתחיל?

כדי להעתיק את קוד המקור ב-Cloud Shell, לוחצים על הקישור הבא. אחרי שמגיעים לשם, פקודה אחת תתחיל הרצה של עותק עובד של האפליקציה בפרויקט.

Cloud Shell-פתיחה ב

צפייה בקוד המקור ב-GitHub


רכיבים של אפליקציית פונקציות של אירועי אחסון

הארכיטקטורה של אפליקציית הפונקציות של אירועי אחסון מתבססת על כמה מוצרים. ברשימה הבאה מפורטים הרכיבים, וגם מידע נוסף על הרכיבים, כולל קישורים לסרטונים קשורים, למסמכי מוצר ולמדריכים אינטראקטיביים.
וידאו Docs הדרכות מפורטות
Cloud Run ב-Cloud Run אפשר להריץ אפליקציות בקונטיינר, אבל בצורה חסרת שרת, בלי צורך להגדיר את מספר המופעים, המעבדים או הזיכרון. מעלים מאגר תגים ומקבלים כתובת URL.
Cloud Storage ‫Cloud Storage מספק אחסון קבצים והצגה ציבורית של תמונות באמצעות http(s).
Cloud Functions ‫Cloud Functions היא פלטפורמה של פונקציות כשירות (FaaS) שמאפשרת לכם להאזין להעלאות של קבצים ב-Cloud Storage ולהריץ קוד כדי ליצור תמונות ממוזערות שלהם.
Cloud Build ‫Cloud Build הוא הכלי שמאגד את הקונטיינרים ופורס אותם כך שיהיו זמינים כשירותי Cloud Run.

סקריפטים

סקריפט ההתקנה משתמש בקובץ הפעלה שנכתב ב-go ובכלים של Terraform CLI כדי לקחת פרויקט ריק ולהתקין בו את האפליקציה. הפלט צריך להיות אפליקציה פעילה וכתובת URL לכתובת ה-IP של איזון העומסים.

./main.tf

הפעלת שירותים

שירותי Google Cloud מושבתים בפרויקט כברירת מחדל. כדי להשתמש באחד מהפתרונות שמופיעים כאן, צריך להפעיל את האפשרויות הבאות:

  • Cloud Build – יוצר תמונות של קונטיינרים ופורס אותן ב-Cloud Run
  • Cloud Storage – אירוח קבצים סטטיים
  • Cloud Functions – פלטפורמה של פונקציות כשירות (FaaS)
  • Cloud Run – הכלי בלי שרת (serverless) שיארח את הקונטיינר ויספק כתובות URL לגישה לאפליקציה.
  • Artifact Registry – מאחסן את קובצי האימג' של Docker לשימוש עם 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
}

הגדרת ההרשאות

הגדרת תפקידים והרשאות ב-IAM שמאפשרים ל-Cloud Build לפרוס את כל השירותים.

  • הפעלת חשבון השירות של Cloud Build כדי לפרוס ל-Cloud Run
  • הפעלת האפשרות לחשבון השירות של Cloud Build לבצע פעולות בחשבון השירות
  • הפעלת האפשרות לחשבון השירות ב-Cloud Build לפרסם ב-Cloud Run
  • הפעלת חשבון השירות של Cloud Build כדי לאחסן קונטיינרים ב-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]
}

יצירת קטגוריות אחסון

יוצר את מיקום האחסון לתמונות ולתמונות הממוזערות שהועלו, ומספק מיקום אחסון זמני להעלאה של 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
}

יצירת מאגר Artifact Registry

בקטע הקוד הבא מפורטים הפרמטרים של מאגר Artifact Registry שבו מאוחסנים הקונטיינרים.

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]
}

יצירת קונטיינר לאפליקציית Cloud Run

השלבים הבאים יוצרים תמונה ומעלים אותה ל-Artifact Registry לשימוש עם 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
    ]
}

פריסה ב-Cloud Run

בדוגמה הבאה נעשה שימוש ב-Cloud Build כדי לפרוס את אפליקציית האינטרנט של הלקוח ב-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
}

פריסת קוד הפונקציה ב-Cloud Functions

מעבירים ישירות לפונקציות ומפעילים.

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

Build API Container

הפקודה הבאה יוצרת קובץ אימג' של Docker לאפליקציית האינטרנט.

- name: "gcr.io/cloud-builders/docker"
  args: [ "build", "-t", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod", ".", ]

העברת קונטיינר של Push API אל Artifact Registry

העברת הקונטיינר ל-Artifact Registry מאפשרת ל-Cloud Run לקבל את קובץ האימג' ולהציג אותו.

- name: "gcr.io/cloud-builders/docker"
  args: ["push", "$_REGION-docker.pkg.dev/$PROJECT_ID/$_BASENAME-app/prod"]

החלפות

יוצרים משתנה עם ערך ברירת מחדל כדי שאפשר יהיה לשנות את הערכים האלה בזמן הפריסה.

substitutions:
  _REGION: us-central1
  _BASENAME: scaler

סיכום

עכשיו יש לכם פתרון ליצירת תמונות ממוזערות שפועל בפרויקט שלכם באמצעות Cloud Functions כדי להגיב לשינויים בקטגוריית אחסון. יש לכם גם את כל הקוד כדי לשנות או להרחיב את הפתרון הזה