استخدام 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 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. ربط 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. تهانينا!

تهانينا، لقد أكملت الدرس التطبيقي.