১. ভূমিকা
এই কোডল্যাব এজেন্ট-টু-এনিওয়্যার (এগ্রেস) মোডে এজেন্ট গেটওয়ে ব্যবহার করে Gemini Enterprise-এর জন্য স্ট্যাটিক IP এগ্রেস কানেক্টিভিটি এক্সপ্লোর করে। আপনি কানেক্টিভিটি টেমপ্লেট কনফিগারেশন ব্যবহার করে Agent Gateway-এর মাধ্যমে সমস্ত আউটবাউন্ড ট্রাফিক রাউটিং করে, কঠোর সোর্স IP হোয়াইটলিস্ট ও OAuth 2.0 অথেন্টিকেশন দ্বারা সুরক্ষিত কাস্টম মডেল কন্টেক্সট প্রোটোকল (MCP) সার্ভার ইনভোক করার জন্য Gemini Enterprise অ্যাপ কনফিগার করবেন। Private Service Connect (PSC) নেটওয়ার্ক অ্যাটাচমেন্ট Agent Gateway-কে VPC নেটওয়ার্কের সাথে কানেক্ট করে এবং Cloud NAT ইন্টারনেট ইগ্রেস ট্রাফিকের জন্য একটি স্থিতিশীল এক্সটার্নাল IP অ্যাড্রেস প্রদান করে।
ডিফল্ট হিসেবে, Gemini Enterprise থেকে পাবলিক ইন্টারনেট এন্ডপয়েন্টে আউটবাউন্ড কানেকশন, ডায়নামিক, শেয়ার করা Google IP অ্যাড্রেস পুল থেকে তৈরি হয় যা কোনও গ্রাহকের মালিকানাধীন IP হোয়াইটলিস্ট নিয়মের সাথে পিন করা যায় না। ALL_TRAFFIC মোডে AgentConnectivityTemplate-এর সাথে এজেন্ট গেটওয়ে পেয়ার করলে, সমস্ত আউটবাউন্ড এজেন্ট ট্রাফিক VPC নেটওয়ার্কে রুট করা হয়, যেখানে Cloud NAT ইন্টারনেট-বাউন্ড কানেকশনকে আপনার নিয়ন্ত্রণে থাকা রিজার্ভ করা স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেসে ট্রান্সলেট করে, একই সাথে এজেন্ট রেজিস্ট্রি ও পরিচয়-সচেতন প্রক্সি (IAP)-এর মাধ্যমে সেন্ট্রালাইজড MCP টুল গভর্নেন্স বজায় রাখে।
আপনি কী তৈরি করেন
- এজেন্ট কানেক্টিভিটি টেমপ্লেট (
vpcEgress: ALL_TRAFFIC) এবং এজেন্ট রেজিস্ট্রি এন্ডপয়েন্ট যাচাইকরণের সাথে ইগ্রেস (এজেন্ট-টু-এনিহয়্যার) মোডে অপারেটিং এজেন্ট গেটওয়ে - VPC নেটওয়ার্ক, PSC নেটওয়ার্ক অ্যাটাচমেন্ট, ক্লাউড রাউটার এবং রিজার্ভ করা স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেসের সাথে যুক্ত Cloud NAT গেটওয়ে
- Caddy TLS দ্বারা ফ্রন্ট-এন্ডেড এক্সটার্নাল স্ট্রিম করার উপযুক্ত HTTP MCP রিসোর্স সার্ভার (
mcp-sprockets), Cloud NAT স্ট্যাটিক IP-তে কঠোরভাবে ফায়ারওয়াল নিয়মের মাধ্যমে সীমাবদ্ধ এবংhttps://oauth2.googleapis.com/tokeninfo-এর বিরুদ্ধে ব্যবহারকারীর দ্বারা ডেলিগেট করা Google OAuth 2.0 বিয়ারার টোকেন যাচাই করা - Google Auth Platform OAuth 2.0 সম্মতি স্ক্রিন এবং ওয়েব অ্যাপ্লিকেশন OAuth 2.0 ক্লায়েন্ট ক্রেডেনশিয়াল (
accounts.google.comএবংoauth2.googleapis.com/token) - এজেন্ট রেজিস্ট্রি MCP সার্ভার ক্যাটালগ এন্ট্রি ও টুলের স্পেসিফিকেশন (
toolspec.json) - Identity-Aware Proxy (IAP) অনুমোদন এক্সটেনশন এবং এজেন্ট গেটওয়ের জন্য গেটওয়ে অনুমোদন নীতি
- এজেন্ট গেটওয়ের সাথে যুক্ত এবং এজেন্ট রেজিস্ট্রি থেকে ইমপোর্ট করা OAuth 2.0 কাস্টম MCP সার্ভার ডেটা স্টোরের সাথে কানেক্ট করা Gemini Enterprise অ্যাপ
ছবি ১. কোডল্যাবের আর্কিটেকচার
আপনি কী শিখবেন
- VPC নেটওয়ার্কে সমস্ত আউটবাউন্ড এজেন্ট গেটওয়ে ট্রাফিক রাউট করার জন্য
vpcEgress: ALL_TRAFFIC-এর সাথেAgentConnectivityTemplateকীভাবে কনফিগার করতে হয় - কীভাবে একটি স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেস রিজার্ভ করতে হয় এবং PSC নেটওয়ার্ক অ্যাটাচমেন্ট সাবনেটে Cloud NAT-এর সাথে তা বাইন্ড করতে হয়
- Google OAuth 2.0 বিয়ারার টোকেন (
oauth2.googleapis.com/tokeninfo) যাচাই করে এবং Cloud NAT স্ট্যাটিক IP (${NAT_EXT_IP}/32)-তে ইনগ্রেস ফায়ারওয়াল কঠোরভাবে সীমাবদ্ধ করে এমন এক্সটার্নাল স্ট্রিম করার উপযুক্ত HTTP MCP রিসোর্স সার্ভার কীভাবে ডেপ্লয় করতে হয় - Google Identity OAuth 2.0 ক্লায়েন্ট ক্রেডেনশিয়াল কীভাবে কনফিগার করতে হয় এবং এজেন্ট রেজিস্ট্রিতে MCP সার্ভার ও এর টুল স্কিমা কীভাবে রেজিস্টার করতে হয়
- কীভাবে Gemini Enterprise-এর সাথে রেজিস্টার করা OAuth 2.0 MCP সার্ভার কানেক্ট করতে হয় এবং এজেন্ট গেটওয়ের মাধ্যমে ব্যবহারকারীর দ্বারা ডেলিগেট করা টুল কল রাউট করতে হয়
- CLI কমান্ড ও Cloud Logging ব্যবহার করে কীভাবে স্ট্যাটিক IP ট্রান্সলেশন, গ্রাহক-প্রান্তিক OAuth 2.0 পরিচয় যাচাইকরণ (
authenticated_user) এবং গেটওয়ে নীতি প্রয়োগ করা যায়
আপনার যা প্রয়োজন
- বিলিং চালু করা আছে এমন Google Cloud প্রোজেক্ট
- অ্যাক্টিভ Gemini Enterprise লাইসেন্স বা ৩০-দিনের ট্রায়াল
- নেটওয়ার্কিং পরিষেবা, সংস্থা সংক্রান্ত নীতি, Gemini Enterprise ও এজেন্ট প্ল্যাটফর্ম রিসোর্স প্রোভিশন করার জন্য IAM অনুমতি
- Google Cloud CLI (
gcloud),curlওjqইনস্টল করা আছে এমন POSIX-এর সাথে মানানসই শেল (bashবাzsh)
ভূমিকা অংশটি এখানেই শেষ হল... এর পরে ধারণা বিভাগে যাওয়া যাক।
২. ধারণা
ডিপ্লয়মেন্ট সিকোয়েন্স
এই কোডল্যাব প্রথমে নেটওয়ার্কিং ও গভর্নেন্স ইনফ্রাস্ট্রাকচার ডেপ্লয় করে, যাতে Gemini Enterprise-এর সাথে MCP টুল রেজিস্টার ও কানেক্ট করার আগে স্ট্যাটিক IP ইগ্রেস পাথ ও গেটওয়ে কন্ট্রোল অপারেশনাল হয়:
- নেটওয়ার্ক ইনফ্রাস্ট্রাকচার: রিজার্ভ স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেস এবং ইগ্রেস VPC, PSC অ্যাটাচমেন্ট সাবনেট, PSC নেটওয়ার্ক অ্যাটাচমেন্ট, ক্লাউড রাউটার, ক্লাউড NAT গেটওয়ে ও এক্সটার্নাল MCP নেটওয়ার্ক ফায়ারওয়াল নিয়ম প্রোভিশন করুন।
- এজেন্ট কানেক্টিভিটি টেমপ্লেট ও এজেন্ট গেটওয়ে: এজেন্ট রেজিস্ট্রি ইন্টিগ্রেশন (
registries) সহ এগ্রেস মোডে (AGENT_TO_ANYWHERE)AgentConnectivityTemplate(vpcEgress: ALL_TRAFFIC) ও আঞ্চলিকAgentGatewayডেপ্লয় করুন। - অনুমোদন সংক্রান্ত নীতি: IAP অনুমোদন এক্সটেনশন (
AuthzExtension), গেটওয়ে অনুমোদন নীতি (AuthzPolicy) এবং IAM v3 ইউনিফায়েড অ্যাক্সেস নীতি (AccessPolicyওPolicyBinding) কনফিগার করুন। - MCP সার্ভার ডেপ্লয় ও রেজিস্টার করা: Caddy TLS-এর পিছনে এক্সটার্নাল
mcp-sprocketsOAuth 2.0 রিসোর্স সার্ভার ডেপ্লয় করুন, এর Google OAuth 2.0tokeninfoএনফোর্সমেন্ট যাচাই করুন, Cloud NAT স্ট্যাটিক IP (${NAT_EXT_IP}/32)-তে এর ইনগ্রেস ফায়ারওয়াল কঠোরভাবে লক করুন এবং এজেন্ট রেজিস্ট্রি থেকে পরিষেবা ও টুল স্পেসিফিকেশন (get_sprocketsওget_sprocket_by_id) রেজিস্টার করুন। - Gemini Enterprise অ্যাপ ও OAuth 2.0 ক্লায়েন্ট: Google Identity প্রদানকারী, ট্রায়াল লাইসেন্স, OAuth 2.0 সম্মতি স্ক্রিন ও ওয়েব অ্যাপ্লিকেশন ক্লায়েন্ট ক্রেডেনশিয়াল (
OAUTH_CLIENT_IDওOAUTH_CLIENT_SECRET) কনফিগার করুন, Gemini Enterprise অ্যাপ (Engine) তৈরি করুন এবং Agent Gateway-তে (agentGatewaySetting) আউটবাউন্ড ইগ্রেস বাইন্ড করুন। - কাস্টম MCP ডেটা কানেক্টর ইমপোর্ট করা: Gemini Enterprise অ্যাপের সাথে রেজিস্টার করা MCP সার্ভার ব্যাক-এন্ড ডেটা স্টোর লিঙ্ক করতে
auth_type: "OAUTH"-এর সাথে কনফিগার করাREGISTRY_MCPডেটা কানেক্টর (:setUpDataConnector) তৈরি ও অ্যাক্টিভেট করুন। - যাচাই করুন: এককালীন ব্যবহারকারীর OAuth 2.0 সম্মতি ফ্লো সম্পূর্ণ করুন, Gemini Enterprise অ্যাসিস্ট্যান্টের মাধ্যমে MCP টুল ব্যবহার করুন (
egress_source_ipওauthenticated_userদু'টিই কনফার্ম করে) এবং Cloud Logging-এ নীতি প্রয়োগ ও স্ট্যাটিক IP NAT ট্রান্সলেশন যাচাই করুন।
কেন্দ্রীয় IdP + OAuth-সুরক্ষিত MCP রিসোর্স সার্ভার আর্কিটেকচার
এন্টারপ্রাইজ ডিপ্লয়মেন্টে, পরিচয় ম্যানেজমেন্ট ও টুল এক্সিকিউশন, সেন্ট্রালাইজড আইডেন্টিটি প্রোভাইডার (অনুমোদন সার্ভার) ও সুরক্ষিত MCP রিসোর্স সার্ভারের মধ্যে স্ট্যান্ডার্ড OAuth 2.0 সেপারেশন অফ রোল অনুসরণ করে:
OAuth 2.0 ভূমিকা | এই কোডল্যাবে কম্পোনেন্ট | দায়িত্ব |
রিসোর্সের মালিক | গ্রাহক ( | Gemini Enterprise ওয়েব অ্যাপে সাইন-ইন করে এবং একবারের জন্য ৩-লেগড OAuth 2.0 অনুমোদন ফ্লো চলাকালীন সম্মতি দেয়। |
OAuth 2.0 ক্লায়েন্ট | Gemini Enterprise |
|
অনুমোদন সার্ভার | Google Identity OAuth 2.0 ( | ব্রাউজার সম্মতি রিডাইরেক্ট করার সময় ব্যবহারকারীকে যাচাই করে এবং Gemini Enterprise-কে OAuth 2.0 অ্যাক্সেস ও রিফ্রেশ টোকেন ইস্যু করে। |
রিসোর্স সার্ভার | এক্সটার্নাল | VPC ফায়ারওয়াল ( |
ব্রাউজার সম্মতি রিডাইরেক্ট (accounts.google.com) এবং ব্যাক-চ্যানেল টোকেন এক্সচেঞ্জ (oauth2.googleapis.com/token) Google ম্যানেজ করা OAuth 2.0 এন্ডপয়েন্টের বিরুদ্ধে ঘটে বলে, এক্সটার্নাল MCP সার্ভার ফায়ারওয়াল শুধুমাত্র রানটাইম MCP JSON-RPC অনুরোধ (POST /mcp) Agent Gateway থেকে Cloud NAT-এর মাধ্যমে পায়, যা ${NAT_EXT_IP}/32-এ ইনগ্রেস ফায়ারওয়ালকে কঠোরভাবে লকডাউন করার অনুমতি দেয়।
ডিসকভারি ইঞ্জিন রিসোর্স মডেল
Gemini Enterprise অ্যাপ (Discovery Engine API-তে Engine রিসোর্স হিসেবে দেখানো হয়) হল কেন্দ্রীয় অর্কেস্ট্রেশন লেয়ার এবং গ্রাহকদের সাথে কথোপকথনের ইন্টারফেস। এটি ব্যবহারকারীর চ্যাট সেশন ম্যানেজ করে, এন্টারপ্রাইজ ডেটার উপর ভিত্তি করে জেনারেটিভ মডেল তৈরি করে এবং ডায়নামিক টুল এক্সিকিউশন কোঅর্ডিনেট করে।
Gemini Enterprise অ্যাপ ডেটা স্টোরের মাধ্যমে ডেটা ও সিস্টেমের সাথে ইন্টার্যাক্ট করে:
- নলেজ ডেটা স্টোর: রিট্রিভাল-অগমেন্টেড জেনারেশনের (RAG) জন্য স্ট্যাটিক কন্টেন্ট (যেমন, Cloud Storage, Google Drive, BigQuery) ইনজেস্ট ও ইন্ডেক্স করে।
- ডেটা কানেক্টর (অ্যাকশন প্রদানকারী): ডায়নামিক থার্ড-পার্টি বা কাস্টম API-তে কানেক্ট করুন। কাস্টম MCP সার্ভার ডেটা স্টোর মডেল কন্টেক্সট প্রোটোকল (MCP) দ্বারা সংজ্ঞায়িত টুল প্রকাশ করে, যা কথোপকথনের সময় মডেলকে ডায়নামিক উপায়ে এক্সটার্নাল ফাংশন কল করতে সক্ষম করে।
Gemini Enterprise এগ্রেস
agentGatewaySetting on the Engine এবং use_agent_gateway_egress: true on the DataConnector, দুটিই কনফিগার করা থাকলে, Gemini Enterprise কাস্টম MCP সার্ভার টুল সংক্রান্ত অনুরোধ Agent Gateway-তে রাউট করে।
ছবি ২. Gemini Enterprise ইগ্রেস আর্কিটেকচার
Gemini Enterprise অ্যাপ চারটি মূল ক্ষেত্র জুড়ে টুল রাউটিংকে সংগঠিত করে:
- উইজেট (
default_search_widget_config):- ওয়েব ক্লায়েন্ট ইন্টারফেস পরিবেশন করে। ব্যবহারকারীর থেকে উইজেট প্রম্পট পায়, কোনও টুলের অনুমোদনের প্রয়োজন হলে একবারের জন্য OAuth 2.0 ব্যবহারকারীর সম্মতি সংক্রান্ত রিডাইরেক্ট ট্রিগার করে এবং অন্তর্নিহিত ইঞ্জিনের সাথে চ্যাট সেশন শুরু করে।
- কোর অ্যাসিস্ট্যান্ট (
assistants/default_assistant/agents/default/core_assistant):- ইঞ্জিনের মধ্যে থাকা মূল কনভারসেশনাল রিজনিং এজেন্ট। ব্যবহারকারীর কোয়েরি মূল্যায়ন করার সময়, Core Assistant উপলভ্য টুলগুলি পরীক্ষা করে এবং সিন্থেসাইজ করা Agent Gateway সাব-এজেন্টের কাছে এক্সিকিউশন ডেলিগেট করে।
- ডেটা স্টোর ও ডেটা কানেক্টর:
DataStore::setUpDataConnectorরান করার সময় একটি নির্দিষ্টCollection-এর মধ্যে প্রোভিশন করা হয়, এটি Gemini EnterpriseEngine-এর সাথে ইমপোর্ট করা এজেন্ট রেজিস্ট্রি টুলের স্কিমা (get_sprockets,get_sprocket_by_id), আর্গুমেন্টের ধরন এবং এজেন্ট নির্দেশাবলী লিঙ্ক (dataStoreIds) করে।DataConnector: রিমোট MCP সার্ভারের (instance_uri) সাথেREGISTRY_MCPঅ্যাকশন কানেকশন (createBapConnection: true) ম্যানেজ করে, এজেন্ট রেজিস্ট্রি MCP সার্ভার রিসোর্স (registry_mcp_server_name) সমাধান করে, ব্যবহারকারীর ভল্টেড OAuth 2.0 বিয়ারার টোকেন (Authorization: Bearer [access_token]) অ্যাটাচ করে এবং এজেন্ট গেটওয়ে ইগ্রেস (use_agent_gateway_egress: true) চালু করে।
- এজেন্টের পরিচয়, এজেন্ট রেজিস্ট্রি ও এজেন্ট গেটওয়ে:
- Data Connector আউটবাউন্ড টুল কল ডিসপ্যাচ করলে, এটি
agentGatewaySetting-এ উল্লেখ করা গেটওয়েতে ট্রাফিক রাউট করে। Core Assistant একটি SPIFFE আইডেন্টিটি টোকেন তৈরি করে যা তার ওয়ার্কলোড পরিচয় নিশ্চিত করে:principal://agents.global.org-.../agents/default/core_assistant। - এজেন্ট গেটওয়ে,
registriesফিল্ড ব্যবহার করে এজেন্ট রেজিস্ট্রি সহ ইন্টিগ্রেট করে, যাতে ডেস্টিনেশন এন্ডপয়েন্ট ও রেজিস্টার করা টুল স্কিমা ডায়নামিক পদ্ধতিতে সমাধান করা যায়, IAP ব্যবহার করে অনুমোদন সংক্রান্ত নীতি মূল্যায়ন করে এবংAgentConnectivityTemplateব্যবহার করে VPC নেটওয়ার্কে অনুমোদিত অনুরোধ (ব্যবহারকারীরAuthorization: Bearerহেডার বজায় রেখে) ফরওয়ার্ড করে।
- Data Connector আউটবাউন্ড টুল কল ডিসপ্যাচ করলে, এটি
গেটওয়ে VPC কানেক্টিভিটি ও স্ট্যাটিক IP NAT
গেটওয়েতে agentConnectivityTemplate-এর রেফারেন্স করা AgentConnectivityTemplate রিসোর্স ব্যবহার করে এজেন্ট গেটওয়ে VPC নেটওয়ার্ক কানেক্টিভিটি কাজ করে। PSC নেটওয়ার্ক অ্যাটাচমেন্টের মাধ্যমে আপনার VPC-তে কীভাবে ট্রাফিক প্রবেশ করে তা টেমপ্লেট egressNetworkConfig নির্ধারণ করে:
PRIVATE_RANGES_ONLY(ডিফল্ট): PSC নেটওয়ার্ক অ্যাটাচমেন্টের মাধ্যমে শুধুমাত্র RFC 1918, RFC 6598 এবং Class E প্রাইভেট IP রেঞ্জ রুট করে। ইন্টারনেটের সাথে কানেক্ট করা ট্রাফিক আপনার VPC-কে বাইপাস করে এবং Google-এর ডিফল্ট ইন্টারনেট ইগ্রেসের মাধ্যমে সরাসরি বেরিয়ে যায়।ALL_TRAFFIC(এই কোডল্যাবে ব্যবহৃত): PSC নেটওয়ার্ক অ্যাটাচমেন্টের (10.10.10.2) মাধ্যমে আপনার VPC সাবনেটে এজেন্ট গেটওয়ে থেকে যাওয়া সমস্ত আউটবাউন্ড ট্রাফিক—পাবলিক ইন্টারনেট ও এক্সটার্নাল পার্টনার MCP এন্ডপয়েন্ট সহ—রাউট করে।
ALL_TRAFFIC মোডে কাজ করার সময়, PSC অ্যাটাচমেন্ট সাবনেটের জন্য দুটি কনফিগারেশন প্রয়োজন:
- প্রাইভেট Google অ্যাক্সেস (
--enable-private-ip-google-access): Google Cloud API-তে (*.googleapis.com) ইন্টার্নাল কল যাতে Google নেটওয়ার্কের মধ্যে প্রাইভেটভাবে রাউট করা যায় তা নিশ্চিত করে। - Cloud Router ও Cloud NAT (
MANUAL_ONLY): PSC অ্যাটাচমেন্ট সাবনেটে প্রবেশ করা ইন্টারনেট-বাউন্ড ট্রাফিক Cloud NAT-এর মাধ্যমে ডিফল্ট রুট (0.0.0.0/0) অনুসরণ করে, যা আপনার রিজার্ভ করা স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেসে (${NAT_EXT_IP}) সোর্স নেটওয়ার্ক অ্যাড্রেস ট্রান্সলেশন (SNAT) পারফর্ম করে। তাই, এক্সটার্নাল ফায়ারওয়াল ইনবাউন্ড অ্যাক্সেসকে কঠোরভাবে${NAT_EXT_IP}/32-এর মধ্যে সীমাবদ্ধ করতে পারে।
সীমাবদ্ধতা ও প্রয়োজনীয়তা
- শুধুমাত্র StreamableHTTP: পুরনো Server-Sent Events (SSE) ট্রান্সপোর্ট কাজ করে না। MCP সার্ভারকে অবশ্যই StreamableHTTP ব্যবহার করতে হবে।
- সংস্থা সংক্রান্ত নীতি ওভাররাইড করা: ডেটা কানেক্টর রেজিস্টার করার আগে আপনাকে অবশ্যই কাস্টম MCP ডেটা স্টোরের জন্য সংস্থা সংক্রান্ত নীতি ওভাররাইড করতে হবে।
- আঞ্চলিক অ্যালাইনমেন্ট: Gemini Enterprise অ্যাপ লোকেশন, এজেন্ট গেটওয়ে ও এজেন্ট রেজিস্ট্রির মধ্যে আঞ্চলিক অ্যালাইনমেন্ট প্রয়োগ করে:
Gemini Enterprise অ্যাপের লোকেশন | এজেন্ট গেটওয়ে ও NAT লোকেশন | এজেন্ট রেজিস্ট্রি লোকেশন |
|
|
|
|
|
|
|
|
|
ধারণা সংক্রান্ত অংশটি এখানেই শেষ হল... এর পরে সেট-আপ বিভাগ।
৩. সেট-আপ করুন
প্রয়োজনীয় IAM ভূমিকা
এই কোডল্যাব সম্পূর্ণ করতে নিম্নলিখিত ভূমিকাগুলি প্রয়োজন:
ডোমেন | প্রয়োজনীয় IAM ভূমিকা |
প্রোজেক্ট ও IAM |
|
নেটওয়ার্কিং ও গেটওয়ে |
|
Gemini Enterprise ও Registry |
|
ওয়ার্কলোড |
|
পর্যবেক্ষণযোগ্যতা |
|
অথবা roles/orgpolicy.policyAdmin-এর সাথে roles/owner-এর মতো একটি সাধারণ ভূমিকা ব্যবহার করুন (কারণ roles/owner একা সংস্থার নীতি পরিবর্তন করতে পারে না)।
আপনার প্রোজেক্ট অ্যাক্সেস করা
এই কোডল্যাবে একটি Google Cloud প্রোজেক্ট ব্যবহার করা হয়েছে। কনফিগারেশন ধাপে gcloud CLI ও Linux শেল কমান্ড ব্যবহার করা হয়।
আপনার Google Cloud প্রোজেক্টের কমান্ড লাইন অ্যাক্সেস করার মাধ্যমে শুরু করুন:
shell.cloud.google.com-এ Cloud Shell অথবাgcloudCLI ইনস্টল করা আছে এমন একটি লোকাল টার্মিনাল
আপনার প্রোজেক্ট আইডি সেট করুন
# set target project id
gcloud config set project SET_YOUR_PROJECT_ID_HERE
সেশন যাচাই করা
# login to gcloud cli
gcloud auth login
# login for gcloud api
gcloud auth application-default login
শেল এনভায়রনমেন্ট ভেরিয়েবল সেট করা
# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
export ZONE="us-central1-a"
echo ${SLUG}
echo ${REGION}
echo ${ZONE}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars for agent platform (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export MCP_NAME="mcp-sprockets"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${MCP_NAME}
# create resource vars for gemini enterprise (automatic)
export GE_LOCATION="global"
export GE_APP_ORG_NAME="${SLUG}, Inc."
export GE_APP_DISPLAY_NAME="${SLUG} ${GE_LOCATION} app"
export GE_APP_NAME="app-${SLUG}-${GE_LOCATION}"
export GE_APP_INIT="${GE_APP_NAME}_$(date +%s)"
echo ${GE_LOCATION}
echo ${GE_APP_ORG_NAME}
echo ${GE_APP_DISPLAY_NAME}
echo ${GE_APP_NAME}
echo ${GE_APP_INIT}
এজেন্ট পরিচয় সংক্রান্ত বিশ্বস্ত ডোমেন সেট করা
প্রিন্সিপাল এজেন্ট আইডেন্টিটির জন্য সঠিক ট্রাস্ট ডোমেন সেট করতে, if-then-else স্টেটমেন্ট চেক করে দেখে যে প্রজেক্টটি কোনও সংস্থার কিনা।
# set var for trust domain
if [[ -n "${ORG_ID}" ]]; then
export TRUST_DOMAIN="agents.global.org-${ORG_ID}.system.id.goog"
else
export TRUST_DOMAIN="agents.global.proj-${PROJ_NO}.system.id.goog"
fi
echo "trust domain: ${TRUST_DOMAIN}"
বিলিং ও কোটা প্রোজেক্ট সেট করা
# set cli quota project
gcloud config set billing/quota_project ${PROJ_ID}
# set api quota project
gcloud auth application-default set-quota-project ${PROJ_ID}
কনফিগ ফাইলের জন্য লোকাল ডিরেক্টরি তৈরি করা
# create config folder
mkdir -p cfg
gcloud cli আপডেট করুন (সাজেস্ট করা হয়েছে)
Google Cloud SDK-এর সেল্ফ-ম্যানেজড ইনস্টল (অর্থাৎ, Cloud Shell-এর বাইরে) রান করালে, কম্পোনেন্ট লেটেস্ট ভার্সনে আপডেট করুন।
# update gcloud cli
gcloud components update
API পরিষেবা চালু করুন
# enable google cloud apis
gcloud services enable \
agentregistry.googleapis.com \
aiplatform.googleapis.com \
cloudapiregistry.googleapis.com \
cloudresourcemanager.googleapis.com \
compute.googleapis.com \
discoveryengine.googleapis.com \
dns.googleapis.com \
iam.googleapis.com \
iap.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com \
networkconnectivity.googleapis.com \
networksecurity.googleapis.com \
networkservices.googleapis.com \
orgpolicy.googleapis.com \
serviceextensions.googleapis.com \
serviceusage.googleapis.com
সংস্থা সংক্রান্ত নীতি
ডিফল্ট Google Cloud ম্যানেজ করা সংস্থার নীতি সংক্রান্ত বিধিনিষেধ এবং স্যান্ডবক্স নীতি এই কোডল্যাবে ব্যবহৃত ফিচারকে সীমাবদ্ধ করতে পারে:
compute.vmExternalIpAccess: লকডাউন স্যান্ডবক্স সংস্থার Compute Engine VM-এ এক্সটার্নাল IPv4 অ্যাড্রেস সীমাবদ্ধ করে।discoveryengine.managed.disableCustomMcpServerConnector: ডেটা সোর্স (custom_mcp) হিসেবে কাস্টম MCP সার্ভার ব্যবহার করে এমন ডেটা কানেক্টর তৈরি করা সীমিত করে (ডিফল্ট হিসেবে এনফোর্স করা হয়)।discoveryengine.managed.allowedEgressFqdns: VPC Service Controls (VPC-SC) চালু থাকলে বা প্রোজেক্টenforcedProjects-এ তালিকাভুক্ত থাকলে, ডেটা কানেক্টরের জন্য আউটবাউন্ড ইগ্রেস ডোমেন (instance_uriFQDN) সীমাবদ্ধ করে।discoveryengine.managed.allowedDataSources: VPC-SC চালু থাকলে বা প্রোজেক্টenforcedProjects-এ তালিকাভুক্ত থাকলে, অনুমোদিত ডেটা কানেক্টর (dataSource) সংক্রান্ত ধরন সীমাবদ্ধ করে।
প্রোজেক্ট লেভেলে যেকোনও ইনহেরিট করা সংস্থার নীতি সংক্রান্ত বিধিনিষেধ ওভাররাইড করুন।
কাস্টম MCP কনস্ট্রেন্ট বন্ধ করা
# disable data connector constraint (allow custom mcp servers)
gcloud org-policies set-policy "/dev/stdin" <<EOF
name: projects/${PROJ_ID}/policies/discoveryengine.managed.disableCustomMcpServerConnector
spec:
rules:
- enforce: false
EOF
কন্ডিশনাল ডেটা কানেক্টর সংক্রান্ত বিধিনিষেধ বন্ধ করা
# disable egress fqdn constraint on project
gcloud org-policies set-policy "/dev/stdin" <<EOF
name: projects/${PROJ_ID}/policies/discoveryengine.managed.allowedEgressFqdns
spec:
rules:
- enforce: false
EOF
# disable allowed data sources constraint on project
gcloud org-policies set-policy "/dev/stdin" <<EOF
name: projects/${PROJ_ID}/policies/discoveryengine.managed.allowedDataSources
spec:
rules:
- enforce: false
EOF
অ্যাক্সেস নীতি সংক্রান্ত বিধিনিষেধ বন্ধ করা
# disable iam v3 constraint (allow v3 access policies)
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJ_NO}/policies/iam.managed.disableAccessPolicyBinding
spec:
rules:
- enforce: false
EOF
এক্সটার্নাল IP অ্যাড্রেসকে অনুমতি দিন
# allow external ip address for vms on project
gcloud org-policies set-policy "/dev/stdin" <<EOF
name: projects/${PROJ_ID}/policies/compute.vmExternalIpAccess
spec:
rules:
- allowAll: true
EOF
সংস্থা সংক্রান্ত নীতি যাচাই করা
compute.vmExternalIpAccess allowAll: True হিসেবে সেট করা আছে কিনা এবং অন্যান্য নীতি enforce: False কিনা তা চেক করুন:
# verify effective org policy constraints on project
for policy in \
discoveryengine.managed.disableCustomMcpServerConnector \
discoveryengine.managed.allowedEgressFqdns \
discoveryengine.managed.allowedDataSources \
iam.managed.disableAccessPolicyBinding \
compute.vmExternalIpAccess; do
gcloud org-policies describe ${policy} \
--project=${PROJ_ID} \
--effective \
--format="flattened[no-pad](name.basename(),spec.rules[0])"
done
পরিষেবা এজেন্টের বাইন্ডিং যাচাই করা (সতর্কতামূলক)
নতুন প্রোজেক্টে, networkservices.googleapis.com প্রথমবার চালু করা হলে, Google Cloud অটোমেটিক এজেন্ট গেটওয়ে পরিষেবা এজেন্ট প্রোভিশন করে এবং এটিকে roles/agentgateway.serviceAgent দেয়। আপনি যদি এমন কোনও বিদ্যমান প্রোজেক্ট আবার ব্যবহার করেন যেখানে আগে ক্লিন-আপ করার সময় ডিফল্ট পরিষেবা এজেন্ট বাইন্ডিং সরিয়ে দেওয়া হতে পারে, তাহলে পরিচয় ও ভূমিকা বাইন্ডিং অক্ষত আছে কিনা তা নিশ্চিত করতে, একটি ফেল-সেফ হিসেবে নিম্নলিখিত কমান্ডগুলি চালান:
# ensure network services service account has been created
gcloud beta services identity create \
--service=networkservices.googleapis.com \
--project="${PROJ_ID}"
# ensure network services service account has service agent roles applied
gcloud projects add-iam-policy-binding "${PROJ_ID}" \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-agentgateway.iam.gserviceaccount.com" \
--role="roles/agentgateway.serviceAgent"
সেট-আপের অংশটি এখানেই শেষ হচ্ছে... এর পরে নেটওয়ার্ক বিভাগ।
৪. নেটওয়ার্ক
এই বিভাগে, আপনি স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেস রিজার্ভ করেন, ইন্টার্নাল ইগ্রেস VPC নেটওয়ার্ক ও আইসোলেটেড এক্সটার্নাল VPC নেটওয়ার্ক তৈরি করেন, PSC নেটওয়ার্ক অ্যাটাচমেন্ট প্রোভিশন করেন, Cloud NAT কনফিগার করেন এবং ফায়ারওয়াল নিয়ম তৈরি করেন।
স্ট্যাটিক এক্সটার্নাল IP অ্যাড্রেস রিজার্ভ করা
Cloud NAT এবং এক্সটার্নাল MCP সার্ভার VM-এর জন্য দুটি রিজার্ভ করা আঞ্চলিক স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেস:
# reserve static external ipv4 address for cloud nat
gcloud compute addresses create ip-${SLUG}-nat \
--region=${REGION}
# reserve static external ipv4 address for the mcp server
gcloud compute addresses create ip-${SLUG}-mcp \
--region=${REGION}
স্ট্যাটিক এক্সটার্নাল IP অ্যাড্রেস যাচাই করা
Gemini Enterprise-এ সর্বজনীনভাবে বিশ্বস্ত TLS সার্টিফিকেটের সাথে HTTPS ব্যবহার করার জন্য রিমোট MCP এন্ডপয়েন্ট প্রয়োজন। এই ল্যাবের জন্য কাস্টম ডোমেন রেজিস্টার করার পরিবর্তে, আপনি sslip.io ব্যবহার করেন, এটি একটি ফ্রি ওয়াইল্ডকার্ড DNS পরিষেবা যা IP অ্যাড্রেস (যেমন mcp.[IP].sslip.io) সহ যেকোনও হোস্টনাম সরাসরি সেই IP-তে সমাধান করে। Let's Encrypt-এর মতো সার্টিফিকেট প্রদানকারী কর্তৃপক্ষ যেহেতু কোনও IP অ্যাড্রেসে সার্টিফিকেট ইস্যু করে না, তাই এই sslip.io হোস্টনেম Caddy রিভার্স প্রক্সি সার্ভারকে MCP সার্ভারের জন্য অটোমেটিক একটি বিশ্বস্ত TLS সার্টিফিকেট প্রোভিশন করার জন্য একটি বৈধ ডোমেন নাম দেয়।
IPv4 অ্যাড্রেস এক্সপোর্ট করুন এবং এক্সটার্নাল MCP সার্ভারের জন্য sslip.io ডোমেন নাম ও URL তৈরি করুন:
# export static ip addresses and set vars for domain
export NAT_EXT_IP=$(gcloud compute addresses describe ip-${SLUG}-nat \
--region=${REGION} \
--format="value(address)")
export MCP_EXT_IP=$(gcloud compute addresses describe ip-${SLUG}-mcp \
--region=${REGION} \
--format="value(address)")
export MCP_DOMAIN="mcp.${MCP_EXT_IP}.sslip.io"
export MCP_URL="https://${MCP_DOMAIN}/mcp"
echo "cloud nat external ip : ${NAT_EXT_IP}"
echo "mcp server external ip : ${MCP_EXT_IP}"
echo "mcp url : ${MCP_URL}"
আউটপুটের উদাহরণ:
cloud nat external ip : 203.0.113.10
mcp server external ip : 203.0.113.20
mcp url : https://mcp.203.0.113.20.sslip.io/mcp
ইন্টার্নাল নেটওয়ার্ক তৈরি করা
networkAttachment সহ egressNetworkConfig ব্যবহার করার জন্য এজেন্ট গেটওয়ে কানেক্টিভিটি টেমপ্লেট কনফিগার করা হলে, PSC নেটওয়ার্ক অ্যাটাচমেন্ট হোস্ট করা সাবনেটকে অন্তত /28 CIDR ব্লক হতে হবে এবং প্রাইভেট Google অ্যাক্সেস (--enable-private-ip-google-access) চালু থাকতে হবে।
ইন্টার্নাল এজেন্ট গেটওয়ে ইগ্রেসের জন্য গ্লোবাল VPC নেটওয়ার্ক তৈরি করুন:
# create vpc network
gcloud compute networks create vnet-${SLUG}-internal --subnet-mode=custom
# create subnet for agent gateway psc na
gcloud compute networks subnets create subnet-${REGION}-agw \
--network=vnet-${SLUG}-internal \
--range=10.10.10.0/28 \
--region=${REGION} \
--enable-private-ip-google-access
ইন্টার্নাল ফায়ারওয়াল সংক্রান্ত নিয়ম তৈরি করা
লগিং চালু করে সমস্ত ইগ্রেস ট্রাফিককে অনুমতি দেওয়ার জন্য একটি ফায়ারওয়াল নীতি তৈরি করুন। এটি এজেন্ট গেটওয়ে থেকে ইন্টার্নাল VPC নেটওয়ার্কে বের হওয়া ট্রাফিক মনিটর করতে ব্যবহার করা হবে। নেটওয়ার্ক নিরাপত্তা ও ট্রাফিক মনিটরিংয়ের জন্য Cloud NGFW Essentials ও Standard টিয়ার, দু'টিই ব্যবহার করা যায়।
# create fw policy
gcloud compute network-firewall-policies create fw-policy-${SLUG}-internal --global
# create fw policy rule
gcloud compute network-firewall-policies rules create 1001 \
--description="allow all out and log" \
--firewall-policy=fw-policy-${SLUG}-internal \
--global-firewall-policy \
--action=allow \
--direction=EGRESS \
--layer4-configs=all \
--dest-ip-ranges=0.0.0.0/0 \
--enable-logging
# bind fw policy to network
gcloud compute network-firewall-policies associations create \
--name=fw-policy-bind-${SLUG}-internal \
--firewall-policy=fw-policy-${SLUG}-internal \
--network=vnet-${SLUG}-internal \
--global-firewall-policy
PSC নেটওয়ার্ক অ্যাটাচমেন্ট তৈরি করা
এজেন্ট গেটওয়ে থেকে কানেকশন অটোমেটিক গ্রহণ করার জন্য কনফিগার করা একটি Private Service Connect (PSC) নেটওয়ার্ক অ্যাটাচমেন্ট তৈরি করুন। আউটবাউন্ড ইগ্রেস ট্রাফিকের জন্য এজেন্ট গেটওয়ের প্রোডিউসার সাইডের সাথে নিরাপদে লিঙ্ক করতে, নেটওয়ার্ক অ্যাটাচমেন্ট কানেকশনের কনজিউমার VPC নেটওয়ার্ক সাইড তৈরি করে। সাবনেট সংক্রান্ত প্রয়োজনীয়তা ও IP রেঞ্জ স্পেসিফিকেশন সম্পর্কে অতিরিক্ত তথ্য পেতে, VPC কানেক্টিভিটি কনফিগার করুন দেখুন।
# create psc network attachment
gcloud compute network-attachments create psc-na-${REGION}-agw \
--region=${REGION} \
--subnets=subnet-${REGION}-agw \
--connection-preference=ACCEPT_AUTOMATIC
PSC নেটওয়ার্ক অ্যাটাচমেন্ট যাচাই করা
# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}
PSC নেটওয়ার্ক অ্যাটাচমেন্টের রিসোর্স URI ফিরিয়ে আনুন এবং PSC_NA_URI এনভায়রনমেন্ট ভেরিয়েবলে এটি সেভ করুন। VPC নেটওয়ার্কে নেটওয়ার্ক ইগ্রেসের জন্য PSC ইন্টারফেস প্রোভিশন করতে, এজেন্ট গেটওয়ে কনফিগারেশনে (networkConfig.egress.networkAttachment) এই URI রেফারেন্স হিসেবে ব্যবহার করা হবে:
# fetch psc network attachment uri
export PSC_NA_URI=$(gcloud compute network-attachments describe psc-na-${REGION}-agw \
--region=${REGION} \
--format="value(selfLink.scope(v1))")
echo ${PSC_NA_URI}
Cloud NAT তৈরি করা
পাবলিক ইন্টারনেটে রাউটিংয়ের জন্য এজেন্ট গেটওয়ের এগ্রেস ট্রাফিকের সোর্স IP অ্যাড্রেসকে রিজার্ভ করা পাবলিক IP অ্যাড্রেসে ট্রান্সলেট করতে Cloud NAT ব্যবহার করা হয়।
Cloud NAT ব্যবহার করার উপযুক্ত হিসেবে শুধুমাত্র Agent Gateway এগ্রেস নেটওয়ার্ক অ্যাটাচমেন্ট সাবনেট থেকে পাওয়া সোর্সকে বিবেচনা করা হয়।
# create router for nat
gcloud compute routers create cr-nat-${SLUG}-${REGION} \
--network=vnet-${SLUG}-internal \
--asn=16550 \
--region=${REGION}
# create nat
gcloud compute routers nats create nat-${SLUG}-${REGION} \
--router=cr-nat-${SLUG}-${REGION} \
--region=${REGION} \
--nat-custom-subnet-ip-ranges="subnet-${REGION}-agw" \
--nat-external-ip-pool="ip-${SLUG}-nat" \
--enable-logging \
--log-filter=ALL
Cloud NAT যাচাই করা
Cloud NAT স্ট্যাটাস এবং প্রত্যাশিত natIP সোর্স কনফিগার করা আছে কিনা তা চেক করুন:
# verify cloud nat configuration
gcloud compute routers nats describe nat-${SLUG}-${REGION} \
--router=cr-nat-${SLUG}-${REGION} \
--region=${REGION} \
--format="yaml(name,natIps,subnetworks.name)"
আউটপুটের উদাহরণ:
name: nat-foo-us-central1
natIps:
- https://www.googleapis.com/compute/v1/projects/[PROJ_ID]/regions/us-central1/addresses/ip-foo-nat
এক্সটার্নাল নেটওয়ার্ক তৈরি করা
এক্সটার্নাল MCP সার্ভার VM হোস্ট করার জন্য একটি আলাদা, আইসোলেটেড VPC নেটওয়ার্ক তৈরি করুন।
# create vpc network
gcloud compute networks create vnet-${SLUG}-external --subnet-mode=custom
# create subnet for mcp server
gcloud compute networks subnets create subnet-${REGION}-mcp \
--network=vnet-${SLUG}-external \
--range=240.240.240.0/24 \
--region=${REGION} \
--enable-private-ip-google-access
এক্সটার্নাল ফায়ারওয়াল সংক্রান্ত নিয়ম তৈরি করা
এক্সটার্নাল VPC নেটওয়ার্কে দুটি ইনগ্রেস ফায়ারওয়াল নিয়ম তৈরি করুন:
2001: ইনবাউন্ড TCP পোর্ট80-কে অনুমতি দেয় যাতে Let's Encrypt${MCP_DOMAIN}-এর জন্য ACME HTTP-01 ডোমেন যাচাইকরণ সংক্রান্ত চ্যালেঞ্জ সম্পূর্ণ করতে পারে।2002: প্রথমে0.0.0.0/0থেকে ইনবাউন্ড TCP পোর্ট443-কে অনুমতি দেয় যাতে TLS রেডি এবং OAuth 2.0tokeninfoএনফোর্সমেন্ট যাচাই করা যায়। এটি${NAT_EXT_IP}/32-এ কঠোরভাবে লক করার আগে লোকাল শেল থেকে করা হয়।
# create fw policy
gcloud compute network-firewall-policies create fw-policy-${SLUG}-external --global
# create fw policy rules
gcloud compute network-firewall-policies rules create 2001 \
--description="allow in any http" \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:80 \
--src-ip-ranges=0.0.0.0/0 \
--dest-ip-ranges=240.240.240.0/24 \
--enable-logging
gcloud compute network-firewall-policies rules create 2002 \
--description="allow in any https" \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:443 \
--src-ip-ranges=0.0.0.0/0 \
--dest-ip-ranges=240.240.240.0/24 \
--enable-logging
# bind fw policy to network
gcloud compute network-firewall-policies associations create \
--name=fw-policy-bind-${SLUG}-external \
--firewall-policy=fw-policy-${SLUG}-external \
--network=vnet-${SLUG}-external \
--global-firewall-policy
নেটওয়ার্ক সংক্রান্ত অংশটি এখানেই শেষ হচ্ছে... এর পরে এজেন্ট গেটওয়ে বিভাগ।
৫. এজেন্ট গেটওয়ে
এই বিভাগে, আপনি vpcEgress: ALL_TRAFFIC-এর সাথে এজেন্ট কানেক্টিভিটি টেমপ্লেট ডিপ্লয় করেন, আঞ্চলিক এজেন্ট গেটওয়ে ডিপ্লয় করেন এবং আউটবাউন্ড নেটওয়ার্ক অনুরোধ নিয়ন্ত্রণ করতে আইডেন্টিটি-অ্যাওয়ার প্রক্সি (IAP)-কে অনুমোদন ডেলিগেট করেন এবং IAM ইউনিফায়েড অ্যাক্সেস নীতি সংক্রান্ত নিয়ম নির্ধারণ করেন।
কানেক্টিভিটি টেমপ্লেট তৈরি করা
কানেক্টিভিটি টেমপ্লেট স্পেসিফিকেশন এইসব বিষয় নির্ধারণ করে:
egressNetworkConfig.networkAttachment: PSC নেটওয়ার্ক অ্যাটাচমেন্টের দিকে পয়েন্ট করে, আপনার VPC নেটওয়ার্কে এজেন্ট গেটওয়ে কানেক্ট করে।egressNetworkConfig.vpcEgress:ALL_TRAFFICহিসেবে সেট করা আছে, যাতে সমস্ত আউটবাউন্ড এজেন্ট কানেকশন (পাবলিক ইন্টারনেট MCP এন্ডপয়েন্ট সহ) VPC নেটওয়ার্কে রাউট করা যায় এবং Cloud NAT সোর্স IP অ্যাড্রেস ট্রান্সলেশন ব্যবহার করে বেরিয়ে আসা যায়।
কানেক্টিভিটি টেমপ্লেট কনফিগারেশন ফাইল তৈরি ও ইমপোর্ট করা:
# create connectivity template config file (vpcEgress: ALL_TRAFFIC)
cat > cfg/act-${AGW_NAME}.yaml << EOF
accessPath: AGENT_TO_ANYWHERE
name: projects/${PROJ_NO}/locations/${REGION}/agentConnectivityTemplates/act-${AGW_NAME}
deploymentModel: CENTRALIZED
egressNetworkConfig:
networkAttachment: ${PSC_NA_URI}
vpcEgress: ALL_TRAFFIC
EOF
# import connectivity template file (create template)
gcloud network-services agent-connectivity-templates import act-${AGW_NAME} \
--source="cfg/act-${AGW_NAME}.yaml" \
--location=${REGION}
এজেন্ট গেটওয়ে তৈরি করা
এজেন্ট গেটওয়ে স্পেসিফিকেশন এগুলি নির্ধারণ করে:
agentConnectivityTemplate: কানেক্টিভিটি টেমপ্লেটের দিকে পয়েন্ট করে, যাতে গেটওয়ে VPC কানেক্টিভিটির জন্য PSC নেটওয়ার্ক অ্যাটাচমেন্ট ব্যবহার করতে পারে।registries: ক্যাটালগ করা MCP এন্ডপয়েন্ট ও টুল স্কিমা সমাধান করতে, আঞ্চলিক এজেন্ট রেজিস্ট্রি সহ গেটওয়েকে অ্যাসোসিয়েট করে।
এজেন্ট গেটওয়ের কনফিগারেশন ফাইল তৈরি ও ইমপোর্ট করা:
# create agent gateway config file
cat > cfg/${AGW_NAME}.yaml << EOF
name: ${AGW_NAME}
protocols:
- MCP
googleManaged:
governedAccessPath: AGENT_TO_ANYWHERE
agentConnectivityTemplate: projects/${PROJ_NO}/locations/${REGION}/agentConnectivityTemplates/act-${AGW_NAME}
registries:
- "//agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}"
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
--source="cfg/${AGW_NAME}.yaml" \
--location=${REGION}
এজেন্ট গেটওয়ের ডেপ্লয়মেন্ট যাচাই করা
এজেন্ট রেজিস্ট্রি ও কানেক্টিভিটি টেমপ্লেট কনফিগারেশন কনফার্ম করুন:
# verify agent gateway deployment details
gcloud network-services agent-gateways describe ${AGW_NAME} \
--location=${REGION} \
--format="yaml(name,agentConnectivityTemplate,registries)"
আউটপুটের উদাহরণ:
agentConnectivityTemplate: projects/[PROJ_NO]/locations/us-central1/agentConnectivityTemplates/act-foo-us-central1
name: projects/[PROJ_ID]/locations/us-central1/agentGateways/agw-foo-us-central1-ata
registries:
- //agentregistry.googleapis.com/projects/[PROJ_ID]/locations/us-central1
গেটওয়ে কানেকশন কনফার্ম করতে PSC নেটওয়ার্ক অ্যাটাচমেন্ট পরীক্ষা করুন:
# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw \
--region=${REGION} \
--format="yaml(connectionEndpoints)"
আউটপুটের উদাহরণ:
connectionEndpoints:
- ipAddress: 10.10.10.2
projectIdOrNum: '[TENANT_PROJ_NO]'
status: ACCEPTED
subnetwork: https://www.googleapis.com/compute/v1/projects/[PROJ_ID]/regions/us-central1/subnetworks/subnet-us-central1-agw
প্রতিনিযুক্তির মাধ্যমে অনুমোদন
অনুমোদন নীতি (networksecurity.authzPolicies) ব্যবহার করে এজেন্ট গেটওয়ে আউটবাউন্ড টুল ট্রাফিক সুরক্ষিত ও নিয়ন্ত্রণ করে যা Identity-Aware Proxy (IAP) ইউনিফায়েড অ্যাক্সেস নীতি (UAP)-এর সাথে ইন্টিগ্রেট করা হয়।
Agent Gateway সাধারণ ইনলাইন ALLOW ও DENY নিয়ম মেনে চললেও, এন্টারপ্রাইজ এনভায়রনমেন্টের ক্ষেত্রে সেন্ট্রালাইজড, পরিচয়-কেন্দ্রিক গভর্ন্যান্স প্রয়োজন। IAM ইউনিফায়েড অ্যাক্সেস নীতি (বা অ্যাক্সেস নীতি) ব্যবহার করে, আপনি স্ট্যান্ডার্ড IAM v3 অ্যাক্সেস নীতি ব্যবহার করে এগ্রেস অ্যাক্সেস সংক্রান্ত নিয়ম ম্যানেজ করেন।
ছবি ৩. অনুমোদন আর্কিটেকচার
অনুমোদন ফ্লো তিনটি কম্পোনেন্টকে কানেক্ট করে:
- গেটওয়ে অনুমোদন সংক্রান্ত নীতি (
authzPolicy):- এজেন্ট গেটওয়ে টার্গেট করা একটি আঞ্চলিক রিসোর্স।
policyProfile: REQUEST_AUTHZওaction: CUSTOM-এর সাথে কনফিগার করা হয়েছে যাতে IAP অনুমোদন এক্সটেনশনে সব আউটবাউন্ড অনুমোদন চেক করা যায়।
- IAP পরিষেবা এক্সটেনশন (
authzExtension):- একটি আঞ্চলিক রিসোর্স যা Identity-Aware Proxy (
iap.googleapis.com)-কে অনুরোধ অনুমোদনের দায়িত্ব দেয়। ENFORCEমোডে নীতি ভার্সনV2ব্যবহার করে নীতি মূল্যায়ন করে।
- একটি আঞ্চলিক রিসোর্স যা Identity-Aware Proxy (
- IAM ইউনিফায়েড অ্যাক্সেস নীতি ও বাইন্ডিং (
accessPolicyওpolicyBinding):- ফাইন-গ্রেন অ্যাক্সেস সংক্রান্ত নিয়মাবলী সহ গ্লোবাল IAM v3 রিসোর্স।
- কলিং এজেন্টের SPIFFE প্রিন্সিপাল পরিচয় প্রমাণ করে, সার্বজনীন
iap.googleapis.com/resources.egressViaIAPঅনুমতি যাচাই করে এবং ডেস্টিনেশন অ্যাট্রিবিউটের বিরুদ্ধে কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) শর্তাবলী মূল্যায়ন করে।
অনুমোদন এক্সটেনশন ডেপ্লয় করা
# create authz extension config file
cat > "cfg/${AGW_NAME}-svc-ext-authz-iap.yaml" << EOF
name: ${AGW_NAME}-svc-ext-authz-iap
service: iap.googleapis.com
failOpen: false
timeout: 1s
metadata:
iapPolicyVersion: "V2"
EOF
# import authz extension config file (create authz extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap \
--source="cfg/${AGW_NAME}-svc-ext-authz-iap.yaml" \
--location=${REGION}
অনুমতি এক্সটেনশন যাচাই করা
অনুমোদন এক্সটেনশন অ্যাক্টিভ আছে কিনা চেক করুন:
# list authz extensions
gcloud service-extensions authz-extensions list \
--location=${REGION} \
--format="table(
name.basename():label=NAME,
createTime.date(tz=LOCAL):label=CREATED,
service:label=SERVICE,
metadata:label=METADATA,
timeout:label=TIMEOUT
)"
অনুমোদন নীতি প্রয়োগ করা
network-securityঅনুমোদন নীতি কনফিগারেশন তৈরি করুন যা এজেন্ট গেটওয়েকে টার্গেট করে এবং IAP-এর জন্য অনুমোদন এক্সটেনশনে অনুরোধ যাচাই করার দায়িত্ব অর্পণ করে:
# create authz policy config file
cat > cfg/${AGW_NAME}-authz-policy-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-iap
target:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
authzExtension:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap"
EOF
# import authz policy config file (create authz policy)
gcloud network-security authz-policies import ${AGW_NAME}-authz-policy-iap \
--source=cfg/${AGW_NAME}-authz-policy-iap.yaml \
--location=${REGION}
অনুমোদন সংক্রান্ত নীতি যাচাই করা
অনুমোদন নীতি অ্যাক্টিভ আছে কিনা চেক করুন:
# list authz policies
gcloud network-security authz-policies list \
--location=${REGION} \
--format="table(
name.basename():label=NAME,
action:label=ACTION,
policyProfile:label=POLICY_PROFILE,
customProvider.authzExtension.resources[0].basename():label=CUSTOM_PROVIDER_RESOURCE
)"
IAM অ্যাক্সেস নীতি তৈরি করা
Agent Gateway এখন IAP-কে অনুমোদন চেক করার দায়িত্ব দেয় এবং এজেন্ট রেজিস্ট্রি থেকে গন্তব্য সংক্রান্ত মেটাডেটা সমাধান করে। এরপরে, আউটবাউন্ড টুল এক্সিকিউশন নিয়ন্ত্রণ করতে IAM ইউনিফায়েড অ্যাক্সেস নীতি সংক্রান্ত নিয়ম নির্ধারণ করুন।
IAP নিম্নলিখিত এজেন্ট রেজিস্ট্রি গন্তব্য অ্যাট্রিবিউটের সাথে CEL অ্যাট্রিবিউট এক্সপ্রেশন মূল্যায়ন করে:
- রেজিস্টার্ড স্ট্যাটাস (
destination.is_registered):- গন্তব্য এজেন্ট রেজিস্ট্রিতে ক্যাটালগ করা আছে কিনা তা নির্দেশ করে এমন বুলিয়ান (
true/false)।
- গন্তব্য এজেন্ট রেজিস্ট্রিতে ক্যাটালগ করা আছে কিনা তা নির্দেশ করে এমন বুলিয়ান (
- MCP সার্ভারের নাম (
destination.agent_registry.mcp_server.name):- এজেন্ট রেজিস্ট্রিতে রেজিস্টার করা ক্যাননিকাল MCP সার্ভার রিসোর্স নাম।
- MCP পদ্ধতি (
destination.agent_registry.mcp_server.method):- ইনভোক করা হচ্ছে এমন MCP পদ্ধতি (যেমন,
tools/call,tools/list,initialize)।
- ইনভোক করা হচ্ছে এমন MCP পদ্ধতি (যেমন,
- টুলের নাম (
destination.agent_registry.mcp_server.tool.name):- ইনভোক করা নির্দিষ্ট টুলের নাম (যেমন,
get_sprocket_by_idবাget_sprockets), যা রেজিস্টার করা MCP সার্ভারে ফাইন-গ্রেনড, টুল-লেভেল অনুমোদন চালু করে।
- ইনভোক করা নির্দিষ্ট টুলের নাম (যেমন,
IAM অ্যাক্সেস নীতি সংক্রান্ত নিয়ম নির্ধারণ করা
IAM নীতি সংক্রান্ত নিয়মের ম্যানিফেস্টে এগুলি উল্লেখ করা থাকে:
- প্রিন্সিপাল: Gemini Enterprise-এর মূল অ্যাসিস্ট্যান্ট এজেন্টকে প্রতিনিধিত্বকারী SPIFFE প্রিন্সিপাল পরিচয়।
- অনুমতি: IAP-পরিচালিত সমস্ত নির্গমন ট্রাফিকের জন্য সার্বজনীন
iap.googleapis.com/resources.egressViaIAPঅনুমতি প্রয়োজন। - শর্ত: একটি CEL এক্সপ্রেশন (
destination.is_registered == true) যা নিশ্চিত করে যে এজেন্ট শুধুমাত্র এজেন্ট রেজিস্ট্রিতে ক্যাটালগ করা এন্ডপয়েন্টই ইনভোক করতে পারে।
নীতি সংক্রান্ত নিয়মের ম্যানিফেস্ট ফাইল তৈরি করুন:
# create access policy rule file
cat > cfg/uap-policy-${SLUG}-rules.json << EOF
[
{
"description": "allow ge assistant to any registered service",
"effect": "ALLOW",
"principals": [
"principal://${TRUST_DOMAIN}/resources/discoveryengine/projects/${PROJ_NO}/locations/global/engines/${GE_APP_INIT}/assistants/default_assistant/agents/default/core_assistant"
],
"operation": {
"permissions": [
"iap.googleapis.com/resources.egressViaIAP"
]
},
"conditions": {
"iap.googleapis.com": {
"expression": \
"destination.is_registered == true"
}
}
}
]
EOF
IAM অ্যাক্সেস নীতি প্রয়োগ করা
ম্যানিফেস্ট ফাইলে সংজ্ঞায়িত নিয়ম ব্যবহার করে গ্লোবাল IAM অ্যাক্সেস নীতি তৈরি করুন:
# create iam access policy
gcloud iam access-policies create uap-policy-${SLUG} \
--details-rules=cfg/uap-policy-${SLUG}-rules.json \
--project=${PROJ_ID} \
--location=global
IAM অ্যাক্সেস নীতি যাচাই করা
IAM অ্যাক্সেস নীতি সঠিকভাবে তৈরি হয়েছে কিনা তা চেক করুন এবং নিয়মের বিবরণ খুঁটিয়ে দেখুন:
# show iam access policy details
gcloud iam access-policies describe uap-policy-${SLUG} \
--project=${PROJ_ID} \
--location=global
আউটপুটের উদাহরণ:
details:
rules:
- conditions:
iap.googleapis.com:
expression: destination.is_registered == true
description: allow ge assistant to any registered service
effect: ALLOW
operation:
permissions:
- iap.googleapis.com/resources.egressViaIAP
principals:
- principal://agents.global.org-[ORG_ID].system.id.goog/resources/discoveryengine/projects/[PROJ_NO]/locations/global/engines/app-foo-global_[EPOCH]/assistants/default_assistant/agents/default/core_assistant
name: projects/[PROJ_ID]/locations/global/accessPolicies/uap-policy-foo
প্রোজেক্টের সাথে IAM অ্যাক্সেস নীতি বাইন্ড করা
আপনার প্রোজেক্টের সব এজেন্ট গেটওয়ে জুড়ে এনফোর্সমেন্ট অ্যাক্টিভেট করতে, এমন একটি নীতি বাইন্ডিং তৈরি করুন যা প্রোজেক্ট রিসোর্সের সাথে IAM অ্যাক্সেস নীতি অ্যাটাচ করে:
# bind iam access policy to project resource
gcloud iam policy-bindings create uap-bind-${SLUG} \
--policy="projects/${PROJ_ID}/locations/global/accessPolicies/uap-policy-${SLUG}" \
--target-resource="//cloudresourcemanager.googleapis.com/projects/${PROJ_ID}" \
--project=${PROJ_ID} \
--location=global
IAM অ্যাক্সেস নীতি বাইন্ডিং যাচাই করা
সঠিক নীতি ও টার্গেটের সাথে অ্যাক্টিভ নীতি বাইন্ডিং পয়েন্ট চেক করুন:
# show policy binding details
gcloud iam policy-bindings describe uap-bind-${SLUG} \
--project=${PROJ_ID} \
--location=global
এজেন্ট গেটওয়ে অংশটি এখানেই শেষ হল... এর পরে MCP সার্ভার বিভাগ।
৬. MCP সার্ভার
এই বিভাগে, আপনি একটি এক্সটার্নাল FastMCP OAuth 2.0 রিসোর্স সার্ভার (mcp-sprockets) ডেপ্লয় করেন যা get_sprockets এবং get_sprocket_by_id টুল এক্সপোজ করে, এটি যাচাই করে যে এটি https://oauth2.googleapis.com/tokeninfo-এর বিরুদ্ধে Google OAuth 2.0 বিয়ারার টোকেন ক্রিপ্টোগ্রাফিকভাবে যাচাই করে। এরপরে, আপনি Cloud NAT স্ট্যাটিক IP-তে এক্সটার্নাল ফায়ারওয়াল নিয়ম কঠোরভাবে লক করবেন।
এক্সটার্নাল MCP সার্ভার ডিপ্লয় করা
স্টার্ট-আপ স্ক্রিপ্ট Caddy ও FastMCP ইনস্টল করে, 127.0.0.1:8080-এ mcp-sprockets সার্ভার লঞ্চ করে এবং ${MCP_DOMAIN}-এ HTTPS পরিবেশন করার জন্য Caddy কনফিগার করে।
Gemini Enterprise প্রতিবার কোনও MCP টুল (যেমন, get_sprockets ও get_sprocket_by_id) কল করলে, সার্ভার এগুলি করবে:
X-Forwarded-Forহেডার (egress_source_ip) থেকে কলারের সোর্স IP পড়ুন।Authorization: Bearer [access_token]হেডার এক্সট্র্যাক্ট করুন এবং Google OAuth 2.0 যাচাইকরণ এন্ডপয়েন্টের (https://oauth2.googleapis.com/tokeninfo?access_token=[token]) মাধ্যমে টোকেন যাচাই করুন।"authenticated_user"([user_email])"egress_source_ip"-এর সাথে রিটার্ন করুন, এটি প্রমাণ করে যে এক্সটার্নাল MCP সার্ভার Cloud NAT স্ট্যাটিক IP এবং গ্রাহকের Google OAuth 2.0 পরিচয়, দুটিই যাচাই করেছে।
# create startup script for the sprockets mcp server vm
cat > cfg/server-startup.sh << 'EOF'
#!/bin/bash
set -euo pipefail
MCP_DOMAIN=$(curl -s -H "Metadata-Flavor: Google" \
http://metadata.google.internal/computeMetadata/v1/instance/attributes/mcp-domain)
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y caddy python3-venv curl
mkdir -p /opt/mcp-sprockets
python3 -m venv /opt/mcp-sprockets/venv
/opt/mcp-sprockets/venv/bin/pip install --upgrade pip
/opt/mcp-sprockets/venv/bin/pip install "fastmcp>=2.14.0" "uvicorn>=0.34.0"
cat <<'PYEOF' > /opt/mcp-sprockets/main.py
import json
import urllib.parse
import urllib.request
from typing import Any, Dict
from fastmcp import FastMCP
from fastmcp.server.dependencies import get_http_headers
from mcp.types import ToolAnnotations
mcp = FastMCP("mcp-sprockets")
SPROCKETS = {
"SPK-101": {"id": "SPK-101", "model": "ANSI-40-12T", "teeth": 12, "pitch_in": 0.5, "material": "1045 Carbon Steel", "stock": 140, "unit_price": 18.50},
"SPK-102": {"id": "SPK-102", "model": "ANSI-40-24T", "teeth": 24, "pitch_in": 0.5, "material": "1045 Carbon Steel", "stock": 85, "unit_price": 29.00},
"SPK-103": {"id": "SPK-103", "model": "ANSI-60-16T", "teeth": 16, "pitch_in": 0.75, "material": "304 Stainless Steel", "stock": 60, "unit_price": 42.00},
"SPK-104": {"id": "SPK-104", "model": "ANSI-60-32T", "teeth": 32, "pitch_in": 0.75, "material": "304 Stainless Steel", "stock": 35, "unit_price": 68.00},
"SPK-105": {"id": "SPK-105", "model": "ANSI-80-20T", "teeth": 20, "pitch_in": 1.0, "material": "4140 Alloy Steel", "stock": 50, "unit_price": 95.00}
}
def verify_google_oauth_token(headers: Dict[str, str]) -> str:
token = headers.get("authorization", "")[7:].strip() if headers.get("authorization", "").lower().startswith("bearer ") else ""
if not token:
return "unauthenticated (missing Bearer token)"
url = "https://oauth2.googleapis.com/tokeninfo?" + urllib.parse.urlencode({"access_token": token})
with urllib.request.urlopen(url, timeout=5) as resp:
info = json.loads(resp.read().decode("utf-8"))
return info.get("email", info.get("sub", "verified-oauth-user"))
@mcp.tool(
description="list all sprockets in the inventory catalog",
annotations=ToolAnnotations(
readOnlyHint=True,
destructiveHint=False,
idempotentHint=True,
openWorldHint=False
)
)
def get_sprockets() -> Dict[str, Any]:
headers = get_http_headers(include_all=True)
caller_ip = headers.get("x-forwarded-for", "unknown").split(",")[0].strip()
try:
user_email = verify_google_oauth_token(headers)
except Exception as exc:
return {"egress_source_ip": caller_ip, "authenticated_user": None, "error": f"OAuth token verification failed: {exc}"}
return {
"egress_source_ip": caller_ip,
"authenticated_user": user_email,
"sprockets": list(SPROCKETS.values())
}
@mcp.tool(
description="fetch details of a specific sprocket by its ID (eg, SPK-101)",
annotations=ToolAnnotations(
readOnlyHint=True,
destructiveHint=False,
idempotentHint=True,
openWorldHint=False
)
)
def get_sprocket_by_id(sprocket_id: str) -> Dict[str, Any]:
headers = get_http_headers(include_all=True)
caller_ip = headers.get("x-forwarded-for", "unknown").split(",")[0].strip()
try:
user_email = verify_google_oauth_token(headers)
except Exception as exc:
return {"egress_source_ip": caller_ip, "authenticated_user": None, "error": f"OAuth token verification failed: {exc}"}
sprocket = SPROCKETS.get(sprocket_id.upper())
if sprocket:
return {
"egress_source_ip": caller_ip,
"authenticated_user": user_email,
"sprocket": sprocket
}
return {
"egress_source_ip": caller_ip,
"authenticated_user": user_email,
"error": f"Sprocket '{sprocket_id}' not found."
}
app = mcp.http_app(stateless_http=True)
PYEOF
cat <<'SVCEOF' > /etc/systemd/system/mcp-sprockets.service
[Unit]
Description=Sprockets FastMCP Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/mcp-sprockets
ExecStart=/opt/mcp-sprockets/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8080 --forwarded-allow-ips="*"
Restart=always
[Install]
WantedBy=multi-user.target
SVCEOF
systemctl daemon-reload
systemctl enable --now mcp-sprockets.service
systemctl restart mcp-sprockets.service
cat <<CADDYEOF > "/etc/caddy/Caddyfile"
${MCP_DOMAIN} {
reverse_proxy 127.0.0.1:8080
}
CADDYEOF
systemctl restart caddy
EOF
# create vm instance
gcloud compute instances create vm-${MCP_NAME} \
--zone=${ZONE} \
--machine-type=e2-micro \
--image-family=debian-12 \
--image-project=debian-cloud \
--shielded-secure-boot \
--network-interface="subnet=subnet-${REGION}-mcp,address=${MCP_EXT_IP}" \
--metadata="mcp-domain=${MCP_DOMAIN}" \
--metadata-from-file="startup-script=cfg/server-startup.sh"
MCP সার্ভার রেডি আছে কিনা এবং OAuth 2.0 tokeninfo যাচাইকরণ
স্টার্ট-আপ স্ক্রিপ্টকে FastMCP ও Caddy ইনস্টল করতে এবং Let's Encrypt TLS সার্টিফিকেট প্রোভিশন করতে কয়েক মিনিট অপেক্ষা করুন।
# poll until caddy serves valid tls and fastmcp responds to tools/list
for i in $(seq 1 30); do
RESP=$(curl -s -X POST "${MCP_URL}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' || true)
if echo "${RESP}" | grep -q "get_sprockets"; then
echo "mcp server and let's encrypt tls ready"
break
fi
echo "...waiting for mcp server and let's encrypt tls (attempt ${i}/30)..."
sleep 5
done
sslip.io DNS রেজোলিউশন, Caddy-এর পরিবেশিত Let's Encrypt TLS সার্টিফিকেট এবং FastMCP tools/list উত্তর যাচাই করুন:
# query mcp server for tools list
curl -v -X POST "${MCP_URL}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' \
2>&1 | grep -E "Connected to|subject:|issuer:|SSL certificate|HTTP/|event:|data:"
আউটপুটের উদাহরণ:
* Connected to mcp.203.0.113.20.sslip.io (203.0.113.20) port 443
* subject: CN=mcp.203.0.113.20.sslip.io
* issuer: C=US; O=Let's Encrypt; CN=E5
* SSL certificate verify ok.
> POST /mcp HTTP/2
< HTTP/2 200
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"get_sprockets","description":"list all sprockets in the inventory catalog","inputSchema":{"properties":{},"type":"object"},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true}},{"name":"get_sprocket_by_id","description":"fetch details of a specific sprocket by its ID (eg, SPK-101)","inputSchema":{"properties":{"sprocket_id":{"type":"string"}},"required":["sprocket_id"],"type":"object"},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true}}]}}
এক্সটার্নাল ফায়ারওয়াল লক করার আগে, tools/call Google OAuth 2.0 বিয়ারার টোকেন (gcloud auth print-access-token) পাস করে একটি পরীক্ষা চালান যাতে যাচাই করা যায় যে mcp-sprockets https://oauth2.googleapis.com/tokeninfo-এর সাথে টোকেন যাচাই করে এবং কলার সোর্স IP অ্যাড্রেসের সাথে আপনার "authenticated_user" ইমেল ফেরত দেয়:
# query mcp server (test tools/call with google oauth 2.0 bearer token)
curl -s -X POST "${MCP_URL}" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_sprocket_by_id",
"arguments": {"sprocket_id": "SPK-105"}
}
}' | sed -n 's/^data: //p' | jq '.result.structuredContent'
আউটপুটের উদাহরণ (ফায়ারওয়াল লকডাউন করার আগে আপনার সরাসরি Cloud Shell IP এবং আপনার যাচাই করা Google OAuth ইমেল দেখানো হচ্ছে):
{
"egress_source_ip": "198.51.100.154",
"authenticated_user": "user@example.com",
"sprocket": {
"id": "SPK-105",
"model": "ANSI-80-20T",
"teeth": 20,
"pitch_in": 1.0,
"material": "4140 Alloy Steel",
"stock": 50,
"unit_price": 95.0
}
}
Cloud NAT স্ট্যাটিক IP-তে ফায়ারওয়াল লক করা
এক্সটার্নাল VPC নেটওয়ার্ক ফায়ারওয়াল নীতি আপডেট করুন যাতে TCP পোর্ট 443 Cloud NAT স্ট্যাটিক এক্সটার্নাল IP (${NAT_EXT_IP}/32) থেকে শুধুমাত্র ট্রাফিক গ্রহণ করে:
# create fw policy rule allowing https only from cloud nat static ip
gcloud compute network-firewall-policies rules create 2003 \
--description="allow in any https from nat ip" \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:443 \
--src-ip-ranges="${NAT_EXT_IP}/32" \
--dest-ip-ranges=240.240.240.0/24 \
--enable-logging
# delete temporary open fw policy rules
gcloud compute network-firewall-policies rules delete 2001 \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy
gcloud compute network-firewall-policies rules delete 2002 \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy
এক্সটার্নাল ফায়ারওয়াল নীতি সংক্রান্ত নিয়মগুলি যথাযথভাবে প্রয়োগ করা হয়েছে কিনা তা চেক করুন:
# list all rules in the global network firewall policy
gcloud compute network-firewall-policies describe fw-policy-${SLUG}-external \
--global \
--flatten="rules[]" \
--format="table(
rules.priority:label=RULE,
rules.action:label=ACTION,
rules.direction:label=DIRECTION,
firstof(
rules.match.srcIpRanges,
rules.match.srcAddressGroups,
rules.match.srcSecureTags.name
).map().sub('projects/[^/]+/(locations/global/|global/)', '').list():label=SRC,
firstof(
rules.targetForwardingRules,
rules.match.destIpRanges,
rules.targetType
).map().sub('projects/[^/]+/(locations/global/|global/)', '').list():label=DST
)"
Cloud NAT স্ট্যাটিক IP-এর বাইরে সরাসরি কানেকশন এখন ব্লক করা হয়েছে কিনা তা চেক করুন:
# query mcp server
curl -i --connect-timeout 5 "${MCP_URL}" \
|| echo "Expected: Direct access blocked (not originating from ${NAT_EXT_IP})"
আউটপুটের উদাহরণ:
curl: (28) Connection timed out after 5001 milliseconds
Expected: Direct access blocked (not originating from 203.0.113.10)
MCP সার্ভার সংক্রান্ত অংশটি এখানেই শেষ হল... এর পরে এজেন্ট রেজিস্ট্রি বিভাগ।
৭. এজেন্ট রেজিস্ট্রি
এজেন্ট রেজিস্ট্রি হল AI ইকোসিস্টেমের মধ্যে থাকা সব এজেন্ট, MCP সার্ভার ও এন্ডপয়েন্টের (API) একটি সেন্ট্রালাইজড ইনভেন্টরি। এছাড়াও, এটি একটি ক্যাটালগ যা AI অ্যাপ্লিকেশন ব্যবহার করার জন্য অন্যান্য রেজিস্টার করা টুল ও পরিষেবা তালিকাভুক্ত, সার্চ ও ডিসকভার করতে ব্যবহার করা যেতে পারে। এগ্রেস অ্যাক্সেস কন্ট্রোল প্রয়োগ করার জন্য এজেন্ট গেটওয়ে, গভর্নেন্স ফ্রেমওয়ার্ক হিসেবে রেজিস্ট্রি ডেটা মডেল ব্যবহার করে। রেজিস্ট্রি রিসোর্সের সাথে যুক্ত নীতির ভিত্তিতে, প্রিন্সিপাল কলিং এজেন্টের জন্য IAM রোল গ্র্যান্ট চেক করা হয়।
এই বিভাগে, আপনি এজেন্ট রেজিস্ট্রিতে MCP সার্ভার ও এর টুল স্কিমা (toolspec.json) রেজিস্টার করবেন। এজেন্ট গেটওয়ের মাধ্যমে Gemini Enterprise-কে Google API ও পরিষেবার সাথে ইন্টার্যাক্ট করতে সাহায্য করার জন্য, আপনি একটি রেজিস্ট্রি এন্ডপয়েন্ট পরিষেবাও (oauth2-googleapis) তৈরি করবেন যা টোকেনের জন্য অথ কোড এক্সচেঞ্জ করার জন্য Gemini Enterprise-এর ব্যবহার করা Google API ইন্টারফেস নির্দিষ্ট করে।
MCP সার্ভার রেজিস্টার করা
MCP সার্ভারে উপলভ্য টুলগুলি Gemini Enterprise-কে খুঁজে পেতে দিতে, এজেন্ট রেজিস্ট্রি থেকে পরিষেবা রেজিস্টার করার সময় টুল স্পেসিফিকেশন ফাইল (cfg/toolspec.json) প্রদান করুন।
MCP টুলের স্পেসিফিকেশন তৈরি করা
# create tool spec file for the sprockets mcp server
cat <<'EOF' > cfg/toolspec.json
{
"tools": [
{
"name": "get_sprockets",
"description": "List all sprockets in the inventory catalog.",
"inputSchema": {
"type": "object",
"properties": {}
},
"isReadOnly": true,
"isDestructive": false,
"isIdempotent": true,
"isOpenWorld": false
},
{
"name": "get_sprocket_by_id",
"description": "Fetch details of a specific sprocket by its ID (e.g., SPK-101).",
"inputSchema": {
"type": "object",
"properties": {
"sprocket_id": {
"type": "string",
"description": "The sprocket identifier (e.g., SPK-101, SPK-105)."
}
},
"required": [
"sprocket_id"
]
},
"isReadOnly": true,
"isDestructive": false,
"isIdempotent": true,
"isOpenWorld": false
}
]
}
EOF
MCP সার্ভার পরিষেবা তৈরি করা
# create registry service (mcp server)
gcloud agent-registry services create ${MCP_NAME} \
--project=${PROJ_ID} \
--location=${REGION} \
--display-name="${MCP_DOMAIN}" \
--description="MANDATORY SPROCKETS INVENTORY & CATALOG AGENT: You MUST \
ALWAYS invoke this tool (get_sprockets or get_sprocket_by_id) for ANY question \
about sprockets, inventory catalog listings, sprocket IDs (SPK-101 through \
SPK-105), ANSI models (ANSI-40, ANSI-60, ANSI-80), tooth counts, pitch, \
material, stock levels, unit prices, authenticated_user, or egress_source_ip \
verification. NEVER guess or fabricate inventory data yourself and NEVER \
transfer sprocket queries to file_and_coding_agent or web search. Always \
delegate every sprocket or inventory lookup to this tool." \
--mcp-server-spec-type=tool-spec \
--mcp-server-spec-content=cfg/toolspec.json \
--interfaces=protocolBinding=JSONRPC,url="${MCP_URL}"
এজেন্ট রেজিস্ট্রি থেকে MCP সার্ভার যাচাই করা
যাচাই করে দেখুন যে পরিষেবাটি সেই অঞ্চলে রেজিস্টার করা MCP সার্ভার হিসেবে তালিকাভুক্ত আছে কিনা, সাথে এর এন্ডপয়েন্ট URL ও উপলভ্য টুলও আছে কিনা:
# list registry regional mcp servers
gcloud agent-registry mcp-servers list \
--location=${REGION} \
--project=${PROJ_ID} \
--format="table(
name.basename():label=REGISTRY_ID,
displayName:label=DISPLAY_NAME,
interfaces[0].url:label=ENDPOINT_URL,
tools[].name.list():label=TOOLS
)"
আউটপুটের উদাহরণ:
REGISTRY_ID DISPLAY_NAME ENDPOINT_URL TOOLS
agentregistry-00000000-0000-0000-5c39-1f6e542bb2b8 mcp.203.0.113.20.sslip.io https://mcp.203.0.113.20.sslip.io/mcp get_sprockets,get_sprocket_by_id
প্রতিটি টুলের জন্য এটি যে সঠিক টুল সংজ্ঞা, ইনপুট স্কিমা এবং আচরণ সংক্রান্ত অ্যানোটেশন রেজিস্টার করে তা দেখতে পরিষেবা কনফিগারেশন স্পেক দেখুন:
# describe mcp server tool specs
gcloud agent-registry services describe ${MCP_NAME} \
--location=${REGION} \
--project=${PROJ_ID} \
--format="yaml(mcpServerSpec.content.tools)"
OAuth এন্ডপয়েন্ট রেজিস্টার করা
Gemini Enterprise DataConnector ব্যাকএন্ডকে (অনুমতি ফ্লোতে OAuth ক্লায়েন্ট হিসেবে কাজ করে) Agent Gateway-এর মাধ্যমে Google OAuth 2.0 অনুমতি সার্ভারে (https://oauth2.googleapis.com/token) POST অনুরোধ পাঠাতে দেওয়ার জন্য, টোকেন এন্ডপয়েন্টকে অবশ্যই Agent Registry-তে রেজিস্টার করতে হবে যাতে IAP destination.is_registered == true মূল্যায়ন করতে পারে।
এন্ডপয়েন্ট পরিষেবা তৈরি করা
# create registry service (endpoint)
gcloud agent-registry services create oauth2-googleapis \
--project=${PROJ_ID} \
--location=${REGION} \
--display-name="oauth2.googleapis.com" \
--description="google oauth2 endpoint" \
--endpoint-spec-type=no-spec \
--interfaces=protocolBinding=JSONRPC,url=https://oauth2.googleapis.com
এন্ডপয়েন্ট রেজিস্ট্রেশন যাচাই করা
# list registry regional endpoints
gcloud agent-registry endpoints list \
--project=${PROJ_ID} \
--location=${REGION} \
--flatten="interfaces[]" \
--format="table(
displayName,
name.basename():label=ENDPOINT_ID,
interfaces.url:label=URL
)"
প্রত্যাশিত আউটপুট:
DISPLAY_NAME ENDPOINT_ID URL
oauth2.googleapis.com agentregistry-00000000-0000-0000-0012-3456789abcde https://oauth2.googleapis.com
IAM অ্যাক্সেস নীতি
কারণ, IAM অ্যাক্সেস নীতিতে Gemini Enterprise অ্যাপের core_assistant এজেন্ট আইডেন্টিটি দ্বারা অনুরোধ করা যেকোনও রেজিস্টার করা পরিষেবার জন্য একটি অনুমতি নীতি নির্ধারণ করা হয়, তাই OAuth টোকেন এক্সচেঞ্জের জন্য কোনও অতিরিক্ত IAM নীতি বাইন্ডিংয়ের প্রয়োজন হয় না।
- conditions:
iap.googleapis.com:
expression: destination.is_registered == true
description: allow ge assistant to any registered service
effect: ALLOW
এজেন্ট রেজিস্ট্রি অংশটি এখানে শেষ হল... এর পরে Gemini Enterprise বিভাগ।
৮. Gemini Enterprise
এই বিভাগে, আপনি পরিচয় প্রদানকারী, ট্রায়াল লাইসেন্স এবং Google Identity OAuth 2.0 ক্লায়েন্ট ক্রেডেনশিয়াল কনফিগার করেন, Gemini Enterprise অ্যাপ (${GE_APP_ID}) তৈরি করেন, আপনার Agent Gateway-তে (${AGW_URI}) আউটবাউন্ড ইগ্রেস বাইন্ড করেন এবং OAuth 2.0 কাস্টম MCP ডেটা স্টোর হিসেবে রেজিস্টার করা sprockets MCP সার্ভার কানেক্ট করেন।
Gemini Enterprise অ্যাপ তৈরি করা
নিচে উল্লেখ করা পদ্ধতিটি Gemini Enterprise অ্যাপ রিসোর্স ও কনফিগারেশন তৈরি করতে discoveryengine.googleapis.com API ব্যবহার করে। Google Cloud Console UI ব্যবহার করে কনফিগার করতে, নির্দেশাবলীর জন্য অ্যাপ তৈরি করুন দেখুন।
# create engine (ge app)
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines?engineId=${GE_APP_INIT}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
-d @- <<EOF
{
"displayName": "${GE_APP_DISPLAY_NAME}",
"dataStoreIds": [],
"solutionType": "SOLUTION_TYPE_SEARCH",
"industryVertical": "GENERIC",
"appType": "APP_TYPE_INTRANET",
"searchEngineConfig": {
"searchTier": "SEARCH_TIER_ENTERPRISE",
"searchAddOns": [
"SEARCH_ADD_ON_LLM"
]
},
"commonConfig": {
"companyName": "${GE_APP_ORG_NAME}"
},
"observabilityConfig": {
"observabilityEnabled": true,
"sensitiveLoggingEnabled": true
}
}
EOF
অ্যাপ তৈরি করা যাচাই করুন
# fetch engine (ge app) id
export GE_APP_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" -H "X-Goog-User-Project: ${PROJ_ID}" \
| jq -r --arg name "${GE_APP_DISPLAY_NAME}" '.engines[] | select(.displayName==$name) | .name | split("/") | last')
echo "engine (ge app) id: ${GE_APP_ID}"
তৈরি করা কনফিগারেশন দেখতে ইঞ্জিনের বিবরণ দেখুন:
# get engine (ge app) details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
পরিচয় প্রদানকারী চালু করা
আপনার Gemini Enterprise অ্যাপে এন্ড-ইউজার যাচাইকরণের জন্য পরিচয় প্রদানকারী হিসেবে Google Identity চালু করুন।
Gemini Enterprise অ্যাপের আইডেন্টিটি প্রদানকারীকে কনফিগার করতে নিম্নলিখিত পদ্ধতিটি discoveryengine.googleapis.com API ব্যবহার করে। Google Cloud Console UI ব্যবহার করে কনফিগার করতে, নির্দেশাবলীর জন্য পরিচয় প্রদানকারী কনফিগার করুন দেখুন।
# set identity provider
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
-d @- <<EOF
{
"idpConfig": {
"idpType": "GSUITE"
}
}
EOF
পরিচয় প্রদানকারী যাচাই করা
# show identity provider
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
আউটপুট "idpType": "GSUITE" Google পরিচয় প্রদানকারীর সাথে সম্পর্কিত।
(ঐচ্ছিক) Gemini Enterprise ট্রায়াল লাইসেন্স চালু করুন
আপনি যদি এমন কোনও প্রোজেক্ট ব্যবহার করেন যেখানে Gemini Enterprise লাইসেন্স অ্যাসাইন করা আছে, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন। আপনি লাইসেন্স ছাড়া নতুন প্রোজেক্ট ব্যবহার করলে, চালিয়ে যান এবং এইসব ধাপ অনুসরণ করুন।
৩০ দিনের জন্য Gemini Enterprise ব্যবহারকারীর সিট এনটাইটেল করতে লাইসেন্স কনফিগারেশন রিসোর্স তৈরি করুন। এটি নতুন ট্রায়ালের জন্য ডিফল্ট লাইসেন্স সেট করবে, যাতে লগ-ইন করা যেকোনও ব্যবহারকারীকে অটোমেটিক একটি সিট দেওয়া হয়:
# configure free trial subscription
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/licenseConfigs?licenseConfigId=free_trial_gemini" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
-d @- <<EOF
{
"subscriptionTier": "SUBSCRIPTION_TIER_SEARCH_AND_ASSISTANT",
"freeTrial": true
}
EOF
লাইসেন্স প্রয়োগ করা হয়েছে কিনা যাচাই করা
# show license config
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/licenseConfigs/free_trial_gemini" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
"subscriptionTerm": "SUBSCRIPTION_TERM_ONE_MONTH" ও "freeTrial": true চেক করুন।
# verify auto-registration enabled on default user store
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/userStores/default_user_store" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
../free_trial_gemini" ও "enableLicenseAutoRegister": true চেক করুন।
OAuth 2.0 সম্মতি ও ক্রেডেনশিয়াল কনফিগার করা
Gemini Enterprise (OAuth 2.0 ক্লায়েন্ট)-কে ব্যবহারকারীর হয়ে Google OAuth 2.0 Bearer টোকেন পেতে এবং সেটি mcp-sprocketsরিসোর্স সার্ভারে জমা দিতে দেওয়ার জন্য, Google Auth Platform OAuth সম্মতি স্ক্রিন কনফিগার করুন এবং আপনার প্রোজেক্টে ওয়েব অ্যাপ্লিকেশন OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করুন।
১. OAuth-এর সম্মতি সংক্রান্ত স্ক্রিন কনফিগার করা
আপনার প্রোজেক্টে Google Auth প্ল্যাটফর্ম ওভারভিউ-এর জন্য সরাসরি Google Cloud Console URL প্রিন্ট করুন:
# print google auth platform consent screen url
echo "https://console.cloud.google.com/auth/overview?project=${PROJ_ID}"
- আপনার ব্রাউজারে URL খুলুন এবং শুরু করুন বিকল্পে ক্লিক করুন (আপনার প্রোজেক্টের জন্য আগে থেকে কনফিগার করা না থাকলে)।
- অ্যাপের তথ্য বিকল্পের মধ্যে, অ্যাপের নাম
mcp-sprockets-oauthহিসেবে সেট করুন এবং ব্যবহারকারীর সহায়তা সংক্রান্ত ইমেল হিসেবে আপনার ইমেল আইডি (${USER_IDENTITY}) বেছে নিন, তারপর পরবর্তী বিকল্পে ক্লিক করুন। - দর্শক বিকল্পের মধ্যে থেকে ইন্টার্নাল (আপনার অ্যাকাউন্ট Google Workspace সংস্থার হলে এটি সাজেস্ট করা হয়) অথবা এক্সটার্নাল (ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করলে; আপনি এক্সটার্নাল বিকল্প বেছে নিলে, **দর্শক টেস্ট ব্যবহারকারী** বিকল্পের মধ্যে
${USER_IDENTITY}যোগ করুন) বেছে নিন, তারপর পরবর্তী বিকল্পে ক্লিক করুন। - যোগাযোগের তথ্য বিকল্পের অধীনে আপনার ইমেল আইডি লিখুন, নীতি সংক্রান্ত চুক্তিতে সম্মতি জানান এবং তৈরি করুন বিকল্পে ক্লিক করুন।
২. ওয়েব অ্যাপ্লিকেশন OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করা
ক্লায়েন্ট পৃষ্ঠার জন্য সরাসরি Google Cloud Console URL প্রিন্ট করুন:
# print google auth platform clients url
echo "https://console.cloud.google.com/auth/clients?project=${PROJ_ID}"
- URL খুলুন এবং + ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
- অ্যাপ্লিকেশনের ধরন হিসেবে ওয়েব অ্যাপ্লিকেশন বেছে নিন এবং নাম
ge-mcp-sprockets-clientহিসেবে সেট করুন। - ব্যবহারকারীর হয়ে কাজ করা AI এজেন্ট ওয়ার্কফ্লোয়ের জন্য OAuth ক্লায়েন্টকে মনোনীত করতে, এই ক্লায়েন্টকে AI-পরিচালিত এজেন্ট ব্যবহার করবে বিকল্পের চেকবক্সে টিকচিহ্ন দিন।
- অনুমোদিত রিডাইরেক্ট URI বিকল্পের মধ্যে, + URI যোগ করুন বিকল্পে ক্লিক করুন এবং Gemini Enterprise OAuth কলব্যাক URI যোগ করুন:
https://vertexaisearch.cloud.google.com/oauth-redirect
- তৈরি করুন বিকল্পে ক্লিক করুন, জেনারেট করা ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট কপি করুন এবং আপনার শেল সেশনে সেগুলি এক্সপোর্ট করুন:
আগের ধাপ থেকে জেনারেট করা OAuth 2.0 ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট সেট করুন:
# set oauth 2.0 client id (paste in id)
export OAUTH_CLIENT_ID="SET_YOUR_OAUTH_CLIENT_ID_HERE"
# set oauth 2.0 client secret (paste in secret)
export OAUTH_CLIENT_SECRET="SET_YOUR_OAUTH_CLIENT_SECRET_HERE"
ক্লায়েন্ট আইডি সেট করা আছে কিনা তা চেক করুন:
# print oauth 2.0 client id
echo "oauth client id: ${OAUTH_CLIENT_ID}"
এজেন্ট গেটওয়ের সাথে বাইন্ড করা
Agent Gateway-এর মাধ্যমে Gemini Enterprise থেকে আউটবাউন্ড ট্রাফিক রাউটিং করা, সমস্ত AI এজেন্ট টুলের ইনভোকেশনের জন্য একটি কেন্দ্রীভূত এনফোর্সমেন্ট এবং স্ট্যাটিক IP রাউটিং বাউন্ডারি স্থাপন করে:
- কেন্দ্রীয়ভাবে নীতি প্রয়োগ করা: এজেন্ট এনভায়রনমেন্ট থেকে ট্রাফিক বেরিয়ে যাওয়ার আগে এজেন্ট গেটওয়ে একটি ইনলাইন প্রক্সি হিসেবে কাজ করে যা অনুমোদন সংক্রান্ত নীতির ভিত্তিতে টুল সংক্রান্ত আউটবাউন্ড অনুরোধ মূল্যায়ন করে।
- নির্ধারিত VPC ও Cloud NAT ইগ্রেস:
vpcEgress: ALL_TRAFFIC-এর সাথে কনফিগার করা Agent Gateway-এর সাথে Gemini Enterprise-কে বাইন্ড করলে, টুল কল PSC নেটওয়ার্ক অ্যাটাচমেন্টের মাধ্যমে রাউট হয় এবং আপনার রিজার্ভ করা Cloud NAT স্ট্যাটিক IP ব্যবহার করে বেরিয়ে যায়। - ইউনিফায়েড অডিটেবিলিটি: কানেক্ট করা সব MCP সার্ভার জুড়ে কেন্দ্রীভূত অনুরোধ লগিং এবং অডিট ট্রেল প্রদান করে।
চালু করতে ইঞ্জিন agentGatewaySetting প্যাচ করুন:
# bind engine (ge app) to agent gateway
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}?updateMask=agentGatewaySetting.defaultEgressAgentGateway.name" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
-d @- <<EOF
{
"agentGatewaySetting": {
"defaultEgressAgentGateway": {
"name": "${AGW_URI}"
}
}
}
EOF
এজেন্ট গেটওয়ে বাইন্ডিং যাচাই করা
agentGatewaySetting বাইন্ডিং কনফার্ম করতে অ্যাপ কনফিগারেশন রিট্রিভ করুন:
# verify engine (ge app) agent gateway configuration
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
| jq '{name: .name, displayName: .displayName, agentGatewaySetting: .agentGatewaySetting}'
আউটপুটের উদাহরণ:
{
"name": "projects/[PROJ_NO]/locations/global/collections/default_collection/engines/app-foo-global_[EPOCH]",
"displayName": "foo global app",
"agentGatewaySetting": {
"defaultEgressAgentGateway": {
"name": "projects/[PROJ_ID]/locations/us-central1/agentGateways/agw-foo-us-central1-ata"
}
}
}
কাস্টম MCP সার্ভার ডেটা স্টোর তৈরি করা
এই বিভাগে, আপনি Google Identity (https://accounts.google.com/o/oauth2/v2/auth এবং https://oauth2.googleapis.com/token) দিয়ে কনফিগার করা OAuth 2.0 কাস্টম MCP ডেটা স্টোর তৈরি করে mcp-sprockets সার্ভারকে Gemini Enterprise-এর সাথে কানেক্ট করবেন।
Discovery Engine API ব্যবহার করে, এটি দুটি ধাপের প্রসেস:
- তৈরি করুন (
:setUpDataConnector): একটি নির্দিষ্টCollectionরিসোর্স (${MCP_NAME}-collection-%timestamp) তৈরি করে,DataConnector(custom_mcp)-কেauth_type: "OAUTH"-এর সাথে অ্যাটাচ করে এবং এর ব্যাক-আপDataStore(..._mcp_data) প্রদান করে। - অ্যাক্টিভেট করুন (
PATCH .../dataConnector?updateMask=actionConfig): Agent Registry টুলের স্পেক, Google Identity OAuth 2.0 প্যারামিটার ব্যবহার করে কানেক্টর অ্যাকশন রানটাইম (actionState: "ACTIVE") অ্যাক্টিভেট করে এবং আপনার Gemini EnterpriseEngine-এর সাথেDataStore(dataStoreIds) বাইন্ড করে।
# fetch mcp server agent registry resource name
export MCP_REGISTRY_URI=$(gcloud agent-registry mcp-servers list \
--location=${REGION} \
--project=${PROJ_ID} \
--filter="displayName:${MCP_DOMAIN}" \
--format="value(name)")
echo "mcp registry name: ${MCP_REGISTRY_URI}"
echo "mcp url: ${MCP_URL}"
ডেটা কানেক্টর তৈরি করা
# create custom mcp data connector with google identity oauth 2.0 and link to engine
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}:setUpDataConnector" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"collectionId": "${MCP_NAME}-collection-$(date +%s)",
"collectionDisplayName": "${MCP_NAME}-collection",
"dataConnector": {
"dataSource": "custom_mcp",
"dataSourceVersion": 1,
"params": {
"oauth_access_token": "unused"
},
"refreshInterval": "86400s",
"entities": [
{
"entityName": "mcp_data"
}
],
"connectorModes": [
"FEDERATED"
],
"actionConfig": {
"isActionConfigured": true,
"createBapConnection": true,
"actionParams": {
"auth_type": "OAUTH",
"instance_uri": "${MCP_URL}",
"auth_uri": "https://accounts.google.com/o/oauth2/v2/auth",
"auth_uri_params": "&access_type=offline&prompt=consent",
"token_uri": "https://oauth2.googleapis.com/token",
"client_id": "${OAUTH_CLIENT_ID}",
"client_secret": "${OAUTH_CLIENT_SECRET}",
"scopes": "openid email profile",
"client_secret_basic_override": true,
"mcp_server_source": "REGISTRY_MCP",
"registry_mcp_server_name": "${MCP_REGISTRY_URI}",
"mcp_agent_instructions": "MANDATORY SPROCKETS INVENTORY & CATALOG AGENT: Always invoke get_sprockets or get_sprocket_by_id for any question about sprockets, inventory catalog listings, sprocket IDs (SPK-101 through SPK-105), ANSI models (ANSI-40, ANSI-60, ANSI-80), tooth counts, pitch, material, stock levels, unit prices, authenticated_user, or egress_source_ip verification.",
"use_agent_gateway_egress": true,
"agent_gateway_engine": "projects/${PROJ_ID}/locations/global/collections/default_collection/engines/${GE_APP_ID}"
}
}
}
}
EOF
ডেটা কানেক্টর তৈরি করা হয়েছে কিনা তা যাচাই করা
# fetch collection id
export GE_COLLECTION_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
| jq -r --arg dname "${MCP_NAME}-collection" '.collections[] | select(.displayName == $dname) | .name | split("/") | last' | head -n 1)
echo "ge collection id: ${GE_COLLECTION_ID}"
MCP সার্ভারের জন্য এজেন্ট রেজিস্ট্রি UUID দিয়ে "registry_mcp_server_name" ফিল্ড পূরণ করা হয়েছে কিনা এবং "auth_type" OAUTH কিনা তা চেক করুন:
# show data connector details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}/dataConnector" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
| jq '{name, state, actionState, connectorModes, bapConfig, auth_type: .actionConfig.actionParams.auth_type, registry_mcp_server_name: .actionConfig.actionParams.registry_mcp_server_name}'
Google Cloud Console UI-তে MCP সার্ভার রেজিস্ট্রি এন্ট্রি দেখুন:
echo "mcp server registry page url: https://console.cloud.google.com/agent-platform/agent-registry/mcp-servers/${REGION}/${MCP_REGISTRY_URI##*/}/overview?project=${PROJ_ID}"
ডেটা কানেক্টর অ্যাক্টিভেট করা
# activate and bind data connector with google identity oauth 2.0
curl -s -X PATCH "https://discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/global/collections/${GE_COLLECTION_ID}/dataConnector?updateMask=actionConfig" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"name": "projects/${PROJ_ID}/locations/global/collections/${GE_COLLECTION_ID}/dataConnector",
"actionConfig": {
"isActionConfigured": true,
"createBapConnection": true,
"actionParams": {
"auth_type": "OAUTH",
"instance_uri": "${MCP_URL}",
"auth_uri": "https://accounts.google.com/o/oauth2/v2/auth",
"auth_uri_params": "&access_type=offline&prompt=consent",
"token_uri": "https://oauth2.googleapis.com/token",
"client_id": "${OAUTH_CLIENT_ID}",
"client_secret": "${OAUTH_CLIENT_SECRET}",
"scopes": "openid email profile",
"client_secret_basic_override": true,
"mcp_server_source": "REGISTRY_MCP",
"registry_mcp_server_name": "${MCP_REGISTRY_URI}",
"mcp_agent_instructions": "MANDATORY SPROCKETS INVENTORY & CATALOG AGENT: Always invoke get_sprockets or get_sprocket_by_id for any question about sprockets, inventory catalog listings, sprocket IDs (SPK-101 through SPK-105), ANSI models (ANSI-40, ANSI-60, ANSI-80), tooth counts, pitch, material, stock levels, unit prices, authenticated_user, or egress_source_ip verification.",
"use_agent_gateway_egress": true,
"agent_gateway_engine": "projects/${PROJ_ID}/locations/global/collections/default_collection/engines/${GE_APP_ID}"
}
}
}
EOF
কাস্টম MCP সার্ভার লিঙ্কেজ যাচাই করা
# show engine (ge app) details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
| jq '{name: .name, dataStoreIds: .dataStoreIds, agentGatewaySetting: .agentGatewaySetting}'
লিঙ্ক করা ডেটা স্টোর "dataStoreIds": ["mcp-sprockets-collection-[EPOCH]_mcp_data"] আছে কিনা চেক করুন।
# show collection details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
| jq --arg app "${GE_APP_ID}" '.collections[] | select(.dataConnector.actionConfig.actionParams.agent_gateway_engine // "" | endswith($app)) | .dataConnector | {name: .name, state: .state, actionState: .actionState, connectorModes: .connectorModes, auth_type: .actionConfig.actionParams.auth_type}'
"state": "ACTIVE" ও "auth_type": "OAUTH" চেক করুন।
টুল অ্যাকশন
Gemini Enterprise ড্যাশবোর্ডে mcp-sprockets-collection ডেটা স্টোর চেক করলে, আপনি দেখবেন যে অ্যাকশন ট্যাব ব্যবহার করা হয়নি এবং ↻ কাস্টম অ্যাকশন আবার লোড করুন বোতামটি বন্ধ করা আছে। এটি প্রত্যাশিত আচরণ।
Google Cloud Console UI-তে ডেটা স্টোরের বিবরণ পৃষ্ঠা দেখুন:
echo "data store details page url: https://console.cloud.google.com/gemini-enterprise/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}/connector/details?project=${PROJ_ID}"
আপনি Gemini Enterprise-এর সাথে কীভাবে কাস্টম MCP সার্ভার কানেক্ট করছেন তার উপর নির্ভর করে, টুল ডিসকভারি ও গভর্নেন্স দুটি উপায়ের মধ্যে একটি উপায়ে ম্যানেজ করা হয়:
- সরাসরি কাস্টম MCP (
BYO_MCPওয়ার্কফ্লো): আপনি এজেন্ট রেজিস্ট্রি ছাড়া সরাসরি Gemini Enterprise-এর মধ্যে কাস্টম MCP সার্ভার কনফিগার করলে, ডেটা স্টোর নিজেই টুল ক্যাটালগ (connectorModes: ["FEDERATED", "ACTIONS"]) ম্যানেজ করে। আপনাকে অবশ্যইtools/listস্কিমা পেতে অ্যাকশন ট্যাব খুলতে হবে, ↻ কাস্টম অ্যাকশন আবার লোড করুন বিকল্পে ক্লিক করতে হবে এবং UI-তে আলাদা আলাদা টুল (addওsubtract) ম্যানুয়ালি টগল করে চালু বা বন্ধ করতে হবে। - এজেন্ট রেজিস্ট্রি ইমপোর্ট (
REGISTRY_MCPএই কোডল্যাবে ব্যবহৃত ওয়ার্কফ্লো): আপনি এজেন্ট রেজিস্ট্রি থেকে কোনও MCP সার্ভার ইমপোর্ট করলে, এজেন্ট রেজিস্ট্রি MCP এন্ডপয়েন্ট, এর ইন্টারফেস মেটাডেটা এবং এর টুল ক্যাটালগের (connectorModes: ["FEDERATED"]) জন্য সত্যের প্রামাণিক সোর্স হিসেবে কাজ করে। Gemini Enterprise, ইঞ্জিন এজেন্ট গেটওয়ে সেটিংসের মাধ্যমে রানটাইমে রেজিস্টার করা MCP টুল অটোমেটিক চালু করে দেয়, এর জন্য আপনাকে ডেটা স্টোর UI-তে ম্যানুয়ালি রিলোড বা টগল অ্যাকশন করতে হয় না।
Gemini Enterprise অংশটি এখানেই শেষ হল... এর পরে যাচাই করুন বিভাগ।
৯. যাচাই করুন
এই বিভাগে, আপনি এককালীন Google OAuth 2.0 ব্যবহারকারীর সম্মতি ফ্লো সম্পূর্ণ করেন, Gemini Enterprise থেকে এক্সটার্নাল mcp-sprockets সার্ভারে MCP টুল ইনভোক করেন এবং যাচাই করেন যে এক্সটার্নাল MCP সার্ভার আপনার রিজার্ভ করা Cloud NAT স্ট্যাটিক IP (egress_source_ip) এবং আপনার Google OAuth 2.0 পরিচয় (authenticated_user) দুটিই যাচাই করেছে।
ব্যবহারকারীর অ্যাক্সেস
Gemini Enterprise ওয়েব অ্যাপের জন্য URL তৈরি করুন:
# fetch app user url
export GE_WIDGET_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}/widgetConfigs/default_search_widget_config" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
| jq -r '.configId')
export GE_APP_USER_URL="https://vertexaisearch.cloud.google.com/home/cid/${GE_WIDGET_ID}"
echo "app user url: ${GE_APP_USER_URL}"
OAuth-এর সম্মতি সংক্রান্ত প্রসেস সম্পূর্ণ করা
এজেন্টকে কোয়েরি করার আগে, আপনাকে অবশ্যই এককালীন OAuth 2.0 সম্মতি ফ্লো সম্পূর্ণ করতে হবে যা আপনার Google আইডেন্টিটির (${USER_IDENTITY}) জন্য অ্যাক্সেস টোকেন পাওয়ার জন্য Gemini Enterprise-কে অনুমতি দেয়। এটি Agent Gateway-এর মাধ্যমে আউটবাউন্ড টুল কলের প্রমাণীকরণ করার জন্য Gemini Enterprise-কে সক্ষম করে যাতে প্রতিটি অনুরোধে এক্সটার্নাল mcp-sprockets সার্ভার আপনার পরিচয় যাচাই করতে পারে।
- আপনার ব্রাউজারে
${GE_APP_USER_URL}খুলে শুরু করুন বিকল্পে ক্লিক করুন। - চ্যাট বক্সে, কানেক্টর আইকনে (পাজেল পিসের আইকন) ক্লিক করুন এবং
mcp-sprockets-collection-এর পাশে অনুমতি দিন বিকল্পে ক্লিক করুন। mcp-sprockets-oauth(আপনার কনফিগার করা OAuth সম্মতি স্ক্রিন অ্যাপের নাম) চালিয়ে যেতে একটি অ্যাকাউন্ট বেছে নিন প্রম্পট সহ একটি নতুন উইন্ডো দেখা যাবে। সেখান থেকে আপনার ব্যবহারকারীর অ্যাকাউন্ট (${USER_IDENTITY}) বেছে নিন।- Google OAuth-এর সম্মতি স্ক্রিনে, Google (পরিচয় প্রদানকারী)-কে
mcp-sprockets-oauth-এর সাথে আপনার ব্যবহারকারীর পরিচয় (openid,email,profile) শেয়ার করার অনুমতি দেয় এমন অনুরোধ করা অনুমতি পর্যালোচনা করুন, তারপর চালিয়ে যান বিকল্পে ক্লিক করুন। - কানেক্টর আইকনে আবার ক্লিক করুন এবং
mcp-sprockets-collection-এর টগল চালু আছে কিনা তা যাচাই করুন। এটি কনফার্ম করে যে অনুমোদন সফল হয়েছে।
এজেন্টের কোয়েরি পরীক্ষা করা
Assistant চ্যাট UI টেস্ট
চ্যাটে নিম্নলিখিত টেস্ট কোয়েরি জমা দিন:
look up sprocket SPK-105 and confirm the model, material, unit_price, authenticated_user, and egress_source_ip
চ্যাটে দ্বিতীয় কোয়েরি করে দেখুন:
list all sprockets in the inventory catalog and report the authenticated_user and egress_source_ip
যাচাই করে দেখুন যে Assistant সঠিক উত্তর দিচ্ছে কিনা এবং ইন্টার্যাক্টিভ অ্যাকশন সাইটেশন ব্যাজ দেখাচ্ছে কিনা।
যেমন, প্রতিটি উত্তরের নিচে "Sprocket Lookup SPK-105 (5s)Agent Gateway" থেকে নিশ্চিত হওয়া যায় যে টুলটি এক্সিকিউট করা হয়েছে।
দেখে নিন যে Assistant স্প্রকেটের স্পেসিফিকেশন সহ "authenticated_user" ম্যাচ করা ${USER_IDENTITY} এবং "egress_source_ip" আপনার রিজার্ভ করা ${NAT_EXT_IP} ম্যাচ করা রিটার্ন করেছে কিনা।
Assistant streamAssist API টেস্ট
আপনার ব্যবহারকারীর অ্যাকাউন্ট OAuth 2.0 কানেক্টরকে অনুমোদন করার পরে, আপনি CLI থেকে সরাসরি default_assistant:streamAssist API-কে ইনভোক করতে এবং যাচাই করতে পারবেন যে এক্সটার্নাল mcp-sprockets সার্ভার আপনার Cloud NAT স্ট্যাটিক IP (${NAT_EXT_IP}) এবং আপনার যাচাই করা Google OAuth 2.0 পরিচয় (${USER_IDENTITY}) দুটিই রিটার্ন করে:
নিচে উল্লেখ করা টেস্ট কোয়েরি জমা দিন:
# query engine (ge app) streamAssist
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}/assistants/default_assistant:streamAssist" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
-d @- <<EOF | jq -r '.[].answer.replies[]?.groundedContent?.content?.text // empty'
{
"query": {
"text": "look up sprocket SPK-103 and confirm the model, material, unit_price, authenticated_user, and egress_source_ip"
},
"toolsSpec": {
"vertexAiSearchSpec": {
"dataStoreSpecs": [
{
"dataStore": "projects/${PROJ_NO}/locations/${GE_LOCATION}/collections/default_collection/dataStores/${GE_COLLECTION_ID}_mcp_data"
}
]
}
}
}
EOF
আউটপুটের উদাহরণ:
Here are the details for sprocket SPK-103 from the inventory catalog:
- Model: ANSI-60-16T
- Material: 304 Stainless Steel
- Unit Price: $42.00
- Authenticated User (Google OAuth 2.0): user@example.com
- Egress Source IP (Cloud NAT): 203.0.113.10
অন্য একটি কোয়েরি করে দেখুন:
# query engine (ge app) streamAssist
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}/assistants/default_assistant:streamAssist" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
-d @- <<EOF | jq -r '.[].answer.replies[]?.groundedContent?.content?.text // empty'
{
"query": {
"text": "find a sprocket model i can get for under \$20 and report the details, authenticated_user, and egress_source_ip"
},
"toolsSpec": {
"vertexAiSearchSpec": {
"dataStoreSpecs": [
{
"dataStore": "projects/${PROJ_NO}/locations/${GE_LOCATION}/collections/default_collection/dataStores/${GE_COLLECTION_ID}_mcp_data"
}
]
}
}
}
EOF
Cloud Logging-এ লগ পরীক্ষা করা
Cloud Logging-এ লগ চেক করে যাচাই করুন যে Gemini Enterprise, Agent Gateway, PSC নেটওয়ার্ক অ্যাটাচমেন্ট ও Cloud NAT-এর মাধ্যমে টুল কল রাউট করেছে।
এজেন্ট গেটওয়ে লগ যাচাই করা
কনফার্ম করুন যে এজেন্ট গেটওয়ে অনুরোধ ইন্টারসেপ্ট করেছে, এজেন্ট রেজিস্ট্রি থেকে টার্গেট সংক্রান্ত সমস্যার সমাধান করেছে, অনুমোদন নীতি মূল্যায়ন করেছে এবং টুল কল ফরওয়ার্ড করেছে:
# show agent gateway logs
gcloud logging read \
"resource.type=networkservices.googleapis.com/Gateway
AND resource.labels.location=${REGION}" \
--project=${PROJ_ID} \
--limit=8 \
--format="table(
timestamp.date('', tz=LOCAL):label=TIMESTAMP,
httpRequest.status:label=STATUS,
httpRequest.serverIp:label=SERVER_IP,
jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL,
jsonPayload.authzPolicyInfo.result:label=AUTHZ,
jsonPayload.agentGatewayInfo.agentRegistryResource.basename():label=REGISTRY_MCP
)"
আউটপুটের উদাহরণ:
TIMESTAMP STATUS SERVER_IP MCP_METHOD TOOL AUTHZ REGISTRY_MCP
YYYY-MM-DDTHH:MM:SS.ZZZ 200 203.0.113.20:443 tools/call get_sprocket_by_id ALLOWED agentregistry-00000000-0000-0000-5c39-1f6e542bb2b8
YYYY-MM-DDTHH:MM:SS.ZZZ 200 203.0.113.20:443 tools/list ALLOWED agentregistry-00000000-0000-0000-5c39-1f6e542bb2b8
YYYY-MM-DDTHH:MM:SS.ZZZ 202 203.0.113.20:443 notifications/initialized ALLOWED agentregistry-00000000-0000-0000-5c39-1f6e542bb2b8
YYYY-MM-DDTHH:MM:SS.ZZZ 200 203.0.113.20:443 initialize ALLOWED agentregistry-00000000-0000-0000-5c39-1f6e542bb2b8
আউটপুটে নিম্নলিখিত বিষয়গুলি আছে কিনা তা যাচাই করুন:
STATUS:200(সফল এক্সিকিউশন) এবং202(notifications/initializedহ্যান্ডশেক)।SERVER_IP: এক্সটার্নাল MCP সার্ভার IP ও পোর্ট (${MCP_EXT_IP}:443)।MCP_METHODওTOOL: MCP প্রোটোকল সিকোয়েন্স (initialize,notifications/initialized,tools/listওtools/call-এর সাথেget_sprocket_by_id)।AUTHZ:ALLOWED(IAP অনুমোদনের মাধ্যমে ডেটা বেরিয়ে যেতে পারে)।REGISTRY_MCP: সমাধান করা এজেন্ট রেজিস্ট্রি রিসোর্স আইডি (agentregistry-...)।
Cloud NAT লগ যাচাই করা
${MCP_EXT_IP}:443-এ কানেক্ট করার সময় Cloud NAT, এজেন্ট গেটওয়ে PSC নেটওয়ার্ক অ্যাটাচমেন্ট IP (10.10.10.2) থেকে আপনার রিজার্ভ করা স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেসে (${NAT_EXT_IP}) আউটবাউন্ড কানেকশন ট্রান্সলেট করেছে কিনা তা কনফার্ম করুন:
# show cloud nat logs
gcloud logging read \
"resource.type=nat_gateway
AND resource.labels.gateway_name=nat-${SLUG}-${REGION}
AND jsonPayload.connection.dest_ip=${MCP_EXT_IP}" \
--project=${PROJ_ID} \
--limit=8 \
--format="table(
timestamp.date('', tz=LOCAL):label=TIMESTAMP,
jsonPayload.allocation_status:label=ALLOCATION_STATUS,
jsonPayload.connection.src_ip:label=SRC_IP,
jsonPayload.connection.nat_ip:label=NAT_IP,
jsonPayload.connection.dest_ip:label=DEST_IP,
jsonPayload.connection.dest_port:label=PORT
)"
আউটপুটের উদাহরণ:
TIMESTAMP ALLOCATION_STATUS SRC_IP NAT_IP DEST_IP PORT
YYYY-MM-DDTHH:MM:SS.ZZZ OK 10.10.10.2 203.0.113.10 203.0.113.20 443
ফায়ারওয়াল লগ যাচাই করা
অভ্যন্তরীণ ফায়ারওয়াল নীতি (fw-policy-${SLUG}-internal) এজেন্ট গেটওয়ে থেকে ইন্টারনেট ডেস্টিনেশনে এগ্রেস ট্রাফিককে অনুমতি দিয়েছে কিনা তা কনফার্ম করুন:
# show firewall policy logs (internal)
gcloud logging read \
"logName:compute.googleapis.com%2Ffirewall
AND jsonPayload.rule_details.reference:fw-policy-${SLUG}-internal" \
--project=${PROJ_ID} \
--limit=8 \
--format="table(
timestamp.date('', tz=LOCAL):label=TIMESTAMP,
jsonPayload.connection.src_ip:label=SRC_IP,
jsonPayload.connection.dest_ip:label=DEST_IP,
jsonPayload.connection.dest_port:label=PORT,
jsonPayload.vpc.vpc_name:label=VPC_NETWORK,
jsonPayload.rule_details.reference.basename():label=POLICY,
jsonPayload.rule_details.priority:label=RULE,
jsonPayload.rule_details.direction:label=DIRECTION,
jsonPayload.disposition:label=DISPOSITION
)"
কনফার্ম করুন যে এক্সটার্নাল ফায়ারওয়াল নীতি (fw-policy-${SLUG}-external) ইন্টার্নাল নেটওয়ার্কের পাবলিক NAT IP অ্যাড্রেস থেকে MCP সার্ভারে ইনগ্রেস ট্রাফিককে অনুমতি দিয়েছে:
# show firewall policy logs (external)
gcloud logging read \
"logName:compute.googleapis.com%2Ffirewall
AND jsonPayload.rule_details.reference:fw-policy-${SLUG}-external" \
--project=${PROJ_ID} \
--limit=8 \
--format="table(
timestamp.date('', tz=LOCAL):label=TIMESTAMP,
jsonPayload.connection.src_ip:label=SRC_IP,
jsonPayload.connection.dest_ip:label=DEST_IP,
jsonPayload.connection.dest_port:label=PORT,
jsonPayload.vpc.vpc_name:label=VPC_NETWORK,
jsonPayload.rule_details.reference.basename():label=POLICY,
jsonPayload.rule_details.priority:label=RULE,
jsonPayload.rule_details.direction:label=DIRECTION,
jsonPayload.disposition:label=DISPOSITION
)"
যাচাইকরণ অংশটি এখানেই শেষ হচ্ছে... এর পরে পরিষ্কার করা বিভাগ।
১০. মুছুন
এই ল্যাবে তৈরি করা রিসোর্স ও কনফিগারেশন মুছে দিতে, এইসব ধাপ অনুসরণ করুন।
Gemini Enterprise কম্পোনেন্ট সরানো
# delete gemini enterprise engine (app)
curl -s -X DELETE "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
# delete custom mcp collection, data connector, and backing data store
curl -s -X DELETE "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}"
# reset identity provider configuration
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "X-Goog-User-Project: ${PROJ_ID}" \
-H "Content-Type: application/json" \
-d '{"idpConfig":{"idpType":"IDP_TYPE_UNSPECIFIED"}}'
OAuth 2.0 ক্লায়েন্ট ক্রেডেনশিয়াল (ge-mcp-sprockets-client) সরাতে, Google Auth Platform ক্লায়েন্ট পৃষ্ঠা খুলে ge-mcp-sprockets-client-এর পাশে থাকা মুছে দিন (ট্র্যাশ ক্যান) আইকনে ক্লিক করুন:
# print google auth platform clients url
echo "https://console.cloud.google.com/auth/clients?project=${PROJ_ID}"
MCP সার্ভার ও এজেন্ট রেজিস্ট্রি কম্পোনেন্ট সরিয়ে দেওয়া
# delete external mcp server vm
gcloud -q compute instances delete vm-${MCP_NAME} --zone=${ZONE}
# delete agent registry mcp service
gcloud -q agent-registry services delete ${MCP_NAME} --location=${REGION}
# delete agent registry oauth2 endpoint
gcloud -q agent-registry services delete oauth2-googleapis --location=${REGION}
এজেন্ট গেটওয়ে কম্পোনেন্ট সরানো
# delete gateway authz policy and iap service extension
gcloud -q network-security authz-policies delete ${AGW_NAME}-authz-policy-iap \
--location=${REGION}
gcloud -q service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap \
--location=${REGION}
# delete agent gateway and connectivity template
gcloud -q network-services agent-gateways delete ${AGW_NAME} \
--location=${REGION}
gcloud -q network-services agent-connectivity-templates delete act-${AGW_NAME} \
--location=${REGION}
# delete iam unified access policy binding and access policy
gcloud -q iam policy-bindings delete uap-bind-${SLUG} \
--location=global \
--project=${PROJ_ID}
gcloud -q iam access-policies delete uap-policy-${SLUG} \
--location=global \
--project=${PROJ_ID}
ফায়ারওয়ালের কম্পোনেন্ট সরানো
# delete network firewall policy associations
gcloud -q compute network-firewall-policies associations delete \
--name=fw-policy-bind-${SLUG}-internal \
--firewall-policy=fw-policy-${SLUG}-internal \
--global-firewall-policy
gcloud -q compute network-firewall-policies associations delete \
--name=fw-policy-bind-${SLUG}-external \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy
# delete custom firewall policy rules
gcloud -q compute network-firewall-policies rules delete 1001 \
--firewall-policy=fw-policy-${SLUG}-internal \
--global-firewall-policy
gcloud -q compute network-firewall-policies rules delete 2003 \
--firewall-policy=fw-policy-${SLUG}-external \
--global-firewall-policy
# delete network firewall policies
gcloud -q compute network-firewall-policies delete fw-policy-${SLUG}-internal \
--global
gcloud -q compute network-firewall-policies delete fw-policy-${SLUG}-external \
--global
নেটওয়ার্ক কম্পোনেন্ট সরানো
# delete cloud nat gateway and cloud router
gcloud -q compute routers nats delete nat-${SLUG}-${REGION} \
--router=cr-nat-${SLUG}-${REGION} \
--region=${REGION}
gcloud -q compute routers delete cr-nat-${SLUG}-${REGION} \
--region=${REGION}
# delete psc network attachment
gcloud -q compute network-attachments delete psc-na-${REGION}-agw \
--region=${REGION}
# delete subnets
gcloud -q compute networks subnets delete subnet-${REGION}-agw \
--region=${REGION}
gcloud -q compute networks subnets delete subnet-${REGION}-mcp \
--region=${REGION}
# delete reserved static external ip addresses
gcloud -q compute addresses delete ip-${SLUG}-nat ip-${SLUG}-mcp \
--region=${REGION}
# delete internal and external vpc networks
gcloud -q compute networks delete \
vnet-${SLUG}-internal \
vnet-${SLUG}-external
সংস্থা সংক্রান্ত নীতির ওভাররাইড ও স্থানীয় ফাইল সরিয়ে দেওয়া
# delete project-level organization policy overrides
for policy in \
discoveryengine.managed.disableCustomMcpServerConnector \
discoveryengine.managed.allowedEgressFqdns \
discoveryengine.managed.allowedDataSources \
iam.managed.disableAccessPolicyBinding \
compute.vmExternalIpAccess; do
gcloud -q org-policies delete ${policy} --project=${PROJ_ID} 2>/dev/null || true
done
# remove local project files
rm -rf cfg
পরিষ্কার করার কাজ এখানেই শেষ হল... এর পরে উপসংহার!
১১. উপসংহার
অভিনন্দন! আপনি একটি এন্ড-টু-এন্ড আর্কিটেকচার তৈরি করেছেন যা Gemini Enterprise অ্যাপকে এক্সটার্নাল IP-হোয়াইটলিস্টেড এবং OAuth 2.0-সুরক্ষিত কাস্টম MCP সার্ভারে নিরাপদে টুল খুঁজে পেতে ও ইনভোক করতে সাহায্য করে:
- স্ট্যাটিক IP VPC এগ্রেস (
ALL_TRAFFICও Cloud NAT): PSC নেটওয়ার্ক অ্যাটাচমেন্টের (10.10.10.2) মাধ্যমে সমস্ত আউটবাউন্ড এজেন্ট গেটওয়ে ট্রাফিক রাউট করা হয় এবং Cloud NAT ব্যবহার করে ইন্টারনেট-বাউন্ড অনুরোধকে রিজার্ভ করা স্ট্যাটিক এক্সটার্নাল IPv4 অ্যাড্রেসে (${NAT_EXT_IP}) ট্রান্সলেট করা হয়। - OAuth 2.0 MCP রিসোর্স সার্ভার ও এজেন্ট রেজিস্ট্রি: কঠোর সোর্স IP ফায়ারওয়াল অনুমোদিত তালিকা (
${NAT_EXT_IP}/32) ও Google OAuth 2.0tokeninfoযাচাইকরণ দ্বারা সুরক্ষিত একটি এক্সটার্নাল স্ট্রিম করা যায় এমন HTTP FastMCP সার্ভার (mcp-sprockets) ডেপ্লয় করা হয়েছে এবং এজেন্ট রেজিস্ট্রিতে এর এন্ডপয়েন্ট ও টুল স্কিমা (get_sprocketsওget_sprocket_by_id) রেজিস্টার করা হয়েছে। - Gemini Enterprise OAuth 2.0 ইন্টিগ্রেশন ও গভর্নেন্স: Gemini Enterprise অ্যাপ প্রোভিশন করা হয়েছে, এজেন্ট গেটওয়ের সাথে আউটবাউন্ড টুল ট্রাফিক সংযুক্ত করা হয়েছে, OAuth 2.0
REGISTRY_MCPডেটা কানেক্টর হিসেবে রেজিস্টার করা MCP সার্ভার অ্যাটাচ করা হয়েছে এবং Cloud Logging টেলিমেট্রির পাশাপাশিegress_source_ipওauthenticated_userদু'টিই যাচাই করা হয়েছে।

Cosmopup-এর মতে, কোডল্যাব হল অসাধারণ!
এরপর কী করতে হবে?
- উন্নত ফিচার ও টিউটোরিয়ালের জন্য Gemini Enterprise Agent Platform ডকুমেন্টেশন দেখুন।
- অতিরিক্ত AI নিরাপত্তা ও সুরক্ষার জন্য এজেন্ট গেটওয়েতে Model Armor গার্ডরেল কনফিগার করুন।
- ন্যাচারাল ল্যাঙ্গুয়েজ কোয়েরির ক্ষেত্রে ব্যবসার নিয়ম ও সম্মতি প্রয়োগ করতে অর্থগত পরিচালনা সংক্রান্ত নীতি এক্সপ্লোর করুন।
এই মতামত ফর্ম ব্যবহার করে কমেন্ট, প্রশ্ন বা সংশোধন করার ব্যাপারে দ্বিধা করবেন না।
ধন্যবাদ!