1. نظرة عامة
يعلّمك هذا التمرين المعملي كيفية استخدام Pulumi، وهي أداة للبنية الأساسية كرمز برمجي لتوفير موارد Google Cloud وإدارتها.
ما سوف تتعلمه
ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:
- تثبيت Pulumi وإعداده
- كتابة برنامج YAML لتصميم البنية الأساسية على Google Cloud
- توفير موارد Cloud وإدارتها باستخدام Pulumi
- استخدام الدالة pulumi convert لتحويل برنامج YAML إلى برنامج python
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID
). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في 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
باستخدام تعريفات الموارد التالية.
- دلو
- ربط إدارة الهوية وإمكانية الوصول
- كائن نصي يتضمن السلسلة "Hello World!"
- وبعض النتائج
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- تهانينا!
تهانينا، لقد أنهيت التمرين المعملي.