किसी अंदरूनी Cloud Run सेवा और सार्वजनिक इंटरनेट, दोनों को ऐक्सेस करने के लिए Cloud Run सेवा को कॉन्फ़िगर करें

1. परिचय

खास जानकारी

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

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

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

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

  • सिर्फ़ वीपीसी से आने वाले ट्रैफ़िक को Cloud Run सेवा का इस्तेमाल करने की अनुमति कैसे दें
  • 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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

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

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

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend-with-internet
BACKEND=backend
SUBNET_NAME=default

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

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

mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-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-w-internet

इसके बाद, यहां दिए गए कॉन्टेंट के साथ 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",
    "htmx.org": "^1.9.10"
  }
}

इसके बाद, नीचे दिए गए कॉन्टेंट के साथ 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 Request Tester service on the Internet</h1>
      <form hx-trigger="submit" hx-post="/callService" hx-target="#zen">
        <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="zen" 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 सेवाओं को सही तरीके से डिप्लॉय किया है.

अपने वेब ब्राउज़र में फ़्रंटएंड सेवा का यूआरएल खोलें. उदाहरण के लिए, https://frontend-your-hash-uc.a.run.app/

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

आपको "नमस्ते, दुनिया के लोगों" दिखेगा

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

Cloud Run सेवा को अपने प्राइवेट नेटवर्क में शामिल करने के लिए, यहां दी गई gcloud कमांड चलाएं.

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

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

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

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

इसके लिए, आपको अपने फ़्रंटएंड Cloud Run सेवा में डायरेक्ट वीपीसी इग्रेस जोड़ना होगा. इससे यह पक्का किया जा सकेगा कि यह वीपीसी नेटवर्क पर मौजूद इंटरनल आईपी पतों तक पहुंच सके. इसके बाद, आपको इस तरह से इग्रेस कॉन्फ़िगर करना होगा कि सिर्फ़ निजी आईपी के अनुरोधों को वीपीसी पर रूट किया जाए. इस कॉन्फ़िगरेशन की मदद से, आपका फ़्रंटएंड अब भी सार्वजनिक इंटरनेट से कनेक्ट हो पाएगा. Cloud Run की अन्य सेवाओं से अनुरोध पाने के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.

डायरेक्ट वीपीसी इग्रेस कॉन्फ़िगर करना

फ़्रंटएंड सेवा पर डायरेक्ट वीपीसी इग्रेस का इस्तेमाल करने के लिए, सबसे पहले यह निर्देश चलाएं:

gcloud beta run services update $FRONTEND \
--network=$SUBNET_NAME \
--subnet=$SUBNET_NAME  \
--vpc-egress=private-ranges-only \
--region=$REGION

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

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

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

VPC access:
    Network:        default
    Subnet:          default
    Egress:          private-ranges-only

Private Google Access की सुविधा चालू करना

इसके बाद, आपको सबनेट पर Private Google Access चालू करना होगा. इसके लिए, यह कमांड चलाएं:

gcloud compute networks subnets update $SUBNET_NAME \
--region=$REGION \
--enable-private-ip-google-access

इस कमांड को चलाकर, यह पुष्टि की जा सकती है कि Private Google Access चालू है या नहीं:

gcloud compute networks subnets describe $SUBNET_NAME \
--region=$REGION \
--format="get(privateIpGoogleAccess)"

run.app यूआरएल के लिए Cloud DNS ज़ोन बनाना

आखिर में, run.app यूआरएल के लिए एक Cloud DNS ज़ोन बनाएं, ताकि Google Cloud उन्हें इंटरनल आईपी पतों के तौर पर इस्तेमाल कर सके.

पिछले चरण में, जब आपने निजी-रेंज-ओनली के लिए डायरेक्ट वीपीसी इग्रेस कॉन्फ़िगर किया था. इसका मतलब है कि आपकी फ़्रंटएंड सेवा से आउटबाउंड कनेक्शन, सिर्फ़ वीपीसी नेटवर्क पर जाएंगे. ऐसा तब होगा, जब डेस्टिनेशन कोई इंटरनल आईपी हो. हालांकि, आपकी बैकएंड सेवा, run.app यूआरएल का इस्तेमाल करती है. यह यूआरएल, सार्वजनिक आईपी पते पर रीडायरेक्ट करता है.

इस चरण में, आपको run.app यूआरएल के लिए एक Cloud DNS ज़ोन बनाना होगा, ताकि वे private.googleapis.com आईपी पते की रेंज में बदल जाएं. इन्हें अंदरूनी आईपी पते के तौर पर पहचाना जाता है. अब इन रेंज के लिए किए गए सभी अनुरोध, आपके वीपीसी नेटवर्क के ज़रिए भेजे जाएंगे.

इसके लिए, यह तरीका अपनाएं: https://cloud.google.com/run/docs/securing/private-networking#from-other-services

# do not include the https:// in your DNS Name
# for example: backend-<hash>-uc.a.run.app
DNS_NAME=<your backend service URL without the https://>

gcloud dns --project=$PROJECT_ID managed-zones create codelab-backend-service \
 --description="" \
 --dns-name="a.run.app." \
 --visibility="private" \
 --networks=$SUBNET_NAME

gcloud dns --project=$PROJECT_ID record-sets create $DNS_NAME. \
--zone="codelab-backend-service" \
 --type="A" \
 --ttl="60" \
--rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11"

अब जब अपनी वेबसाइट के लिए बैकएंड सेवा का इस्तेमाल किया जाएगा, तब आपको "hello world" दिखेगा.

इसके अलावा, https://curlmyip.org/ का इस्तेमाल करके इंटरनेट ऐक्सेस करने पर, आपको अपना आईपी पता दिखेगा.

6. समस्या का हल

अगर सेटिंग सही तरीके से कॉन्फ़िगर नहीं की गई हैं, तो आपको गड़बड़ी के ये मैसेज मिल सकते हैं.

  • अगर आपको गड़बड़ी getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app मिलती है, तो पक्का करें कि आपने डीएनएस ए रिकॉर्ड में "https://" न जोड़ा हो
  • ज़ोन कॉन्फ़िगर करने के बाद, बैकएंड को ऐक्सेस करते समय अगर आपको 404 गड़बड़ी का मैसेज मिलता है, तो आपके पास दो विकल्प हैं. पहला, global run.app रिकॉर्ड पर मौजूद कैश मेमोरी के खत्म होने का इंतज़ार करें. उदाहरण के लिए, छह घंटे. दूसरा, नई रीविज़न बनाकर कैश मेमोरी मिटाएं. इसके लिए, यह कमांड चलाएं: gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION

7. बधाई हो!

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

हमारा सुझाव है कि आप Cloud Run पर प्राइवेट नेटवर्किंग से जुड़ा दस्तावेज़ पढ़ें.

हमने क्या-क्या बताया

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

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

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

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

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