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

1. نظرة عامة

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

ما ستتعرّف عليه

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

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

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

إعداد البيئة حسب وتيرة الطالب واحتياجاته

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع 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

انقر على نعم وسيتم توفير الموارد. يجب أن تبدو مخرجاتك على هذا النحو

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

يجب ألا يتم إجراء أي تغييرات، ويجب أن تبدو النتائج مشابهة لهذه

(output)

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

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