১. ভূমিকা
সংক্ষিপ্ত বিবরণ
তাদের পরিষেবা এবং অ্যাপ্লিকেশনগুলির নেটওয়ার্ক ট্র্যাফিক সুরক্ষিত করার জন্য, অনেক সংস্থা ডেটা পাচার রোধ করতে পেরিমিটার কন্ট্রোল সহ গুগল ক্লাউডে একটি ভার্চুয়াল প্রাইভেট ক্লাউড (ভিপিসি) নেটওয়ার্ক ব্যবহার করে। একটি ভিপিসি নেটওয়ার্ক হলো একটি ফিজিক্যাল নেটওয়ার্কের ভার্চুয়াল সংস্করণ যা গুগলের প্রোডাকশন নেটওয়ার্কের ভিতরে বাস্তবায়িত হয়। একটি ভিপিসি নেটওয়ার্ক আপনার কম্পিউট ইঞ্জিন ভার্চুয়াল মেশিন (ভিএম) ইনস্ট্যান্সগুলির জন্য কানেক্টিভিটি প্রদান করে, অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালেন্সারগুলির জন্য নেটিভ ইন্টারনাল পাসথ্রু নেটওয়ার্ক লোড ব্যালেন্সার এবং প্রক্সি সিস্টেম সরবরাহ করে, ক্লাউড ইন্টারকানেক্টের জন্য ক্লাউড ভিপিএন টানেল এবং ভিএলএএন অ্যাটাচমেন্ট ব্যবহার করে অন-প্রিমিসেস নেটওয়ার্কগুলির সাথে সংযোগ স্থাপন করে, এবং গুগল ক্লাউড এক্সটার্নাল লোড ব্যালেন্সার থেকে ব্যাকএন্ডগুলিতে ট্র্যাফিক বিতরণ করে।
ভিএম-এর মতো নয়, ক্লাউড রান সার্ভিসগুলো ডিফল্টভাবে কোনো নির্দিষ্ট ভিপিসি নেটওয়ার্কের সাথে যুক্ত থাকে না। এই কোডল্যাবটি দেখায় কীভাবে ইনগ্রেস (ইনবাউন্ড কানেকশন) সেটিংস পরিবর্তন করতে হয়, যাতে শুধুমাত্র একটি ভিপিসি থেকে আসা ট্র্যাফিকই ক্লাউড রান সার্ভিস (যেমন একটি ব্যাকএন্ড সার্ভিস) অ্যাক্সেস করতে পারে। এছাড়াও, এই কোডল্যাবটি দেখায় কীভাবে একটি দ্বিতীয় সার্ভিসকে (যেমন একটি ফ্রন্টএন্ড সার্ভিস) ভিপিসির মাধ্যমে ব্যাকএন্ড ক্লাউড রান সার্ভিস অ্যাক্সেস করানোর পাশাপাশি পাবলিক ইন্টারনেট অ্যাক্সেসও চালু রাখা যায়।
এই উদাহরণে, ব্যাকএন্ড ক্লাউড রান সার্ভিসটি 'হ্যালো ওয়ার্ল্ড' রিটার্ন করে। ফ্রন্টএন্ড ক্লাউড রান সার্ভিসটি একটি ইউআরএল সংগ্রহ করার জন্য ইউআই-তে একটি ইনপুট ফিল্ড প্রদান করে। এরপর ফ্রন্টএন্ড সার্ভিসটি সেই ইউআরএল-এ (যেমন ব্যাকএন্ড সার্ভিসে) একটি GET রিকোয়েস্ট পাঠায়, যার ফলে এটি একটি সার্ভিস-টু-সার্ভিস রিকোয়েস্ট হয়ে দাঁড়ায় (ব্রাউজার-টু-সার্ভিস রিকোয়েস্টের পরিবর্তে)। যখন ফ্রন্টএন্ড সার্ভিসটি সফলভাবে ব্যাকএন্ডে পৌঁছাতে পারে, তখন ব্রাউজারে 'হ্যালো ওয়ার্ল্ড' বার্তাটি প্রদর্শিত হয়। এরপর, আপনি দেখতে পাবেন কীভাবে আপনার ফ্রন্টএন্ড সার্ভিসের আইপি অ্যাড্রেস পুনরুদ্ধার করার জন্য https://curlmyip.org-এ একটি কল করতে পারেন।
আপনি যা শিখবেন
- আপনার ক্লাউড রান পরিষেবাতে শুধুমাত্র ভিপিসি থেকে আসা ট্র্যাফিককে কীভাবে অনুমতি দেবেন
- একটি ক্লাউড রান সার্ভিসে (যেমন ফ্রন্টএন্ড) কীভাবে ইগ্রেস কনফিগার করবেন, যাতে এটি শুধুমাত্র ইন্টারনাল-ইনগ্রেস অ্যাক্সেসযুক্ত একটি ক্লাউড রান সার্ভিসের (যেমন ব্যাকএন্ড) সাথে যোগাযোগ করতে পারে এবং একই সাথে ফ্রন্টএন্ড সার্ভিসের জন্য পাবলিক ইন্টারনেট অ্যাক্সেসও বজায় থাকে।
২. সেটআপ এবং প্রয়োজনীয়তা
পূর্বশর্ত
- আপনি ক্লাউড কনসোলে লগ ইন করেছেন।
- আপনি পূর্বে একটি দ্বিতীয় প্রজন্মের ফাংশন স্থাপন করেছেন। উদাহরণস্বরূপ, শুরু করার জন্য আপনি 'একটি ক্লাউড ফাংশন দ্বিতীয় প্রজন্ম স্থাপন' কুইকস্টার্টটি অনুসরণ করতে পারেন।
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, অ্যাক্টিভেট ক্লাউড শেল-এ ক্লিক করুন।
.

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

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

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই একটি ব্রাউজার দিয়ে করা সম্ভব।
ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।
- আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
৩. ক্লাউড রান পরিষেবাগুলি তৈরি করুন
পরিবেশ ভেরিয়েবল সেটআপ করুন
আপনি এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন, যা এই কোডল্যাব জুড়ে ব্যবহৃত হবে।
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend-with-internet BACKEND=backend SUBNET_NAME=default
ব্যাকএন্ড ক্লাউড রান পরিষেবা তৈরি করুন
প্রথমে, সোর্স কোডের জন্য একটি ডিরেক্টরি তৈরি করুন এবং সেই ডিরেক্টরিতে প্রবেশ করুন।
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}`);
});
সবশেষে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান সার্ভিসটি ডিপ্লয় করুন।
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
ফ্রন্টএন্ড ক্লাউড রান পরিষেবা তৈরি করুন
ফ্রন্টএন্ড ডিরেক্টরিতে যান
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>
সবশেষে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান সার্ভিসটি ডিপ্লয় করুন।
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
ব্যাকএন্ড পরিষেবাতে কল করুন
এই অংশে, আপনি যাচাই করবেন যে আপনি দুটি ক্লাউড রান পরিষেবা সফলভাবে স্থাপন করেছেন।
আপনার ওয়েব ব্রাউজারে ফ্রন্টএন্ড সার্ভিসের ইউআরএলটি খুলুন, যেমন https://frontend-your-hash-uc.a.run.app/
টেক্সটবক্সে ব্যাকএন্ড সার্ভিসের জন্য URL লিখুন। মনে রাখবেন, এই অনুরোধটি আপনার ব্রাউজার থেকে নয়, বরং ফ্রন্টএন্ড ক্লাউড রান ইনস্ট্যান্স থেকে ব্যাকএন্ড ক্লাউড রান সার্ভিসে পাঠানো হয়।
আপনি "হ্যালো ওয়ার্ল্ড" দেখতে পাবেন।
৪. ব্যাকএন্ড সার্ভিসটি শুধুমাত্র অভ্যন্তরীণ প্রবেশের জন্য সেট করুন।
আপনার ব্যক্তিগত নেটওয়ার্কে একটি ক্লাউড রান পরিষেবা অন্তর্ভুক্ত করতে আপনি নিম্নলিখিত gcloud কমান্ডটি চালাতে পারেন।
gcloud run services update $BACKEND --ingress internal --region $REGION
আপনি যদি ফ্রন্টএন্ড সার্ভিস থেকে ব্যাকএন্ড সার্ভিসকে কল করার চেষ্টা করেন, তাহলে আপনি একটি 404 এরর পাবেন। ফ্রন্টএন্ড ক্লাউড রান সার্ভিসের বহির্গামী সংযোগ (বা ইগ্রেস) প্রথমে ইন্টারনেটে যায়, তাই গুগল ক্লাউড অনুরোধটির উৎস সম্পর্কে জানে না।
৫. VPC অ্যাক্সেস করার জন্য ফ্রন্টএন্ড সার্ভিসটি কনফিগার করুন।
এই অংশে, আপনি আপনার ফ্রন্টএন্ড ক্লাউড রান সার্ভিসকে একটি VPC-এর মাধ্যমে ব্যাকএন্ড সার্ভিসের সাথে যোগাযোগ করার জন্য কনফিগার করবেন।
এটি করার জন্য, আপনার ফ্রন্টএন্ড ক্লাউড রান সার্ভিসে সরাসরি ভিপিসি ইগ্রেস যোগ করতে হবে, যাতে এটি ভিপিসি নেটওয়ার্কের অভ্যন্তরীণ আইপি অ্যাড্রেসগুলোতে পৌঁছাতে পারে। এরপর, ইগ্রেস এমনভাবে কনফিগার করতে হবে যাতে শুধুমাত্র প্রাইভেট আইপি-তে পাঠানো রিকোয়েস্টগুলোই ভিপিসি-তে রাউট করা হয়। এই কনফিগারেশনটি আপনার ফ্রন্টএন্ডকে পাবলিক ইন্টারনেট অ্যাক্সেস করার সুযোগ দেবে। অন্যান্য ক্লাউড রান সার্ভিস থেকে রিকোয়েস্ট গ্রহণ করার বিষয়ে আপনি ডকুমেন্টেশনে আরও জানতে পারবেন।
সরাসরি 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
ব্যক্তিগত গুগল অ্যাক্সেস সক্ষম করুন
এরপরে, নিম্নলিখিত কমান্ডটি চালিয়ে সাবনেটে প্রাইভেট গুগল অ্যাক্সেস সক্রিয় করবেন:
gcloud compute networks subnets update $SUBNET_NAME \ --region=$REGION \ --enable-private-ip-google-access
এই কমান্ডটি চালিয়ে আপনি প্রাইভেট গুগল অ্যাক্সেস চালু হয়েছে কিনা তা যাচাই করতে পারেন:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
run.app URL-গুলির জন্য ক্লাউড ডিএনএস জোন তৈরি করুন
সবশেষে, run.app URL-গুলোর জন্য একটি ক্লাউড ডিএনএস জোন তৈরি করুন, যাতে গুগল ক্লাউড সেগুলোকে অভ্যন্তরীণ আইপি অ্যাড্রেস হিসেবে গণ্য করতে পারে।
পূর্ববর্তী ধাপে আপনি সরাসরি ভিপিসি ইগ্রেসকে শুধুমাত্র প্রাইভেট-রেঞ্জের জন্য কনফিগার করেছিলেন। এর মানে হলো, আপনার ফ্রন্টএন্ড সার্ভিস থেকে আউটবাউন্ড কানেকশনগুলো শুধুমাত্র তখনই ভিপিসি নেটওয়ার্কে যাবে, যদি গন্তব্য একটি ইন্টারনাল আইপি হয়। কিন্তু, আপনার ব্যাকএন্ড সার্ভিস একটি run.app ইউআরএল ব্যবহার করে যা একটি পাবলিক আইপিতে রিজলভ হয়।
এই ধাপে, আপনি run.app ইউআরএলগুলোর জন্য একটি ক্লাউড ডিএনএস জোন তৈরি করবেন, যাতে সেগুলো 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/ ব্যবহার করে ইন্টারনেটে প্রবেশ করার চেষ্টা করবেন, তখন আপনি আপনার আইপি অ্যাড্রেস দেখতে পাবেন।
৬. সমস্যা সমাধান
সেটিংস সঠিকভাবে কনফিগার করা না থাকলে আপনি এই সম্ভাব্য ত্রুটি বার্তাগুলো দেখতে পারেন।
- যদি আপনি
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.appএই ত্রুটিটি পান, তাহলে নিশ্চিত করুন যে আপনি DNS A রেকর্ডে "https://" যোগ করেননি। - জোন কনফিগার করার পর ব্যাকএন্ড অ্যাক্সেস করার চেষ্টা করার সময় যদি আপনি একটি 404 এরর পান, তাহলে আপনি হয় গ্লোবাল run.app রেকর্ডের ক্যাশে এক্সপায়ার হওয়া পর্যন্ত (যেমন ৬ ঘন্টা) অপেক্ষা করতে পারেন অথবা নিম্নলিখিত কমান্ডটি চালিয়ে একটি নতুন রিভিশন তৈরি করতে পারেন (যার ফলে ক্যাশে ক্লিয়ার হয়ে যাবে):
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
৭. অভিনন্দন!
কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!
আমরা ক্লাউড রান-এর প্রাইভেট নেটওয়ার্কিং সংক্রান্ত ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিই।
আমরা যা আলোচনা করেছি
- আপনার ক্লাউড রান পরিষেবাতে শুধুমাত্র ভিপিসি থেকে আসা ট্র্যাফিককে কীভাবে অনুমতি দেবেন
- একটি ক্লাউড রান সার্ভিসে (যেমন ফ্রন্টএন্ড) কীভাবে ইগ্রেস কনফিগার করবেন, যাতে এটি শুধুমাত্র ইন্টারনাল-ইনগ্রেস অ্যাক্সেসযুক্ত একটি ক্লাউড রান সার্ভিসের (যেমন ব্যাকএন্ড) সাথে যোগাযোগ করতে পারে এবং একই সাথে ফ্রন্টএন্ড সার্ভিসের জন্য পাবলিক ইন্টারনেট অ্যাক্সেসও বজায় থাকে।
৮. পরিষ্কার করুন
অনিচ্ছাকৃত চার্জ এড়াতে, (উদাহরণস্বরূপ, যদি এই ক্লাউড রান পরিষেবাটি ফ্রি টিয়ারে আপনার মাসিক ক্লাউড রান ব্যবহারের বরাদ্দের চেয়ে বেশিবার অনিচ্ছাকৃতভাবে চালু হয়ে যায়), আপনি হয় ক্লাউড রান পরিষেবাটি অথবা ধাপ ২-এ তৈরি করা প্রজেক্টটি ডিলিট করে দিতে পারেন।
Cloud Run সার্ভিসগুলো ডিলিট করতে, https://console.cloud.google.com/functions/ ঠিকানায় Cloud Run ক্লাউড কনসোলে যান এবং এই কোডল্যাবে আপনার তৈরি করা $FRONTEND ও $BACKEND সার্ভিসগুলো ডিলিট করে দিন।
আপনি যদি পুরো প্রজেক্টটি মুছে ফেলতে চান, তাহলে আপনি https://console.cloud.google.com/cloud-resource-manager -এ গিয়ে, ধাপ ২-এ তৈরি করা প্রজেক্টটি নির্বাচন করে 'ডিলিট' (Delete) বিকল্পটি বেছে নিতে পারেন। প্রজেক্টটি মুছে ফেললে, আপনাকে আপনার ক্লাউড এসডিকে (Cloud SDK)-তে প্রজেক্ট পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।