সরাসরি ভিপিসি এগ্রেস ব্যবহার করে একটি অভ্যন্তরীণ ক্লাউড রান পরিষেবা অ্যাক্সেস করতে একটি ক্লাউড রান পরিষেবা কীভাবে কনফিগার করবেন৷

১. ভূমিকা

সংক্ষিপ্ত বিবরণ

তাদের পরিষেবা এবং অ্যাপ্লিকেশনগুলির জন্য নেটওয়ার্ক ট্র্যাফিক সুরক্ষিত করতে, অনেক সংস্থা ডেটা পাচার রোধ করার জন্য পেরিমিটার কন্ট্রোল সহ গুগল ক্লাউডে একটি ভার্চুয়াল প্রাইভেট ক্লাউড (VPC) নেটওয়ার্ক ব্যবহার করে। একটি VPC নেটওয়ার্ক হলো একটি ফিজিক্যাল নেটওয়ার্কের ভার্চুয়াল সংস্করণ যা গুগলের প্রোডাকশন নেটওয়ার্কের ভিতরে বাস্তবায়িত হয়। একটি VPC নেটওয়ার্ক আপনার Compute Engine ভার্চুয়াল মেশিন (VM) ইনস্ট্যান্সগুলির জন্য কানেক্টিভিটি প্রদান করে, অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালেন্সারগুলির জন্য নেটিভ ইন্টারনাল পাসথ্রু নেটওয়ার্ক লোড ব্যালেন্সার এবং প্রক্সি সিস্টেম সরবরাহ করে, ক্লাউড ইন্টারকানেক্টের জন্য ক্লাউড ভিপিএন টানেল এবং ভিএলএএন অ্যাটাচমেন্ট ব্যবহার করে অন-প্রিমিসেস নেটওয়ার্কগুলির সাথে সংযোগ স্থাপন করে, এবং গুগল ক্লাউড এক্সটার্নাল লোড ব্যালেন্সার থেকে ব্যাকএন্ডগুলিতে ট্র্যাফিক বিতরণ করে।

ভিএম-এর মতো নয়, ক্লাউড রান সার্ভিসগুলো ডিফল্টভাবে কোনো নির্দিষ্ট ভিপিসি নেটওয়ার্কের সাথে যুক্ত থাকে না। এই কোডল্যাবটি দেখায় কীভাবে ইনগ্রেস (ইনবাউন্ড কানেকশন) সেটিংস পরিবর্তন করতে হয়, যাতে শুধুমাত্র একটি ভিপিসি থেকে আসা ট্র্যাফিকই ক্লাউড রান সার্ভিস (যেমন একটি ব্যাকএন্ড সার্ভিস) অ্যাক্সেস করতে পারে। এছাড়াও, এই কোডল্যাবটি দেখায় কীভাবে একটি দ্বিতীয় সার্ভিসকে (যেমন একটি ফ্রন্টএন্ড সার্ভিস) একটি ভিপিসির মাধ্যমে ব্যাকএন্ড ক্লাউড রান সার্ভিসটি অ্যাক্সেস করানো যায়।

এই উদাহরণে, ব্যাকএন্ড ক্লাউড রান সার্ভিসটি 'হ্যালো ওয়ার্ল্ড' রিটার্ন করে। ফ্রন্টএন্ড ক্লাউড রান সার্ভিসটি একটি ইউআরএল সংগ্রহ করার জন্য ইউআই-তে একটি ইনপুট ফিল্ড প্রদান করে। এরপর ফ্রন্টএন্ড সার্ভিসটি সেই ইউআরএল-এ (যেমন ব্যাকএন্ড সার্ভিসে) একটি GET রিকোয়েস্ট পাঠায়, ফলে এটি একটি সার্ভিস-টু-সার্ভিস রিকোয়েস্ট হয়ে দাঁড়ায় (ব্রাউজার-টু-সার্ভিস রিকোয়েস্টের পরিবর্তে)। যখন ফ্রন্টএন্ড সার্ভিসটি সফলভাবে ব্যাকএন্ডে পৌঁছাতে পারে, তখন ব্রাউজারে 'হ্যালো ওয়ার্ল্ড' বার্তাটি প্রদর্শিত হয়।

আপনি যা শিখবেন

  • আপনার ক্লাউড রান পরিষেবাতে শুধুমাত্র ভিপিসি থেকে আসা ট্র্যাফিককে কীভাবে অনুমতি দেবেন
  • শুধুমাত্র অভ্যন্তরীণ-প্রবেশযোগ্য একটি ক্লাউড রান সার্ভিসের সাথে যোগাযোগের জন্য কীভাবে একটি ক্লাউড রান সার্ভিসে বহির্গমন কনফিগার করবেন

২. সেটআপ এবং প্রয়োজনীয়তা

পূর্বশর্ত

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, অ্যাক্টিভেট ক্লাউড শেল-এ ক্লিক করুন। d1264ca30785e435.png .

cb81e7c8e34bc8d.png

আপনি যদি প্রথমবারের মতো ক্লাউড শেল চালু করেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন আপনার সামনে আসবে। যদি একটি মধ্যবর্তী স্ক্রিন আসে, তাহলে 'চালিয়ে যান' (Continue) এ ক্লিক করুন।

d95252b003979716.png

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

7833d5e1c5d18f54.png

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই একটি ব্রাউজার দিয়ে করা সম্ভব।

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
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 কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. ক্লাউড রান পরিষেবাগুলি তৈরি করুন

