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

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

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

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

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

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

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

अपनी स्पीड से एनवायरमेंट सेट अप करना

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या पूरे प्रोजेक्ट को मिटाएं. 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. IAM बाइंडिंग
  3. "नमस्ते, दुनिया के लोगों!" स्ट्रिंग वाला टेक्स्ट ऑब्जेक्ट
  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. बधाई हो!

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