استخدام Pulumi على Google Cloud من خلال YAML

1. نظرة عامة

يعلّمك هذا التمرين المعملي كيفية استخدام Pulumi، وهي أداة للبنية الأساسية كرمز برمجي لتوفير موارد Google Cloud وإدارتها.

ما سوف تتعلمه

ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:

  • تثبيت Pulumi وإعداده
  • كتابة برنامج YAML لتصميم البنية الأساسية على Google Cloud
  • توفير موارد Cloud وإدارتها باستخدام Pulumi
  • استخدام الدالة pulumi convert لتحويل برنامج YAML إلى برنامج python

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في 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. ربط إدارة الهوية وإمكانية الوصول
  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

اختَر yes (نعم) وستتم إدارة الموارد. يجب أن تبدو مخرجاتك على هذا النحو

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- تهانينا!

تهانينا، لقد أنهيت التمرين المعملي.