אפליקציית הפונקציות של אירועי אחסון היא ספריית תמונות ויוצרת תמונות ממוזערות. הוא מורכב מהרכיבים הבאים:
- אפליקציית לקוח שבה המשתמשים יכולים להעלות תמונות.
- ממשק API שמתארח בקונטיינר ואתר סטטי – Golang – Cloud Run
- אחסון – אחסון קבצים – Cloud Storage
- מעבד תמונות שיוצר תמונות ממוזערות של התמונות.
- פונקציות כשירות (FaaS) – Golang – Cloud Functions
- צינור עיבוד נתונים לפריסה.
- פריסה – Cloud Build
שנתחיל?
כדי להעתיק את קוד המקור ב-Cloud Shell, לוחצים על הקישור הבא. אחרי שמגיעים לשם, פקודה אחת תתחיל הרצה של עותק עובד של האפליקציה בפרויקט.
רכיבים של אפליקציית פונקציות של אירועי אחסון
הארכיטקטורה של אפליקציית הפונקציות של אירועי אחסון מתבססת על כמה מוצרים. ברשימה הבאה מפורטים הרכיבים, וגם מידע נוסף על הרכיבים, כולל קישורים לסרטונים קשורים, למסמכי מוצר ולמדריכים אינטראקטיביים.סקריפטים
סקריפט ההתקנה משתמש בקובץ הפעלה שנכתב ב-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 כדי להגיב לשינויים בקטגוריית אחסון. יש לכם גם את כל הקוד כדי לשנות או להרחיב את הפתרון הזה