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

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

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

מה תלמדו

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

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

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

הגדרת סביבה בקצב אישי

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

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. וחלק מהפלט
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

צריך לבדוק את ההגדרות של המקבץ ולראות את המפתח 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

מנסים לפרוס מחדש את המקבץ ולבחור באפשרות כן.

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