שימוש ב-Pulumi ב-Google Cloud באמצעות YAML

1. סקירה כללית

בשיעור ה-Lab הזה תלמדו איך להשתמש ב-Pulumi, כלי מסוג תשתית כקוד (IaC), כדי להקצות ולנהל משאבים ב-Google Cloud.

מה תלמדו

בשיעור Lab זה תלמדו איך:

  • התקנה והגדרה של Pulumi
  • כתיבת תוכנית YAML כדי ליצור מודל של התשתית ב-Google Cloud
  • הקצאה וניהול של משאבים בענן באמצעות Pulumi
  • משתמשים בפקודה pulumi convert כדי להמיר תוכנית YAML לתוכנית Python

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף 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 עם הגדרות המשאבים הבאות

  1. קטגוריה
  2. קישור IAM
  3. אובייקט טקסט עם המחרוזת Hello World!‎
  4. 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.