از Pulumi در Google Cloud با YAML استفاده کنید

1. بررسی اجمالی

این آزمایشگاه به شما می آموزد که چگونه از Pulumi ، یک ابزار زیرساخت به عنوان کد برای تهیه و مدیریت منابع Google Cloud استفاده کنید.

آنچه خواهید آموخت

در این آزمایشگاه با نحوه انجام کارهای زیر آشنا می شوید:

  • Pulumi را نصب و پیکربندی کنید
  • برنامه YAML را بنویسید تا زیرساخت خود را در Google Cloud مدل کنید
  • تهیه و مدیریت منابع ابری با استفاده از Pulumi
  • از تبدیل pulumi برای تبدیل برنامه YAML به برنامه پایتون استفاده کنید

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول 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

دستورات زیر را برای تنظیم ID پروژه و مجوز دسترسی اجرا کنید. شما باید دستورالعمل های داده شده توسط دستورات را دنبال کنید

export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login

در Cloud Shell، یک سطل GCS ایجاد کنید و از آن به عنوان backend استفاده کنید

gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}

یک پروژه جدید ایجاد کنید

در Cloud Shell، دایرکتوری ریشه پروژه را ایجاد کنید

mkdir pulumi-lab && cd pulumi-lab

تعریف فایل پروژه (نقطه ورود به پولومی)

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 Binding
  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 را با ID پروژه خود به عنوان مقدار ببینید

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 را به پایتون تبدیل کنید

بیایید مثال بالا را به یک برنامه 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)
.......

محیط مجازی پایتون را فعال کنید

source py-repo/bin/activate

فایل پروژه Pulumi.yaml را برای اشاره به برنامه پایتون به روز کنید. توجه کنید زمان اجرا و ورودی اصلی تغییر کرده است

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: python
main: py-repo/
EOT

سعی کنید پشته را مجدداً مستقر کنید و yes را انتخاب کنید

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. تبریک!

تبریک می گویم، شما آزمایشگاه را تمام کردید!