נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת PCD עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדה זו, תספק, באמצעות Terraform טהור, את התשתית הקטנה והמציאותית ביותר של יישום מונחה אירועים עבור PCD — מאגר Docker ב-Artifact Registry לאירוח תמונות הקונטיינר שלך, נושא (topic) ומנוי (subscription) ב-Pub/Sub כעמוד השדרה של העברת הודעות אסינכרונית, שירות Cloud Run המריץ תמונת קונטיינר זמנית, ו-Secret Manager עבור סודות היישום. חמישה בלוקים; כל תרחיש בחינת PCD מבוסס על תשתית זו.
העתק את הקטעים לקובץ main.tf יחיד, הפעל terraform init, ולאחר מכן terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.your-project-id בבלוק ה-provider.כולם חינמיים או כמעט חינמיים בהיקף המעבדה:
min_instances = 0 — עלות סרק אפסית.כ-$0 לחודש בנפח המעבדה. Cloud Run עם min_instances = 0 הוא ברירת המחדל המומלצת על ידי PCD — ללא חיובים על סרק.
אפשר את ממשקי ה-API של Cloud Run, Artifact Registry, Pub/Sub ו-Secret Manager.
terraform {
required_version = ">= 1.5"
required_providers {
google = { source = "hashicorp/google", version = "~> 6.0" }
}
}
provider "google" {
project = "your-project-id" # REPLACE
region = "us-central1"
}
locals {
labels = {
project = "certlabpro-pcd"
managed_by = "terraform"
}
}
resource "google_project_service" "run" {
service = "run.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "artifactregistry" {
service = "artifactregistry.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "pubsub" {
service = "pubsub.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "secretmanager" {
service = "secretmanager.googleapis.com"
disable_on_destroy = false
}Artifact Registry הוא מאגר הקונטיינרים והחבילות של GCP — התחליף המודרני ל-Container Registry (gcr.io) שהוצא משימוש. בחינת ה-PCD בודקת את תבנית ה-דחיפה ל-Artifact Registry ← פריסה מ-Artifact Registry כצורת ה-CI/CD הקנונית.
אנו יוצרים מאגר אזורי בפורמט Docker. דחוף אליו לאחר terraform apply באמצעות:
gcloud auth configure-docker us-central1-docker.pkg.dev
docker tag my-app:latest us-central1-docker.pkg.dev/$PROJECT/certlabpro-pcd-images/my-app:latest
docker push us-central1-docker.pkg.dev/$PROJECT/certlabpro-pcd-images/my-app:latest
resource "google_artifact_registry_repository" "images" {
repository_id = "certlabpro-pcd-images"
location = "us-central1"
format = "DOCKER"
description = "PCD lab Docker images"
labels = local.labels
depends_on = [google_project_service.artifactregistry]
}Pub/Sub הוא שירות העברת ההודעות המנוהל של GCP — הבסיס לכל יישום מונחה אירועים בתבנית PCD. נושאים (topics) הם יעדי פרסום; מנויים (subscriptions) הם נקודות קצה של צרכנים (משיכה או דחיפה). בחינת ה-PCD בודקת מסירה לפחות פעם אחת + צרכנים אידמפוטנטיים כסמנטיקה נושאת העומס.
אנו יוצרים:
orders — אליו מפרסמים המפיקים.orders-worker — צרכנים מושכים ממנו. פריסות פרודקשן משתמשות לעתים קרובות במנויי דחיפה (push subscriptions) לנקודות קצה של Cloud Run במקום זאת (הצורה הקנונית מונחית-האירועים של PCD: דחיפה מ-Pub/Sub ← Cloud Run); אנו נשארים עם משיכה כאן כדי לשמור על IAM פשוט יותר.ack_deadline_seconds = 60 מעניק לצרכנים 60 שניות לאשר; זמן ארוך יותר מפסק הזמן המוגדר כברירת מחדל לבקשות ב-Cloud Run, וזהו כפתור כיוונון חוזר בבחינת PCD.
resource "google_pubsub_topic" "orders" {
name = "orders"
labels = local.labels
depends_on = [google_project_service.pubsub]
}
resource "google_pubsub_subscription" "orders_worker" {
name = "orders-worker"
topic = google_pubsub_topic.orders.id
ack_deadline_seconds = 60
message_retention_duration = "604800s" # 7 days (max)
retry_policy {
minimum_backoff = "10s"
maximum_backoff = "600s"
}
labels = local.labels
}Cloud Run הוא שירות הקונטיינרים כשירות (container-as-a-service) של GCP — מריץ קונטיינרי Docker על תשתית הסרברלס של גוגל, ומתרחב עד לאפס (scales to zero). תבנית מומלצת של PCD: כל שירות Cloud Run פועל כחשבון שירות משלו, לעולם לא כחשבון שירות ברירת המחדל של Compute.
אנו פורסים שירות המריץ את תמונת ה-hello הציבורית כמציין מיקום (placeholder), מצרפים חשבון שירות לכל שירות עם roles/pubsub.subscriber על הנושא מהשלב השלישי, ומעניקים roles/run.invoker ל-allUsers עבור גישה בלתי מאומתת. עבור למפעיל (invoker) מוגבל IAM עבור סביבת ייצור — בחינת ה-PCD בודקת את ההחלפה הזו של allUsers ↔ זהות ספציפית.
resource "google_service_account" "worker" {
account_id = "certlabpro-pcd-worker"
display_name = "PCD lab Cloud Run worker"
}
resource "google_pubsub_subscription_iam_member" "worker_subscriber" {
subscription = google_pubsub_subscription.orders_worker.name
role = "roles/pubsub.subscriber"
member = "serviceAccount:${google_service_account.worker.email}"
}
resource "google_cloud_run_v2_service" "worker" {
name = "certlabpro-pcd-worker"
location = "us-central1"
template {
service_account = google_service_account.worker.email
scaling {
min_instance_count = 0 # scale-to-zero — no idle billing
max_instance_count = 5
}
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
resources {
limits = {
cpu = "1"
memory = "512Mi"
}
}
}
}
labels = local.labels
depends_on = [google_project_service.run]
}
resource "google_cloud_run_v2_service_iam_member" "public_invoker" {
name = google_cloud_run_v2_service.worker.name
location = google_cloud_run_v2_service.worker.location
role = "roles/run.invoker"
member = "allUsers" # lab-only; production = specific identity
}Secret Manager הוא מאגר הסודות של GCP — ערכים ממוספרים (גרסאות), גישה נשלטת באמצעות IAM, ווים (hooks) לסיבוב אוטומטי. תבנית מומלצת של PCD: תצורת יישום שאינה סוד נכנסת למשתני סביבה; תצורת יישום שכן סוד (מפתחות API, סיסמאות DB, אסימוני OAuth) נכנסת ל-Secret Manager, אליה מפנה שירות Cloud Run.
אנו יוצרים סוד + גרסה ראשונית, ולאחר מכן מעניקים לחשבון השירות של Cloud Run משלב 4 את roles/secretmanager.secretAccessor עליו. כדי לחבר את הסוד ל-Cloud Run כמשתנה סביבה, היית מוסיף בלוק env { name = "..."; value_source { secret_key_ref { ... } } } בתבנית השירות (הושמט בכוונה כדי לשמור על מיקוד שלב זה).
resource "google_secret_manager_secret" "db_password" {
secret_id = "certlabpro-pcd-db-password"
replication {
auto {}
}
labels = local.labels
depends_on = [google_project_service.secretmanager]
}
resource "google_secret_manager_secret_version" "db_password_v1" {
secret = google_secret_manager_secret.db_password.id
secret_data = "lab-placeholder-rotate-me"
}
resource "google_secret_manager_secret_iam_member" "worker_reader" {
secret_id = google_secret_manager_secret.db_password.id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:${google_service_account.worker.email}"
}terraform destroy מפרק הכל. השירות של Cloud Run נהרס (עם min_instances = 0 הוא כבר לא עלה דבר). המאגר של Artifact Registry נהרס (force_destroy מרומז מכיוון שהמעבדה אינה דוחפת תמונות כלשהן). משאבי Pub/Sub + Secret Manager נהרסים באופן נקי.
PCD מכסה משטחי מפתחי יישומים רבים ב-GCP שמעבדה זו אינה יכולה להכיל — Cloud Functions (החלופה הישנה/קלה יותר ל-Cloud Run), Cloud Tasks (תור אסינכרוני עמיד), Cloud Scheduler (cron כשירות), Cloud Endpoints / API Gateway (משטח API מנוהל לפני Cloud Run), Cloud Trace + Cloud Profiler + Cloud Debugger (טלמטריה של ביצועי יישומים — רמת ה-[[gcp-pcde]]), Firebase (פלטפורמת יישומים ניידים/ווב), Cloud Storage (משמש כאירוח נכסים סטטיים עבור SPAs), Cloud Build (CI/CD — [[gcp-pcde]]), Cloud Deploy (CD — [[gcp-pcde]]), Eventarc (נתב אירועים משירותי GCP ל-Cloud Run / Functions), Workflows (תיאום), Firestore (מסד נתונים NoSQL ליישומים), Memorystore (Redis), Vertex AI עבור GenAI בתוך יישומים, ומוצר App Engine כולו (מורשתי אך עדיין נמצא בתכנית הבחינה של PCD).
אנו נצמדים לפרימיטיבים של Artifact Registry + Pub/Sub + Cloud Run + Secret Manager מכיוון שהם מהווים את עמוד השדרה הקנוני של יישומי PCD מונחי-אירועים. Cloud Functions + Cloud Run חולקים את אותה תשתית תמונות של Artifact Registry. Eventarc מנתב אירועים ל-Cloud Run / Functions. Cloud Tasks הוא הגרסה הסינכרונית-RPC של Pub/Sub. שלטו בתשתית; החלופות משתלבות בה.
לכיסוי קונספטואלי של שירות אחר שירות, עיין בסעיפים עיון, מדריך ו-Editorial בדף אישור זה.