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

1. परिचय

खास जानकारी

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

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

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

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

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

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

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

  • आपने Cloud Console में लॉग इन किया है.
  • आपने पहले 2nd gen फ़ंक्शन को डिप्लॉय किया है. उदाहरण के लिए, शुरू करने के लिए Cloud Function 2nd gen क्विकस्टार्ट डिप्लॉय किया जा सकता है.

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 सेवाएं बनाना

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

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

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. VPC ऐक्सेस करने के लिए, फ़्रंटएंड सेवा कॉन्फ़िगर करें

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

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

डायरेक्ट VPC इग्रेस डेटा ट्रैफ़िक कॉन्फ़िगर करें

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

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

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

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

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

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

निजी Google ऐक्सेस चालू करें

इसके बाद, आप यह निर्देश चलाकर सबनेट पर निजी Google ऐक्सेस चालू करेंगे:

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

इस निर्देश की मदद से, यह पुष्टि की जा सकती है कि निजी Google ऐक्सेस चालू है या नहीं:

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

Run.app यूआरएल के लिए क्लाउड डीएनएस ज़ोन बनाएं

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

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

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

ऐसा करने के लिए, यहां जाएं: https://cloud.google.com/run/docs/secलुing/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"

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

और जब आप https://curlmyip.org/ का इस्तेमाल करके इंटरनेट तक पहुंचने की कोशिश करेंगे, तो आपको अपना आईपी पता दिखेगा.

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

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

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

7. बधाई हो!

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

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

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

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

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

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

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

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