পরিবেশ ভেরিয়েবল সেটআপ করুন

আপনি এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন, যা এই কোডল্যাব জুড়ে ব্যবহৃত হবে।

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

ব্যাকএন্ড ক্লাউড রান পরিষেবা তৈরি করুন

প্রথমে, সোর্স কোডের জন্য একটি ডিরেক্টরি তৈরি করুন এবং সেই ডিরেক্টরিতে প্রবেশ করুন।

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}`);
});

সবশেষে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান সার্ভিসটি ডিপ্লয় করুন।

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

ফ্রন্টএন্ড ক্লাউড রান পরিষেবা তৈরি করুন

ফ্রন্টএন্ড ডিরেক্টরিতে যান।

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>

সবশেষে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান সার্ভিসটি ডিপ্লয় করুন।

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

ব্যাকএন্ড পরিষেবাতে কল করুন

যাচাই করুন যে আপনি দুটি ক্লাউড রান পরিষেবা সফলভাবে স্থাপন করেছেন।

আপনার ওয়েব ব্রাউজারে ফ্রন্টএন্ড সার্ভিসটির ইউআরএলটি খুলুন।

টেক্সটবক্সে ব্যাকএন্ড সার্ভিসের জন্য URL-টি লিখুন। মনে রাখবেন, এই অনুরোধটি আপনার ব্রাউজার থেকে রাউট না হয়ে, ফ্রন্টএন্ড ক্লাউড রান ইনস্ট্যান্স থেকে ব্যাকএন্ড ক্লাউড রান সার্ভিসে রাউট করা হয়।

আপনি "হ্যালো ওয়ার্ল্ড" দেখতে পাবেন।

৪. ব্যাকএন্ড সার্ভিসটি শুধুমাত্র অভ্যন্তরীণ প্রবেশের জন্য সেট করুন।

শুধুমাত্র আপনার VPC নেটওয়ার্কের ভেতর থেকে আপনার ব্যাকএন্ড পরিষেবা অ্যাক্সেস করার অনুমতি দিতে নিম্নলিখিত gcloud কমান্ডটি চালান।

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

আপনার ব্যাকএন্ড সার্ভিসটি যে শুধুমাত্র আপনার VPC থেকেই ট্র্যাফিক গ্রহণ করতে পারে, তা নিশ্চিত করতে আপনার ফ্রন্টএন্ড সার্ভিস থেকে ব্যাকএন্ড সার্ভিসটিকে আবার কল করার চেষ্টা করুন।

এবার আপনি "Request failed with status code 404" দেখতে পাবেন।

আপনি এই ত্রুটিটি পেয়েছেন কারণ ফ্রন্টএন্ড ক্লাউড রান পরিষেবার বহির্গামী অনুরোধ (অর্থাৎ ইগ্রেস) প্রথমে ইন্টারনেটে চলে যায়, ফলে গুগল ক্লাউড অনুরোধটির উৎস সম্পর্কে জানতে পারে না।

পরবর্তী অংশে, আপনি ফ্রন্টএন্ড সার্ভিসটিকে ভিপিসি (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/ অ্যাক্সেস করার চেষ্টা করলে টাইমআউট হয়ে যাবে।

৬. অভিনন্দন!

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা ক্লাউড রান ডকুমেন্টেশন এবং ক্লাউড রান পরিষেবাগুলির জন্য কীভাবে প্রাইভেট নেটওয়ার্কিং কনফিগার করতে হয়, তা পর্যালোচনা করার পরামর্শ দিই।

আমরা যা আলোচনা করেছি

  • আপনার ক্লাউড রান পরিষেবাতে শুধুমাত্র ভিপিসি থেকে আসা ট্র্যাফিককে কীভাবে অনুমতি দেবেন
  • শুধুমাত্র অভ্যন্তরীণ-প্রবেশযোগ্য একটি ক্লাউড রান সার্ভিসের সাথে যোগাযোগের জন্য কীভাবে একটি ক্লাউড রান সার্ভিসে বহির্গমন কনফিগার করবেন

৭. পরিষ্কার করুন

অনিচ্ছাকৃত চার্জ এড়াতে (উদাহরণস্বরূপ, যদি ফ্রি টিয়ারে আপনার মাসিক ক্লাউড রান ব্যবহারের বরাদ্দের চেয়ে ক্লাউড রান পরিষেবাগুলো অনিচ্ছাকৃতভাবে বেশিবার চালু করা হয়), আপনি হয় ক্লাউড রানটি অথবা ধাপ ২-এ তৈরি করা প্রজেক্টটি ডিলিট করে দিতে পারেন।

Cloud Run সার্ভিসটি ডিলিট করতে, https://console.cloud.google.com/run-এ অবস্থিত Cloud Run ক্লাউড কনসোলে যান এবং $FRONTEND ও $BACKEND সার্ভিসগুলো ডিলিট করে দিন।

আপনি যদি পুরো প্রজেক্টটি মুছে ফেলতে চান, তাহলে আপনি https://console.cloud.google.com/cloud-resource-manager -এ গিয়ে, ধাপ ২-এ তৈরি করা প্রজেক্টটি নির্বাচন করে 'ডিলিট' (Delete) বিকল্পটি বেছে নিতে পারেন। প্রজেক্টটি মুছে ফেললে, আপনাকে আপনার ক্লাউড এসডিকে (Cloud SDK)-তে প্রজেক্ট পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।