1. סקירה כללית
בשיעור ה-Lab הזה תלמדו איך להשתמש ב-Pulumi, כלי מסוג תשתית כקוד (IaC), כדי להקצות ולנהל משאבים ב-Google Cloud.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- התקנה והגדרה של Pulumi
- כתיבת תוכנית YAML כדי ליצור מודל של התשתית ב-Google Cloud
- הקצאה וניהול של משאבים בענן באמצעות Pulumi
- משתמשים בפקודה pulumi convert כדי להמיר תוכנית YAML לתוכנית Python
2. הגדרה ודרישות
הגדרת סביבה בקצב עצמי
- נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-
PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
3. הגדרת התשתית
התקנה והגדרה של Pulumi
ב-Cloud Shell, מריצים את הפקודה הבאה כדי להתקין את Pulumi:
curl -fsSL https://get.pulumi.com | sh
הוספת Pulumi לנתיב וצפייה בהודעת העזרה של Pulumi
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
מריצים את הפקודות הבאות כדי להגדיר את מזהה הפרויקט ולאשר את הגישה. צריך לפעול לפי ההוראות שמופיעות בפקודות
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
ב-Cloud Shell, יוצרים קטגוריה של GCS ומשתמשים בה כקצה עורפי
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
יצירת פרויקט חדש
ב-Cloud Shell, יוצרים את ספריית הבסיס של הפרויקט.
mkdir pulumi-lab && cd pulumi-lab
הגדרת קובץ הפרויקט(נקודת הכניסה ל-Pulumi)
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
הגדרת משאבי YAML
יוצרים ספרייה להחזקת הגדרות של משאבים בענן בפורמט YAML
mkdir yaml-repo
יוצרים קובץ yaml-repo/Pulumi.yaml עם הגדרות המשאבים הבאות
- קטגוריה
- קישור IAM
- אובייקט טקסט עם המחרוזת Hello World!
- And some outputs
resources:
# Create a GCP resource (Storage Bucket)
my-bucket:
type: gcp:storage:Bucket
properties:
location: US
website:
mainPageSuffix: index.html
uniformBucketLevelAccess: true
my-bucket-binding:
type: gcp:storage:BucketIAMBinding
properties:
bucket: ${my-bucket.name}
role: "roles/storage.objectViewer"
members: ["allUsers"]
index-object:
type: gcp:storage:BucketObject
properties:
bucket: ${my-bucket}
source:
fn::stringAsset: Hello World!
outputs:
bucketName: ${my-bucket.url}
פריסת המשאבים
הפעלה והגדרה של מחסנית
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
בודקים את הגדרות ה-stack ורואים את המפתח gcp:project עם מזהה הפרויקט כערך
pulumi config
בשלב הזה, מבנה הספריות צריך להיראות כך
├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
└── Pulumi.yaml
פריסת המקבץ
pulumi up
הפקודה הזו מעריכה את התוכנית וקובעת אילו עדכונים צריך לבצע במשאבים. קודם מוצגת תצוגה מקדימה עם פירוט של השינויים שיבוצעו כשמריצים את הפקודה
(פלט)
Previewing update (dev):
Downloading plugin gcp v6.44.0: 45.69 MiB / 45.69 MiB [=============] 100.00% 1s
Type Name Plan
+ pulumi:pulumi:Stack pulumi-lab-dev create
+ ├─ gcp:storage:Bucket my-bucket create
+ ├─ gcp:storage:BucketObject index-object create
+ └─ gcp:storage:BucketIAMBinding my-bucket-binding create
Outputs:
bucketName: output<string>
Resources:
+ 4 to create
Do you want to perform this update? [Use arrows to move, type to filter]
yes
> no
details
בוחרים באפשרות כן והמשאבים יוקצו. הפלט אמור להיראות כך:
Do you want to perform this update? yes
Updating (dev):
Type Name Status
+ pulumi:pulumi:Stack pulumi-lab-dev created (3s)
+ ├─ gcp:storage:Bucket my-bucket created (1s)
+ ├─ gcp:storage:BucketObject index-object created (0.78s)
+ └─ gcp:storage:BucketIAMBinding my-bucket-binding created (5s)
Outputs:
bucketName: "gs://my-bucket-874aa08"
Resources:
+ 4 created
Duration: 11s
הרצת הפקודה הבאה תדפיס פלטים שהוגדרו
pulumi stack output
מריצים את הפקודה הבאה כדי לאמת את השינוי
gsutil ls $(pulumi stack output bucketName)
הפלט ייראה כך
(פלט)
gs://my-bucket-11a9046/index-object-77a5d80
4. המרת YAML ל-Python
נמיר את הדוגמה שלמעלה לתוכנית Pulumi Python
pulumi convert --language python --out ./py-repo
בודקים את הקוד שנוצר ב-py-repo
cat py-repo/__main__.py
(פלט)
import pulumi
import pulumi_gcp as gcp
my_bucket = gcp.storage.Bucket("my-bucket",
location="US",
website=gcp.storage.BucketWebsiteArgs(
main_page_suffix="index.html",
),
uniform_bucket_level_access=True)
my_bucket_binding = gcp.storage.BucketIAMBinding("my-bucket-binding",
bucket=my_bucket.name,
role="roles/storage.objectViewer",
members=["allUsers"])
index_object = gcp.storage.BucketObject("index-object",
bucket=my_bucket.id,
source=pulumi.StringAsset("Hello World!"))
pulumi.export("bucketName", my_bucket.url)
.......
הפעלת סביבה וירטואלית של Python
source py-repo/bin/activate
מעדכנים את קובץ הפרויקט Pulumi.yaml כך שיצביע על תוכנית Python. שימו לב שזמן הריצה והכניסה הראשית השתנו
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
מנסים לפרוס מחדש את ה-stack ובוחרים באפשרות yes (כן).
pulumi up
לא אמורים להיות שינויים והפלט אמור להיראות כך
(פלט)
Previewing update (dev):
Type Name Plan
pulumi:pulumi:Stack pulumi-lab-dev
Resources:
4 unchanged
Do you want to perform this update? yes
Updating (dev):
Type Name Status
pulumi:pulumi:Stack pulumi-lab-dev
Outputs:
bucketName: "gs://my-bucket-c2b49ad"
Resources:
4 unchanged
Duration: 6s
5. מחיקת המשאבים
מחיקת המשאבים שנוצרו
pulumi destroy
האישור ייראה כך
Previewing update (dev):
Type Name Plan
pulumi:pulumi:Stack pulumi-lab-dev
Resources:
4 unchanged
Do you want to perform this update? [Use arrows to move, type to filter]
yes
> no
details
Do you want to perform this destroy? yes
Destroying (dev):
Type Name Status
- pulumi:pulumi:Stack pulumi-lab-dev deleted
- ├─ gcp:storage:BucketIAMBinding my-bucket-binding deleted (5s)
- ├─ gcp:storage:BucketObject index-object deleted (1s)
- └─ gcp:storage:Bucket my-bucket deleted (0.73s)
Outputs:
- bucketName: "gs://my-bucket-874aa08"
Resources:
- 4 deleted
Duration: 10s
6. מעולה!
כל הכבוד, סיימתם את ה-Lab.