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

1. परिचय

खास जानकारी

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

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

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

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

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

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

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

Cloud Shell चालू करें

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

cb81e7c8e34bc8d.png

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

d95252b003979716.png

Cloud Shell को प्रोविज़न करने और उससे कनेक्ट होने में कुछ सेकंड लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. इसमें 5 जीबी की परसिस्टेंट होम डायरेक्ट्री मिलती है. साथ ही, यह 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 की सेवा बनाना

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

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 सेवा पर रूट होता है.

आपको "hello world" दिखेगा.

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

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

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

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

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

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

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

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

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

इसके लिए, आपको फ़्रंटएंड 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

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

इस बार आपको "hello world" दिखेगा.

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

6. बधाई हो!

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

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

हमने क्या कवर किया

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

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

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

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

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