डायरेक्ट VPC इग्रेस का इस्तेमाल करके, Cloud Run की इंटरनल सेवा को ऐक्सेस करने के लिए, Cloud Run सेवा को कॉन्फ़िगर करने का तरीका

1. परिचय

खास जानकारी

कई संगठन अपनी सेवाओं और ऐप्लिकेशन के लिए नेटवर्क ट्रैफ़िक को सुरक्षित करने के लिए, पेरीमीटर कंट्रोल के साथ Google Cloud पर वर्चुअल प्राइवेट क्लाउड (VPC) नेटवर्क का इस्तेमाल करते हैं, ताकि डेटा बाहर निकाला जा सके. VPC नेटवर्क किसी फ़िज़िकल नेटवर्क का वर्चुअल वर्शन होता है, जिसे Google के प्रोडक्शन नेटवर्क में लागू किया जाता है. VPC नेटवर्क, आपके Compute Engine वर्चुअल मशीन (वीएम) इंस्टेंस के लिए कनेक्टिविटी की सुविधा देता है, इंटरनल ऐप्लिकेशन लोड बैलेंसर के लिए नेटिव इंटरनल पासथ्रू नेटवर्क लोड बैलेंसर और प्रॉक्सी सिस्टम की सुविधा देता है. साथ ही, Cloud इंटरकनेक्ट के लिए Cloud वीपीएन टनल और VLAN अटैचमेंट का इस्तेमाल करके, कंपनी की इमारत में मौजूद नेटवर्क से कनेक्ट करता है और Google Cloud के बाहरी लोड बैलेंसर से बैकएंड में ट्रैफ़िक बांटता है.

वर्चुअल मशीन (वीएम) से अलग, Cloud Run सेवाएं डिफ़ॉल्ट रूप से किसी खास VPC नेटवर्क से नहीं जुड़ी होती हैं. यह कोडलैब, इन्ग्रेस डेटा ट्रैफ़िक (इनबाउंड कनेक्शन) की सेटिंग को बदलने का तरीका बताता है. इससे, सिर्फ़ VPC से आने वाला ट्रैफ़िक ही Cloud Run सेवा (जैसे, बैकएंड सेवा) को ऐक्सेस कर सकता है. इसके अलावा, यह कोडलैब आपको VPC की मदद से, बैकएंड क्लाउड रन सेवा को ऐक्सेस करने के लिए कोई दूसरी सेवा (जैसे, फ़्रंटएंड सेवा) पाने का तरीका बताता है.

इस उदाहरण में, बैकएंड क्लाउड रन सेवा हैलो वर्ल्ड दिखाती है. फ़्रंटएंड Cloud Run सेवा, यूआरएल इकट्ठा करने के लिए यूज़र इंटरफ़ेस (यूआई) में एक इनपुट फ़ील्ड देती है. इसके बाद, फ़्रंटएंड सेवा उस यूआरएल के लिए जीईटी अनुरोध करती है (जैसे कि बैकएंड सेवा). इससे, इसे सेवा के अनुरोध के लिए, सेवा के अनुरोध के लिए सेवा के तौर पर सेट किया जाता है, न कि ब्राउज़र से सेवा के अनुरोध के लिए. जब फ़्रंटएंड सेवा बैकएंड तक पहुंच जाती है, तब ब्राउज़र में हैलो वर्ल्ड मैसेज दिखता है.

आपको इनके बारे में जानकारी मिलेगी

  • सिर्फ़ VPC से अपनी Cloud Run सेवा पर ट्रैफ़िक को अनुमति देने का तरीका
  • सिर्फ़ अंदरूनी इन्ग्रेस डेटा ट्रैफ़िक के साथ Cloud Run सेवा के साथ संपर्क करने के लिए, Cloud Run सेवा पर इग्रेस डेटा ट्रैफ़िक को कॉन्फ़िगर करने का तरीका

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

ज़रूरी शर्तें

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह Google Cloud में काम करती है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाने में मदद करती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. Cloud Run सेवाएं बनाना

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

आपके पास ऐसे एनवायरमेंट वैरिएबल सेट करने का विकल्प होता है जिनका इस्तेमाल पूरे कोडलैब के दौरान किया जाएगा.

REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend
BACKEND=backend

बैकएंड Cloud Run सेवा बनाएं

सबसे पहले, सोर्स कोड के लिए एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में cd डालें.

mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend

इसके बाद, इस कॉन्टेंट के साथ एक package.json फ़ाइल बनाएं:

{
    "name": "backend-service",
    "version": "1.0.0",
    "description": "",
    "scripts": {
        "start": "node index.js"
    },
    "dependencies": {
        "express": "^4.18.1"
    }
}

