YAML के साथ Google Cloud पर Pulumi का इस्तेमाल करना

1. खास जानकारी

इस लैब में, Pulumi का इस्तेमाल करने का तरीका बताया गया है. यह कोड के तौर पर इंफ़्रास्ट्रक्चर उपलब्ध कराने वाला टूल है. इसका इस्तेमाल करके, Google Cloud के संसाधनों को उपलब्ध कराया जा सकता है और उन्हें मैनेज किया जा सकता है.

आपको क्या सीखने को मिलेगा

इस लैब में, आपको ये काम करने का तरीका पता चलेगा:

  • Pulumi को इंस्टॉल और कॉन्फ़िगर करना
  • Google Cloud पर अपने इन्फ़्रास्ट्रक्चर को मॉडल करने के लिए YAML प्रोग्राम लिखें
  • Pulumi का इस्तेमाल करके, क्लाउड संसाधनों को उपलब्ध कराना और उन्हें मैनेज करना
  • YAML प्रोग्राम को Python प्रोग्राम में बदलने के लिए, pulumi बदलें का इस्तेमाल करें

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करें

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास खुद से भी यह पता लगाने का विकल्प है कि यह सुविधा उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के दौरान बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने में ज़्यादा खर्च नहीं आता. इस ट्यूटोरियल के बाद, आपसे बिलिंग न की जाए, इसके लिए संसाधनों को बंद किया जा सकता है. इसके लिए, आपने जो संसाधन बनाए हैं उन्हें मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.

3. इन्फ़्रास्ट्रक्चर सेटअप

Pulumi को इंस्टॉल और कॉन्फ़िगर करना

Pulumi इंस्टॉल करने के लिए, Cloud Shell में यह कमांड चलाएं

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. "Hey 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

Python प्रोग्राम पर ले जाने के लिए, Pulumi.yaml प्रोजेक्ट फ़ाइल को अपडेट करें. रनटाइम और मुख्य एंट्री पर ध्यान दें

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. बधाई हो!

बधाई हो, आपने लैब पूरा कर लिया है!