इसके बाद, नीचे दिए गए कॉन्टेंट के साथ एक index.js सोर्स फ़ाइल बनाएं. इस फ़ाइल में सेवा का एंट्री पॉइंट और ऐप्लिकेशन का मुख्य लॉजिक शामिल है.

const express = require('express');

const app = express();

app.use(express.urlencoded({ extended: true }));

app.get('/', function (req, res) {
    res.send("hello world");
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`helloworld: listening on port ${port}`);
});

आखिर में, नीचे दी गई कमांड को चलाने वाली Cloud Run सेवा को डिप्लॉय करें.

gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION

फ़्रंटएंड Cloud Run सेवा बनाएं

फ़्रंटएंड डायरेक्ट्री पर जाएं.

cd ../frontend

इसके बाद, इस कॉन्टेंट के साथ एक package.json फ़ाइल बनाएं:

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^1.6.6",
    "express": "^4.18.2"
  }
}

इसके बाद, नीचे दिए गए कॉन्टेंट के साथ एक index.js सोर्स फ़ाइल बनाएं. इस फ़ाइल में सेवा का एंट्री पॉइंट और ऐप्लिकेशन का मुख्य लॉजिक शामिल है.

const express = require("express");
const app = express();
const port = 8080;
const path = require('path');
const axios = require('axios');

// serve static content (index.html) using
// built-in middleware function in Express 
app.use(express.static('public'));
app.use(express.urlencoded({ extended: true }));

// this endpoint receives a URL in the post body
// and then makes a get request to that URL
// results are sent back to the caller
app.post('/callService', async (req, res) => {

    const url = req.body.url;
    let message = "";

    try {
        console.log("url: ", url);
        const response = await axios.get(url);
        message = response.data;

    } catch (error) {
        message = error.message;
        console.error(error.message);
    }

    res.send(`
        ${message}
        <p>
        </p>
    `);
});

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`);
});

index.html फ़ाइल के लिए एक सार्वजनिक डायरेक्ट्री बनाएं

mkdir public
touch public/index.html

इसके बाद, index.html को इसमें ये चीज़ें शामिल करें:

<html>
  <script
    src="https://unpkg.com/htmx.org@1.9.10"
    integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
    crossorigin="anonymous"
  ></script>
  <body>
    <div style="margin-top: 100px; margin-left: 100px">
      <h1>I'm the Frontend service on the Internet</h1>
      <form hx-trigger="submit" hx-post="/callService" hx-target="#message">
        <label for="url"> URL:</label>
        <input
          style="width: 308px"
          type="text"
          id="url"
          name="url"
          placeholder="The backend service URL"
          required
        />
        <button hx-indicator="#loading" type="submit">Submit</button>
        <p></p>
        <span class="htmx-indicator" id="loading"> Loading... </span>
        <div id="message" style="white-space: pre-wrap"></div>
        <p></p>
      </form>
    </div>
  </body>
</html>

आखिर में, नीचे दी गई कमांड को चलाने वाली Cloud Run सेवा को डिप्लॉय करें.

gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION

बैकएंड सेवा को कॉल करें

पुष्टि करें कि आपने दो Cloud Run सेवाओं को सफलतापूर्वक डिप्लॉय कर लिया है.

अपने वेब ब्राउज़र में फ़्रंटएंड सेवा का यूआरएल खोलें.

टेक्स्ट बॉक्स में, बैकएंड सेवा का यूआरएल डालें. ध्यान दें कि यह अनुरोध आपके ब्राउज़र से रूट किए जाने के बजाय, फ़्रंट एंड Cloud Run इंस्टेंस से बैकएंड Cloud Run सेवा पर रूट किया जाता है.

आपको "हैलो वर्ल्ड" दिखेगा.

4. सिर्फ़ अंदरूनी इन्ग्रेस डेटा ट्रैफ़िक के लिए बैकएंड सेवा सेट करें

सिर्फ़ VPC नेटवर्क से जुड़े ट्रैफ़िक को अपनी बैकएंड सेवा को ऐक्सेस करने की अनुमति देने के लिए, नीचे दिया गया gcloud निर्देश चलाएं.

gcloud run services update $BACKEND --ingress internal --region $REGION

यह पुष्टि करने के लिए कि आपकी बैकएंड सेवा को सिर्फ़ VPC से ट्रैफ़िक मिल सकता है, अपनी फ़्रंटएंड सेवा से बैकएंड सेवा को फिर से कॉल करने की कोशिश करें.

इस बार आपको "स्टेटस कोड 404 की मदद से अनुरोध पूरा नहीं किया जा सका" मैसेज दिखेगा

आपको यह गड़बड़ी इसलिए मिली है, क्योंकि फ़्रंटएंड Cloud Run सेवा के आउटबाउंड अनुरोध (यानी कि इग्रेस डेटा ट्रैफ़िक) पहले इंटरनेट पर भेजा जाता है. इसलिए, Google Cloud को इस अनुरोध के स्रोत की जानकारी नहीं मिलती.

अगले सेक्शन में, आपको VPC ऐक्सेस करने के लिए, फ़्रंटएंड सेवा कॉन्फ़िगर करनी होगी. इससे Google Cloud को पता चल जाएगा कि अनुरोध, VPC से मिला है. VPC की पहचान इंटरनल सोर्स के तौर पर की जाती है.

5. VPC ऐक्सेस करने के लिए, फ़्रंटएंड सेवा कॉन्फ़िगर करें

इस सेक्शन में, VPC की मदद से बैकएंड सेवा के साथ संपर्क करने के लिए, फ़्रंटएंड Cloud Run सेवा को कॉन्फ़िगर किया जाएगा.

ऐसा करने के लिए, आपको अपने फ़्रंटएंड Cloud Run इंस्टेंस में डायरेक्ट VPC इग्रेस डेटा जोड़ना होगा, ताकि आपकी सेवा को VPC में इस्तेमाल करने के लिए इंटरनल आईपी मिल सके. इसके बाद, आपको इग्रेस डेटा ट्रैफ़िक को इस तरह कॉन्फ़िगर करना होगा कि फ़्रंटएंड सेवा के सभी आउटबाउंड कनेक्शन, VPC पर चले जाएं.

सबसे पहले, डायरेक्ट VPC इग्रेस डेटा ट्रैफ़िक को चालू करने के लिए यह कमांड चलाएं:

gcloud beta run services update $FRONTEND \
--network=default \
--subnet=default \
--vpc-egress=all-traffic \
--region=$REGION

अब यह पुष्टि की जा सकती है कि आपकी फ़्रंटएंड सेवा के पास VPC का ऐक्सेस है:

gcloud beta run services describe $FRONTEND \
--region=$REGION

आपको इससे मिलता-जुलता आउटपुट दिखेगा

VPC access:
    Network:         default
    Subnet:          default
    Egress:          all-traffic

अब अपनी फ़्रंटएंड सेवा से बैकएंड सेवा को कॉल करने की फिर से कोशिश करें.

इस बार आपको "हैलो वर्ल्ड" दिखेगा.

ध्यान दें: आपकी फ़्रंटएंड सेवा के पास इंटरनेट का ऐक्सेस नहीं होगा, क्योंकि पूरा इग्रेस डेटा VPC पर भेज दिया गया है. उदाहरण के लिए, अगर आपकी फ़्रंटएंड सेवा https://curlmyip.org/ को ऐक्सेस करने की कोशिश करती है, तो वह टाइम आउट हो जाएगा.

6. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप Cloud Run दस्तावेज़ पढ़ें और Cloud Run सेवाओं के लिए निजी नेटवर्किंग को कॉन्फ़िगर करने का तरीका जानें.

इसमें हमने इन विषयों के बारे में बताया

  • सिर्फ़ VPC से अपनी Cloud Run सेवा पर ट्रैफ़िक को अनुमति देने का तरीका
  • सिर्फ़ अंदरूनी इन्ग्रेस डेटा ट्रैफ़िक के साथ Cloud Run सेवा के साथ संपर्क करने के लिए, Cloud Run सेवा पर इग्रेस डेटा ट्रैफ़िक को कॉन्फ़िगर करने का तरीका

7. व्यवस्थित करें

अनजाने में लगने वाले शुल्कों से बचने के लिए, (उदाहरण के लिए, अगर Cloud Run सेवाओं का अनुरोध अनजाने में फ़्री टियर में हर महीने Cloud Run के लिए असाइन किए जाने वाले बजट से ज़्यादा हो जाता है), तो आप या तो Cloud Run को मिटा सकते हैं या दूसरे चरण में बनाए गए प्रोजेक्ट को मिटा सकते हैं.

Cloud Run सेवा को मिटाने के लिए, https://console.cloud.google.com/run पर Cloud Run Cloud Console पर जाएं. इसके बाद, $FRONTEND और $BACKEND सेवाओं को मिटाएं.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं और दूसरे चरण में बनाया गया प्रोजेक्ट चुनें. इसके बाद, 'मिटाएं' चुनें. अगर प्रोजेक्ट मिटाया जाता है, तो आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.