এজেন্ট রানটাইম থেকে বাহ্যিক এমসিপি-তে এজেন্ট গেটওয়ের নির্গমন

১. ভূমিকা

এই কোডল্যাবটি গুগল ক্লাউডের বাইরে হোস্ট করা এক্সটার্নাল মডেল কনটেক্সট প্রোটোকল (MCP) সার্ভার অ্যাক্সেসকারী এআই এজেন্টদের জন্য এজেন্ট গেটওয়ে ইগ্রেস গভর্নেন্স অন্বেষণ করে।

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

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

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

আপনি যা তৈরি করেন

  • এজেন্ট গেটওয়ে বহির্গমন ( এজেন্ট-টু-এনিহোয়্যার ) মোডে
  • পরিচয়-সচেতন প্রক্সি (IAP) অনুমোদন এক্সটেনশন
  • এজেন্ট পরিচয় সহ এজেন্ট রানটাইম ADK এজেন্ট
  • গুগল এপিআই এবং এমসিপি এন্ডপয়েন্ট সহ এজেন্ট রেজিস্ট্রি
  • ডেটা কমন্স পাবলিক ডেটাসেটগুলিতে বাহ্যিক এমসিপি টুলের সংযোগ
  • IAM অ্যাক্সেস কন্ট্রোল সহ অনুমোদন নীতি

চিত্র ১

চিত্র ১. কোডল্যাব আর্কিটেকচার

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

  • একটি কাঠামোগত কনফিগারেশন অনুক্রমে এজেন্ট গেটওয়ে কীভাবে স্থাপন করবেন
  • অনুমোদন নীতিগুলিকে পরীক্ষামূলক পর্যায় থেকে বাধ্যতামূলক মোডে কীভাবে রূপান্তর করবেন
  • এজেন্ট রেজিস্ট্রিতে গুগল এপিআই এন্ডপয়েন্ট এবং এমসিপি সার্ভার কীভাবে নিবন্ধন করবেন
  • MCP প্রোটোকল অ্যাট্রিবিউটের উপর ভিত্তি করে শর্তসাপেক্ষ অনুমোদন নীতিগুলি কীভাবে ব্যবহার করবেন
  • বহির্গমন শাসনব্যবস্থা যাচাই করার জন্য এজেন্ট গেটওয়ে লগগুলি কীভাবে নিরীক্ষা করবেন

আপনার যা প্রয়োজন

  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
  • নেটওয়ার্কিং পরিষেবা এবং এজেন্ট প্ল্যাটফর্ম রিসোর্স সরবরাহ করার জন্য IAM অনুমতি
  • Google Cloud CLI ( gcloud এবং bq উপাদানসমূহ) ইনস্টল করা একটি POSIX-সামঞ্জস্যপূর্ণ শেল ( bash বা zsh )।
  • কমান্ড-লাইন টুলস: git , curl , jq (JSON প্রসেসর), Python 3, এবং uv (Python প্যাকেজ ম্যানেজার)
  • টেস্ট ডেটাসেট কোয়েরি করার জন্য একটি বিনামূল্যের ডেটা কমন্স এপিআই কী

২. ধারণা

মোতায়েন ক্রম

এই কোডল্যাবটি একটি সুসংগঠিত কনফিগারেশন অনুক্রম অনুসরণ করে, যার ফলে এজেন্টরা ইনিশিয়ালাইজেশনের সময় প্রয়োজনীয় রিসোর্সগুলিতে অ্যাক্সেস পায় এবং বাধ্যতামূলক অ্যাক্সেস নীতি প্রয়োগ করার আগে কানেক্টিভিটি নিশ্চিত করা যায়।

এই কোডল্যাবটি নিম্নলিখিত ডেপ্লয়মেন্ট সিকোয়েন্স ব্যবহার করে:

  1. DRY_RUN মোডে শুরু করুন : নিশ্চিত করুন যে এজেন্ট অনুরোধগুলি সফলভাবে গেটওয়েতে পৌঁছাচ্ছে এবং পাস করছে (শুধুমাত্র নিরীক্ষা মোড)।
  2. সমস্ত পরিষেবা নিবন্ধন করুন: এজেন্ট রেজিস্ট্রি-তে সমস্ত এজেন্টিক উপাদান নিবন্ধন করুন এবং এজেন্ট টুল অ্যাক্সেস নিশ্চিত করুন।
  3. অনুমোদন নীতিমালা তৈরি করুন: এজেন্ট থেকে এমসিপি সার্ভার এবং এন্ডপয়েন্টগুলিতে বহির্গমন ট্র্যাফিকের অনুমতি দেওয়ার জন্য অনুমোদন নীতিমালা তৈরি ও প্রয়োগ করুন।
  4. ENFORCED মোডে স্যুইচ করুন : নীতিমালা কার্যকর করতে এবং অননুমোদিত বহির্গমন ট্র্যাফিক ব্লক করতে অনুমোদন এক্সটেনশন নীতি আপডেট করুন।

চিত্র ২

চিত্র ২. মোতায়েন ক্রম

বহির্গমন রাউটিং টপোলজি

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

  • প্রাইভেট নেটওয়ার্ক (VPC): প্রাইভেট VPC-তে হোস্ট করা অভ্যন্তরীণ এন্টারপ্রাইজ API, মাইক্রোসার্ভিস, ডেটাবেস এবং হাইব্রিড কানেক্টিভিটির মাধ্যমে পৌঁছানো যায় এমন অন-প্রিমিসেস বা ক্রস-ক্লাউড নেটওয়ার্ককে লক্ষ্য করে পরিচালিত আউটবাউন্ড ট্র্যাফিক।
  • বাহ্যিক নেটওয়ার্ক (ইন্টারনেট): তৃতীয় পক্ষের ওয়েব পরিষেবা, SaaS API, বা পাবলিক এন্ডপয়েন্টকে লক্ষ্য করে বহির্গামী ট্র্যাফিক।
  • এআই পরিষেবা ও এজেন্ট প্ল্যাটফর্ম: পরিচালিত গুগল ক্লাউড এপিআই, ফাউন্ডেশন মডেল, গুগল এমসিপি এন্ডপয়েন্ট (যেমন বিগকোয়েরি), এবং প্ল্যাটফর্ম গভর্নেন্স পরিষেবা (এজেন্ট রেজিস্ট্রি ও আইএপি পলিসি)-কে লক্ষ্য করে আউটবাউন্ড ট্র্যাফিক।

চিত্র ৩

চিত্র ৩. এজেন্ট গেটওয়ের বহির্গমন রাউটিং টপোলজি

এই কোডল্যাবের মূল লক্ষ্য হলো এজেন্ট রানটাইমে তৈরি একটি কাস্টম এজেন্ট থেকে ইন্টারনেটের মাধ্যমে অ্যাক্সেসযোগ্য একটি বাহ্যিক তৃতীয়-পক্ষের এমসিপি সার্ভার এন্ডপয়েন্টকে লক্ষ্য করে বহির্গামী ট্র্যাফিক পরিচালনা করা।

এমসিপি প্রোটোকল পরিদর্শন

এজেন্ট গেটওয়ের বহির্গমন ( এজেন্ট-টু-এনিহোয়্যার ) এমসিপি (MCP) অনুরোধের বিষয়বস্তু পার্স করতে এবং সূক্ষ্ম প্রোটোকল অ্যাট্রিবিউটের উপর ভিত্তি করে অ্যাক্সেস পলিসি মূল্যায়ন করতে সক্ষম। এজেন্ট-টু-এমসিপি সার্ভার বহির্গমন পলিসিতে কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL)- এ প্রকাশিত শর্তাবলী অন্তর্ভুক্ত থাকতে পারে, যা রানটাইমে প্রতিটি অনুরোধের উপর প্রয়োগ করা হয়।

এমসিপি কলগুলো সাধারণত JSON-RPC ওয়্যার প্রোটোকল ফরম্যাট এবং HTTP ট্রান্সপোর্ট ব্যবহার করে। যে এমসিপি মেথডটি কল করা হচ্ছে তার বিবরণ (যেমন, tools/call ), টার্গেট টুলের নাম এবং যেকোনো আর্গুমেন্ট HTTP বডির মধ্যে থাকা JSON পেলোডে অন্তর্ভুক্ত থাকে।

অনুরোধে নির্দিষ্ট করা টুল আইডেন্টিফায়ারটি খুঁজে বের করার জন্য এজেন্ট গেটওয়ে JSON বডি পার্স করে iap.googleapis.com/mcp.toolName অ্যাট্রিবিউটটি নিষ্কাশন করে।

iap.googleapis.com/mcp.tool.isReadOnly এবং mcp.tool.isDestructive মতো অ্যাট্রিবিউটগুলো সাধারণত প্রতিটি রিকোয়েস্ট বডিতে পাঠানো হয় না। পরিবর্তে, এগুলো হলো টুলের সাথে যুক্ত অ্যানোটেশন (মেটাডেটা)। তাই যখন এজেন্ট গেটওয়ে বডি থেকে toolName টি এক্সট্র্যাক্ট করে, তখন এটি এজেন্ট রেজিস্ট্রি থেকে টুলের ডেফিনিশন এবং সংশ্লিষ্ট প্রোপার্টিগুলো খুঁজে দেখে, যেখানে toolspec.json কন্টেন্টটি রেজিস্টার করা হয়েছিল।

চিত্র ৪

চিত্র ৪. এজেন্ট গেটওয়ে এমসিপি পরিদর্শন

IAP IAM শর্তাবলীতে ব্যবহৃত CEL এক্সপ্রেশনগুলি api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE' এই স্ট্যান্ডার্ড ফরম্যাটটি ব্যবহার করে।

এই সারণিতে এজেন্ট গেটওয়ের বহির্গমন গভর্নেন্স অ্যাট্রিবিউটগুলো বর্ণনা করা হয়েছে, যা এমসিপি সার্ভার অনুরোধগুলিতে প্রয়োগ করা যেতে পারে:

বৈশিষ্ট্য

এমসিপি পদ্ধতি / অবস্থান

বর্ণনা

mcp.toolName

tools/call (দেহ)

RPC পেলোডে অনুরোধ করা টার্গেট টুল আইডেন্টিফায়ার (যেমন, "delete_instance" )

mcp.tool.isReadOnly

এজেন্ট রেজিস্ট্রি ( toolspec.json )

টুলটি পঠনযোগ্য কিনা তা নির্দেশ করে (অর্থাৎ এটি তার পরিবেশ পরিবর্তন করে না)।

mcp.tool.isDestructive

এজেন্ট রেজিস্ট্রি ( toolspec.json )

টুলটি কল করার ফলে অপরিবর্তনীয় পরিবর্তন বা ডেটা নষ্ট হওয়ার সম্ভাবনা আছে কিনা তা নির্দেশ করে।

mcp.tool.isIdempotent

এজেন্ট রেজিস্ট্রি ( toolspec.json )

একই আর্গুমেন্ট ব্যবহার করে বারবার টুল চালানোর ফলে হুবহু একই অবস্থা তৈরি হয় কিনা তা নির্দেশ করে।

mcp.tool.isOpenWorld

এজেন্ট রেজিস্ট্রি ( toolspec.json )

এটি নির্দেশ করে যে টুলটি সীমাবদ্ধ অভ্যন্তরীণ সিস্টেম ছাড়িয়ে অসীম পাবলিক ইন্টারনেট পর্যন্ত পৌঁছাতে পারে কিনা।

এর মাধ্যমেই ধারণা পর্ব শেষ হলো... এরপর সেটআপ অংশে যাওয়া যাক।

৩. সেটআপ

প্রয়োজনীয় IAM ভূমিকা

এই কোডল্যাবে রিসোর্সগুলো তৈরি করার জন্য নিম্নলিখিত ভূমিকাগুলো প্রয়োজন:

বিভাগ

প্রয়োজনীয় IAM ভূমিকা (ID)

বর্ণনা

এপিআই ব্যবস্থাপনা

roles/serviceusage.serviceUsageAdmin

গুগল ক্লাউড এপিআই পরিষেবাগুলি সক্রিয় করুন

নেটওয়ার্কিং এবং গেটওয়ে

roles/networkservices.admin

প্রোভিশন এজেন্ট গেটওয়ে

পরিষেবা সম্প্রসারণ

roles/serviceextensions.admin

রাউটিং এক্সটেনশন কনফিগার করুন

নেটওয়ার্ক নিরাপত্তা

roles/networksecurity.admin

অনুমোদন নীতিগুলি স্থাপন করুন

এজেন্ট রেজিস্ট্রি

roles/agentregistry.admin

ক্যাটালগ অনুমোদিত হোস্ট

ভার্টেক্স এআই এবং এজেন্ট

roles/aiplatform.admin

এজেন্ট রানটাইম ওয়ার্কলোড স্থাপন করুন

বহির্গমন নীতি

roles/iap.admin

roles/iap.egressor নীতি প্রয়োগ করুন

ক্লাউড স্টোরেজ

roles/storage.admin

ডেপ্লয়মেন্ট স্টেজিং বাকেটগুলি পরিচালনা করুন

লগ এবং নিরীক্ষা

roles/logging.viewer

ট্রেস এবং অডিট লগ পরিদর্শন করুন

বিকল্পভাবে, roles/admin মতো একটি ব্যাপক মৌলিক রোল অথবা roles/owner মতো লিগ্যাসি রোল ব্যবহার করুন।

আপনার প্রজেক্ট অ্যাক্সেস করুন

এই কোডল্যাবটিতে একটিমাত্র গুগল ক্লাউড প্রজেক্ট ব্যবহার করা হয়েছে। কনফিগারেশন ধাপগুলোতে gcloud CLI এবং লিনাক্স শেল কমান্ড ব্যবহার করা হয়।

আপনার গুগল ক্লাউড প্রজেক্টের কমান্ড লাইন অ্যাক্সেস করে শুরু করুন:

আপনার প্রজেক্ট আইডি সেট করুন

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 MREGION="us"
echo ${SLUG}
echo ${REGION}
echo ${MREGION}
# 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)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-datacommons"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export MCP_DISPLAY_NAME="api.datacommons.org"
export MCP_RESOURCE_NAME="${REGION}-datacommons-mcp"
export MCP_URL="https://api.datacommons.org/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${MCP_DISPLAY_NAME}
echo ${MCP_RESOURCE_NAME}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg

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

# update gcloud cli
gcloud components update

এপিআই পরিষেবাগুলি সক্ষম করুন

# enable google apis (agent platform bundle, part 1)
gcloud services enable \
  agentregistry.googleapis.com \
  aiplatform.googleapis.com \
  apphub.googleapis.com \
  apptopology.googleapis.com \
  cloudapiregistry.googleapis.com \
  cloudtrace.googleapis.com \
  compute.googleapis.com \
  dataform.googleapis.com \
  iam.googleapis.com \
  iamconnectors.googleapis.com \
  iap.googleapis.com \
  logging.googleapis.com \
  modelarmor.googleapis.com \
  monitoring.googleapis.com \
  networksecurity.googleapis.com \
  networkservices.googleapis.com \
  notebooks.googleapis.com \
  observability.googleapis.com
# enable google apis (agent platform bundle, part 2)
gcloud services enable \
  securitycenter.googleapis.com \
  saasservicemgmt.googleapis.com \
  storage.googleapis.com \
  telemetry.googleapis.com \
  texttospeech.googleapis.com

এর মাধ্যমেই সেটআপ পর্ব শেষ হলো... এরপর গেটওয়ে অংশে যাওয়া যাক।

৪. গেটওয়ে

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

এখানে এজেন্ট গেটওয়ে আঞ্চলিক এজেন্ট রানটাইম রিসোর্সসমূহকে সমর্থন করার জন্য একটি আঞ্চলিক রেজিস্ট্রি ব্যবহার করে।

গেটওয়ে তৈরি করুন

# create agent gateway config file (regional registry)
cat > cfg/${AGW_NAME}.yaml << EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
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}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION}

এর মাধ্যমেই গেটওয়ে পর্ব শেষ হলো... এরপর অনুমোদন অংশে যাওয়া যাক।

৫. অনুমোদন

আইডেন্টিটি-অ্যাওয়্যার প্রক্সি (IAP)-এর জন্য এজেন্ট গেটওয়ে অথরাইজেশন এক্সটেনশন হলো এক ধরনের সার্ভিস এক্সটেনশন, যা এজেন্ট প্ল্যাটফর্মের সমস্ত যোগাযোগের জন্য অথরাইজেশন সংক্রান্ত সিদ্ধান্ত অর্পণ করতে ব্যবহৃত হয়।

  1. ডেলিগেশন ফ্লো: যখন কোনো এজেন্ট একটি এক্সটার্নাল এন্ডপয়েন্ট বা এমসিপি সার্ভারকে কল করার চেষ্টা করে, তখন এটি অনুরোধটি এজেন্ট গেটওয়েতে পাঠিয়ে দেয়। স্থানীয়ভাবে অ্যাক্সেস মূল্যায়ন করার পরিবর্তে, গেটওয়েটি অথরাইজেশন এক্সটেনশন ব্যবহার করে আইএপি ইভ্যালুয়েশন সার্ভিসে একটি কলআউট পাঠায়। আইএপি এজেন্ট রেজিস্ট্রিতে থাকা টার্গেট রিসোর্সের আইএএম পলিসির সাথে এজেন্টের ( SPIFFE-ভিত্তিক ) আইডেন্টিটি মূল্যায়ন করে। আইএপি গেটওয়েতে একটি ALLOW বা DENY সিদ্ধান্ত ফেরত পাঠায়, যা হয় ট্র্যাফিকটি সামনে পাঠিয়ে দেয় অথবা একটি HTTP 403 Forbidden স্ট্যাটাস কোড দিয়ে ব্লক করে দেয়।
  2. প্রয়োগ মোড: DRY_RUN মোডে, IAP ট্র্যাফিক ব্লক না করেই অনুরোধগুলি মূল্যায়ন করে এবং ক্লাউড লগিং-এ সিদ্ধান্তগুলি লগ করে। ENFORCE মোডে, কোনো অননুমোদিত এজেন্ট বা অনিবন্ধিত টার্গেটের কাছে করা যেকোনো অনুরোধ অবিলম্বে ব্লক করা হয়।
  3. বাইন্ডিং লেয়ার: সার্ভিস এক্সটেনশনটি REQUEST_AUTHZ প্রোফাইল দিয়ে কনফিগার করা একটি অথরাইজেশন পলিসি ব্যবহার করে এজেন্ট গেটওয়ের সাথে সংযুক্ত থাকে।

অনুমোদন সম্প্রসারণ

অনুমোদন এক্সটেনশন তৈরি করুন

# create authz extension config file (dry run mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-dryrun
service: iap.googleapis.com
failOpen: true
timeout: 1s
metadata:
  iamEnforcementMode: "DRY_RUN"
  iapPolicyVersion: "V1"
EOF
# import authz extension file (create extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml \
  --location=${REGION}
# show authz extension details (verify extension state)
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --location=${REGION}

অনুমোদন নীতি

একটি অনুমোদন নীতি নিরাপত্তা প্রদানকারীকে (IAP) লক্ষ্য গেটওয়ে রিসোর্সের সাথে আবদ্ধ করে এবং ইন্টারসেপশন প্রোফাইল ( REQUEST_AUTHZ ) নির্দিষ্ট করে।

অনুমোদন নীতি তৈরি করুন

# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-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-dryrun"
EOF
# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}
# show authz policy details (verify dry run mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

এর মাধ্যমেই অনুমোদন পর্ব শেষ হলো... এরপর কোডবেস অংশে যাওয়া যাক।

৬. কোডবেস

এই কোডল্যাবের জন্য ব্যবহৃত এজেন্ট কোড এবং এন্ডপয়েন্ট রেজিস্ট্রেশন স্ক্রিপ্ট একটি রিমোট গুগল ক্লাউড গিটহাব রিপোজিটরিতে রক্ষণাবেক্ষণ করা হয়। নিম্নলিখিত ধাপগুলো রিপোজিটরিটি স্থানীয়ভাবে ক্লোন করবে, প্রয়োজনীয় ফাইলগুলো বর্তমান ওয়ার্কিং ডিরেক্টরি কাঠামোতে কপি করবে এবং তারপর টেম্পোরারি ফাইলগুলো পরিষ্কার করবে।

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

দূরবর্তী নিদর্শনগুলি আনুন

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_egress_emcp
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_egress_emcp/codelabs/agw-cuj-arun-egress-emcp/agent-datacommons ./agent-datacommons
cp -r temp_agw_cuj_arun_egress_emcp/codelabs/agw-cuj-arun-egress-emcp/endpoints ./endpoints
# remove temporary directory
rm -rf temp_agw_cuj_arun_egress_emcp

স্টেজিং বাকেট তৈরি করুন

# create storage bucket for agent deployment artifacts
gcloud storage buckets create gs://${STAGING_BUCKET} --location=${REGION}
# verify staging bucket url
gcloud storage buckets list --format="value(storage_url)"

এর মাধ্যমেই কোডবেস পর্ব শেষ হলো... এরপর রেজিস্ট্রি অংশে যাওয়া যাক।

৭. রেজিস্ট্রি

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

পরিবেশটি বুটস্ট্র্যাপ করতে এবং বিভিন্ন গুগল এপিআই ও পরিষেবা ব্যবহারকারী এজেন্টদের সমর্থন করার জন্য, endpoints/googleapis.txt থেকে হোস্টনেম ও লোকেশন ব্যবহার করে এক সেট সাধারণ এপিআই এন্ডপয়েন্ট দ্রুত রেজিস্টার করতে একটি স্ক্রিপ্ট ব্যবহৃত হয়।

এন্ডপয়েন্ট নিবন্ধন করুন

# run python script to register google api endpoints
python3 endpoints/register_endpoints.py \
  --multi-region=${MREGION} \
  --region=${REGION} \
  --mtls-endpoints=include

এন্ডপয়েন্টগুলি যাচাই করুন

# list registry regional endpoints (verify registration)
gcloud agent-registry endpoints list --location=${REGION} \
  --format="table(displayName, name.basename():label=ENDPOINT_ID, interfaces[0].url:label=URL)"

এর মাধ্যমেই রেজিস্ট্রি পর্ব শেষ হলো... এরপর ডেটা কমন্স অংশে যাওয়া যাক।

৮. ডেটা কমন্স

ডেটা কমন্স হলো সর্বজনীন ডেটা সেটগুলোকে সংগঠিত করা এবং সেগুলোকে সকলের জন্য সহজলভ্য ও প্রবেশযোগ্য করে তোলার জন্য গুগলের একটি উদ্যোগ। এটি একটি বিনামূল্যের পরিষেবা এবং একটি অ্যাকাউন্ট তৈরি করার পর এপিআই কী (API key) ব্যবহার করে এটি অ্যাক্সেস করা যায়।

এপিআই কী তৈরি করুন

অ্যাকাউন্ট তৈরি করার পর, একটি API কী পেতে এই ধাপগুলো অনুসরণ করুন:

  • ডেটা কমন্স এপিআই পোর্টালে সাইন ইন করুন
  • উপরের ডান কোণায় থাকা " আমার অ্যাপস " বোতামটিতে ক্লিক করুন।
  • আপনার ইউজারনেমের নিচে, উপরের ডান কোণায় থাকা " + নতুন অ্যাপ " বোতামটিতে ক্লিক করুন।
  • আপনার অ্যাপটির একটি নাম দিন (যেমন "কোডল্যাব এজেন্ট এমসিপি")
  • ডেটা কমন্স এপিআই api.datacommons.org -এর জন্য " ENABLE " বোতামটি ক্লিক করুন।
  • নিচের ডান কোণায় থাকা ' SAVE ' বোতামটি ক্লিক করুন।

এটি একটি এপিআই কী এবং সিক্রেট তৈরি করে। এপিআই কী কপি করতে কী ভ্যালুর পাশের 'কপি' আইকনে ক্লিক করুন। DC_API_KEY এনভায়রনমেন্ট ভেরিয়েবল সেট করতে টার্মিনাল কমান্ডে ভ্যালুটি পেস্ট করুন।

# set api key env var
 export DC_API_KEY="YOUR_API_KEY_HERE"

এমসিপি সার্ভার toolspec তৈরি করুন

ম্যানুয়ালি একটি এমসিপি সার্ভার রেজিস্টার করার সময়, রেজিস্ট্রেশনকালে একটি টুল স্পেসিফিকেশন ফাইল অবশ্যই অন্তর্ভুক্ত করতে হবে। toolspec.json ফাইলটি আপলোড করলে এন্ডপয়েন্টটির মাধ্যমে উপলব্ধ সমস্ত টুলের একটি তালিকা পাওয়া যায় এবং অন্যান্য ব্যবহারকারীরা সেগুলি খুঁজে পেতে পারে।

agent-datacommons/ কোডবেসে অন্তর্ভুক্ত test_mcp.py স্ক্রিপ্টটি, টার্গেট MCP সার্ভারের সাথে (SSE বা HTTP-এর মাধ্যমে) সংযোগ স্থাপন করে একটি toolspec.json ফাইল তৈরি করে এবং সার্ভার দ্বারা উন্মুক্ত করা সমস্ত উপলব্ধ টুল পুনরুদ্ধার করার জন্য list_tools() কল করে।

# generate toolspec for registry ingestion
uv --directory agent-datacommons run python3 test_mcp.py --toolspec=include --token="${DC_API_KEY}"

তৈরি হওয়া toolspec আউটপুটটি দেখলে এমসিপি অ্যাট্রিবিউটগুলো দেখা যায়, যা এজেন্ট গেটওয়ে বহির্গমন নীতি মূল্যায়ন ও প্রয়োগের জন্য ব্যবহার করতে পারে।

# show toolspec mcp attributes
jq '.tools[] | {name, isReadOnly, isDestructive, isIdempotent, isOpenWorld}' agent-datacommons/toolspec.json

এমসিপি সার্ভার নিবন্ধন করুন

# register mcp server
gcloud agent-registry services create ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --display-name="${MCP_DISPLAY_NAME}" \
  --description="mcp server for data commons" \
  --mcp-server-spec-type=tool-spec \
  --mcp-server-spec-content=agent-datacommons/toolspec.json \
  --interfaces=url=${MCP_URL},protocolBinding=JSONRPC
# list registry regional mcp servers
gcloud agent-registry mcp-servers list --location=${REGION} --format="table(displayName, interfaces.url)"
# show mcp server registry details
gcloud agent-registry services describe ${MCP_RESOURCE_NAME} --location=${REGION}
# fetch mcp server registry id
export MCP_REGISTRY_ID=$(gcloud agent-registry services describe ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --format="value(registryResource.basename())")
echo ${MCP_REGISTRY_ID}

এর মাধ্যমেই ডেটা কমন্স পর্ব শেষ হলো... এরপর রানটাইম অংশে যাওয়া যাক।

৯. রানটাইম

এজেন্ট প্ল্যাটফর্মের সাথে ইন্টিগ্রেট করার জন্য, এজেন্ট রানটাইমে ডেপ্লয় করা agent-datacommons ADK এজেন্টটিকে ডেপ্লয়মেন্ট স্ক্রিপ্টে নিম্নলিখিত সেটিংস দিয়ে কনফিগার করা হয়েছে:

  • "identity_type": types.IdentityType.AGENT_IDENTITY এজেন্টের জন্য একটি অনন্য SPIFFE-ভিত্তিক প্রিন্সিপাল আইডেন্টিটি প্রদান করতে ব্যবহৃত হয়।
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } পলিসি মূল্যায়ন এবং প্রয়োগের জন্য এজেন্ট-প্রবর্তিত সমস্ত বহির্গামী ট্র্যাফিক এজেন্ট গেটওয়েতে নির্দেশ করতে।

এজেন্ট মোতায়েন করুন

# deploy agent runtime workload
uv --directory agent-datacommons run python3 deploy_agent.py \
  --project=${PROJ_ID} \
  --region=${REGION} \
  --src-dir=./agent \
  --staging-bucket=${STAGING_BUCKET} \
  --display-name="${RE_AGENT_NAME}" \
  --description="agent for data commons stats" \
  --enable-telemetry \
  --enable-agent-identity \
  --agent-gateway-egress=${AGW_URI} \
  --env-var="DC_API_KEY=${DC_API_KEY}"

মোতায়েনের গুরুত্বপূর্ণ তথ্য আনুন

# fetch agent runtime resource (reasoning engine) id
export RE_ENGINE_ID=$(curl -s -X GET \
  "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" | \
  jq -r --arg name "${RE_AGENT_NAME}" '.reasoningEngines[] | select(.displayName==$name) | .name | split("/") | last')
echo ${RE_ENGINE_ID}
# fetch agent runtime (reasoning engine) agent identity
export RE_AGENT_IDENTITY=$(gcloud agent-registry agents list \
  --location=${REGION} --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(attributes.'agentregistry.googleapis.com/system/RuntimeIdentity'.principal)")
echo ${RE_AGENT_IDENTITY}
# fetch agent registry uid for agent
export RE_AGENT_REGISTRY_ID=$(gcloud agent-registry agents list \
  --location=${REGION} \
  --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(uid)")
echo ${RE_AGENT_REGISTRY_ID}

রেজিস্ট্রি এন্ট্রি যাচাই করুন

# show agent resource registry details
gcloud agent-registry agents describe ${RE_AGENT_REGISTRY_ID} --location=${REGION}

১০. নীতিমালা

এজেন্ট গভর্নেন্স অনুমোদন নীতিগুলি একটি এআই এজেন্ট থেকে এজেন্ট গেটওয়ের মাধ্যমে গন্তব্যে (যেমন, একটি SaaS অ্যাপ্লিকেশনের জন্য তৃতীয় পক্ষের MCP সার্ভার এন্ডপয়েন্ট) ট্র্যাফিক যাওয়ার অনুমতি দেয়। ট্র্যাফিক গন্তব্যে পৌঁছানোর পর, সাধারণ পরিষেবা-স্তর বা অ্যাপ্লিকেশন-স্তরের অনুমতিগুলি ডেটা অ্যাক্সেসের অনুমোদন দেয়।

এজেন্ট গেটওয়ে ইগ্রেসের জন্য আইএএম রোল গ্রান্ট এমন অ্যাক্সেস পলিসি সক্ষম করে, যা এজেন্ট প্রিন্সিপাল আইডেন্টিটিকে এজেন্ট গেটওয়ের মাধ্যমে নিবন্ধিত গন্তব্য রিসোর্সগুলিতে অ্যাক্সেস করার অনুমতি দেয়। পলিসিগুলি এজেন্ট গেটওয়ে স্তরে প্রয়োগ করা হয় এবং আইডেন্টিটি-অ্যাওয়্যার প্রক্সি (আইএপি) আইএএম পলিসি ব্যবহার করে যাচাই করা হয়।

এজেন্ট গেটওয়ে বহির্গমনের জন্য এজেন্ট IAM ভূমিকা মঞ্জুর করুন

এজেন্ট গেটওয়ে আগত অনুরোধগুলি যাচাই করে নিশ্চিত করে যে কলিং এজেন্ট আইডেন্টিটির টার্গেট রিসোর্সের উপর iap.webServiceVersions.egressViaIAP পারমিশন (যা roles/iap.egressor রোল দ্বারা প্রদত্ত) আছে।

নির্বাচিত গন্তব্য রিসোর্সে সেট করা এজেন্ট আইডেন্টিটি বা এজেন্ট রানটাইম প্রিন্সিপালকে roles/iap.egressor প্রদান করলে এই বহির্গামী ট্র্যাফিকের অনুমতি দেওয়া হয়। এই কোডল্যাবে, রোলটি প্রিন্সিপাল এজেন্টের উপর প্রয়োগ করা হয়েছে, যা নির্দিষ্ট এজেন্ট রানটাইম এজেন্ট আইডেন্টিটিকে অনুমতি প্রদান করে।

এজেন্ট রেজিস্ট্রি ডেটা মডেলে সংজ্ঞায়িত গন্তব্য রিসোর্সগুলোর সাথে IAM পলিসিগুলো আবদ্ধ থাকে। iap_web/agentRegistry রিসোর্সটি IAM হায়ারার্কিতে একটি " রেজিস্ট্রি-ব্যাপী " স্তরকে প্রতিনিধিত্ব করে। যেখানে agentRegistry agents , mcpServers , এবং endpoints মতো স্বতন্ত্র চাইল্ড রিসোর্সগুলোর প্যারেন্ট হিসেবে কাজ করে। এই কোডল্যাবে, IAM পলিসিটি mcpServer এবং endpoint স্তরের সাথে আবদ্ধ করা হয়েছে, যা নির্দিষ্ট চাইল্ড রিসোর্সগুলোতে অনুমতি প্রয়োগ করে।

শর্তসাপেক্ষ এমসিপি ফিল্টারিং সম্পর্কে

ডেটা কমন্স এমসিপি সার্ভারে দুটি টুল রয়েছে:

  • search_indicators : কী ডেটা উপলব্ধ আছে তা আবিষ্কার করা, ভেরিয়েবল খোঁজা, বা ডেটা কভারেজ বোঝার জন্য কোয়েরি করার উদ্দেশ্যে।
  • get_observations : নির্দিষ্ট ডেটা পয়েন্ট বা টাইম সিরিজ পুনরুদ্ধার করার জন্য ব্যবহৃত কোয়েরিগুলোর জন্য

MCP সার্ভারগুলিতে শর্তসাপেক্ষ গভর্নেন্স পলিসি কনফিগার করার সময় কিছু স্ট্যান্ডার্ড MCP অপারেশন সম্পর্কে সচেতন থাকতে হবে। একটি MCP ক্লায়েন্ট search_indicators বা get_observations এর জন্য tools/call করার আগে, তাকে প্রথমে প্রোটোকল হ্যান্ডশেক এবং ডিসকভারি রিকোয়েস্ট পাঠাতে হবে:

  • initialize
  • notifications/initialized
  • tools/list

শর্তসাপেক্ষ পলিসি ফিল্টারিং প্রদর্শনের জন্য, পলিসিটি নিম্নলিখিত শর্তগুলোর জন্য কনফিগার করা হবে:

সারণি। এমসিপি অনুরোধের জন্য নীতি মূল্যায়ন।

অনুরোধ / পদ্ধতি

mcp.toolName মান

সিইএল মূল্যায়ন

ফলাফল

initialize

""

"" in ['search_indicators', '']

✅ অনুমোদিত (200)

tools/list

""

"" in ['search_indicators', '']

✅ অনুমোদিত (200)

search_indicators

"search_indicators"

"search_indicators" in [...]

✅ অনুমোদিত (200)

get_observations

"get_observations"

"get_observations" in [...]

❌ প্রত্যাখ্যাত (403)

প্রোটোকল হ্যান্ডশেক এবং search_indicators টুল কলকে অনুমতি দেওয়ার জন্য, শর্তসাপেক্ষ পলিসি নিয়মে "search_indicators" অথবা খালি স্ট্রিং "" এর জন্য একটি allow অন্তর্ভুক্ত থাকে।

রেজিস্ট্রি IAP MCP সার্ভার IAM নীতি কনফিগার করুন

# show iap iam policy for mcp server
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

দ্রষ্টব্য: যেহেতু এখনও কোনো নীতি সংজ্ঞায়িত করা হয়নি, তাই etag: ডিফল্ট ACAB রিটার্ন করা উচিত।

# fetch active etag on policy for mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy \
  --resource-type=agent-registry --region=${REGION} \
  --mcp-server=${MCP_REGISTRY_ID} --format="value(etag)")
echo ${IAP_ETAG}
# create policy config file
cat > cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ],
      "condition": {
        "title": "allow ${RE_AGENT_NAME} to use search_indicators tool for ${MCP_DISPLAY_NAME}",
        "expression": "api.getAttribute('iap.googleapis.com/mcp.toolName', '') in ['search_indicators', '']"
      }
    }
  ],
  "etag": "${IAP_ETAG}",
  "version": 3
}
EOF
# import policy file (bind iam policy)
gcloud beta iap web set-iam-policy cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for mcp server
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

এর মাধ্যমেই নীতিমালা পর্ব শেষ হলো... এরপর নিরীক্ষা অংশে যাওয়া যাক।

১১. নিরীক্ষা

এজেন্ট গেটওয়ে অনুমোদন এক্সটেনশনটি DRY_RUN মোডে কাজ করছে। বহির্গামী অনুরোধগুলো পর্যবেক্ষণ ও লগ করা হচ্ছে, কিন্তু ব্লক করা হচ্ছে না।

টেস্ট এজেন্ট কোয়েরি

একটি ব্রাউজার উইন্ডো খুলে গুগল ক্লাউড কনসোল UI-তে যান এবং এখানে নেভিগেট করুন:

  • এজেন্ট প্ল্যাটফর্ম → এজেন্ট → ডেপ্লয়মেন্ট → agent-datacommons
  • প্লেগ্রাউন্ড ট্যাবটি নির্বাচন করুন

অথবা এই টার্মিনাল কমান্ডটি ইকো করুন এবং এজেন্ট প্লেগ্রাউন্ডে যেতে লিঙ্কে ক্লিক করুন:

# playground
echo "https://console.cloud.google.com/agent-platform/runtimes/locations/${REGION}/agent-engines/${RE_ENGINE_ID}/playground?project=${PROJ_ID}"

কিছু পরীক্ষামূলক কোয়েরি জমা দিন...

  • What data do you have on water quality in Zimbabwe?
  • Compare the life expectancy, economic inequality, and GDP growth for BRICS nations

কোয়েরিগুলো বৈধ প্রতিক্রিয়া প্রদান করে কিনা তা যাচাই করুন।

অডিট লগ বিশ্লেষণ করুন

লগগুলো দেখুন এবং পরীক্ষামূলক নীতি মূল্যায়নগুলো খতিয়ে দেখুন।

# list unique urls with http status and iap authorization result
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=200 \
  --format="value(httpRequest.status, jsonPayload.authzPolicyInfo.result, httpRequest.requestUrl)" | sort -u
200     ALLOWED https://api.datacommons.org/mcp
200     ALLOWED https://cloudresourcemanager.googleapis.com:443/google.cloud.resourcemanager.v3.Projects/GetProject
200     ALLOWED https://telemetry.googleapis.com/v1/traces
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}/events
202     ALLOWED https://api.datacommons.org/mcp

রেজিস্ট্রি IAP এন্ডপয়েন্ট IAM নীতি আপডেট করুন

টেলিমেট্রি এন্ডপয়েন্টের জন্য এজেন্টকে বহির্গমনের অনুমতি দিন।

# set var for endpoint display name
export ENDPOINT_1_DISPLAY_NAME="telemetry.googleapis.com"
echo ${ENDPOINT_1_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_1_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_1_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_1_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-1.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-1.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for telemetry endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID}

এআইপ্ল্যাটফর্ম এন্ডপয়েন্টের জন্য এজেন্টকে বহির্গমনের অনুমতি দিন

# set var for endpoint display name
export ENDPOINT_2_DISPLAY_NAME="${REGION}-aiplatform.googleapis.com"
echo ${ENDPOINT_2_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_2_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_2_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_2_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-2.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-2.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for aiplatform endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID}

ক্লাউড রিসোর্স ম্যানেজার এন্ডপয়েন্টের জন্য এজেন্টকে বহির্গমন অনুমতি প্রদান করুন।

# set var for endpoint display name
export ENDPOINT_3_DISPLAY_NAME="cloudresourcemanager.googleapis.com"
echo ${ENDPOINT_3_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_3_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_3_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_3_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-3.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-3.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for cloudresourcemanager endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID}

এর মাধ্যমেই নিরীক্ষা পর্ব শেষ হলো... এরপর আমরা প্রয়োগ (Enforce) অংশে যাব।

১২. বলবৎ করুন

এজেন্টটি DRY_RUN মোডে গেটওয়ের মাধ্যমে সফলভাবে অনুরোধ করতে সক্ষম হয়েছিল। অনুমোদন নীতি আপডেট করে এজেন্ট গেটওয়ে IAP অনুমোদন এক্সটেনশনটিকে ENFORCE মোডে পরিবর্তন করুন।

অনুমোদন এক্সটেনশন আপডেট করুন

# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-enforced.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-enforced
service: iap.googleapis.com
failOpen: false
timeout: 1s
metadata:
  iapPolicyVersion: "V1"
EOF
# import authz extension file (create extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap-enforced \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap-enforced.yaml \
  --location=${REGION}
# list authz extensions (imported configs)
gcloud service-extensions authz-extensions list --location=${REGION}

অনুমোদন নীতি আপডেট করুন

# re-write authz policy config file (pointing to enforced authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-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-enforced"
EOF
# import authz policy config file (enable new authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}
# show authz policy details (verify enforced mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

শর্তসাপেক্ষ অনুমতি যাচাই করুন

কনসোল UI-তে এজেন্ট প্লেগ্রাউন্ডে ফিরে যান।

একটি অতিরিক্ত পরীক্ষামূলক কোয়েরি জমা দিন ( অনুমোদিত search_indicators টুলটি চালু করার চেষ্টা করুন)...

  • What data topics do you have for Peru?

লক্ষ্য করুন যে জেমিনি ফাউন্ডেশন মডেল ( ${REGION}-aiplatform.googleapis.com/... ), টেলিমেট্রি এপিআই ( telemetry.googleapis.com/... ), এবং ডেটা কমন্স এমসিপি সার্ভার এন্ডপয়েন্ট ( api.datacommons.org/mcp )-এ পাঠানো এজেন্ট অনুরোধগুলো HTTP 200 OK স্ট্যাটাস কোড সহ প্রেরণ করা হচ্ছে।

# show gateway logs for http requests
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    httpRequest.requestUrl:label=URL)"

কোনো অনুরোধ ব্লক করা হচ্ছে কিনা তা পরীক্ষা করুন। গেটওয়ের অডিট লগে HTTP 403 Forbidden স্ট্যাটাস কোডসহ বহির্গমনের কোনো প্রত্যাখ্যাত প্রচেষ্টা আছে কিনা তা সন্ধান করুন।

# show gateway logs for authz denies
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND (jsonPayload.authzPolicyInfo.result=\"DENIED\" OR httpRequest.status=403)" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.enforcedGatewaySecurityPolicy.serverNameIndication:label=SNI,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ_RESULT,
    jsonPayload.authzPolicyInfo.policies[0].name.basename():label=DENYING_POLICY
  )"
# show gateway logs for mcp requests with method and tool name
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
    httpRequest.requestUrl:label=URL
  )"

শর্তসাপেক্ষ অস্বীকৃতি যাচাই করুন

একটি অতিরিক্ত পরীক্ষামূলক কোয়েরি জমা দিন ( প্রত্যাখ্যাত get_observations টুলটি চালু করার চেষ্টা করুন)...

  • What are the diabetes levels in Peru compared to Slovakia?

এজেন্ট প্রথমে search_indicators দেখবে এবং তারপর get_observations ব্যবহার করার চেষ্টা করবে, কিন্তু ব্যর্থ হবে এবং এজেন্টের প্রতিক্রিয়া অসম্পূর্ণ থেকে যাবে।

# show gateway logs for mcp requests with method and tool name
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
    httpRequest.requestUrl:label=URL
  )"
TIMESTAMP            STATUS  IAP_AUTHZ  MCP_METHOD                 TOOL_NAME          URL
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS          ALLOWED    tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/call                 search_indicators  https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/list                                    https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  202     ALLOWED    notifications/initialized                     https://api.datacommons.org/mcp

এটি প্রমাণ করে যে শাসন নীতিটি প্রত্যাশা অনুযায়ী কাজ করছে!

উল্লেখ্য যে, ফাঁকা স্ট্যাটাস এবং ALLOWED নির্দেশকারী দ্বিতীয় সারিটি হলো একটি সেকেন্ডারি কানেকশন টিয়ার-ডাউন লগ ইভেন্ট, যা এজেন্ট গেটওয়ে 403 রেসপন্স পাঠানোর পর সকেট বন্ধ করার সময় নির্গত করে (যেহেতু কানেকশন-ক্লোজ ইভেন্টগুলোর কোনো রেসপন্স স্ট্যাটাস কোড থাকে না, তাই httpRequest.status ফাঁকা থাকে)।

এর মাধ্যমেই প্রয়োগ পর্ব শেষ হলো... এরপর পরিচ্ছন্নতা পর্বে যাওয়া যাক।

১৩. পরিচ্ছন্নতা

# delete agent
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"

# next
# delete storage bucket
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}

# next
# clear policy on mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --mcp-server=${MCP_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 1
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_1_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 2
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_2_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 3
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_3_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID} \
  --region=${REGION}

# next
# remove manual registry entry
gcloud -q agent-registry services delete ${MCP_RESOURCE_NAME} --location=${REGION}
# delete gateway resources
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-profile-iap --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-dryrun --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-enforced --location=${REGION}

gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION}

# next
# clean up local working directories and generated configs
rm -rf cfg agent-datacommons endpoints

# end

এর মাধ্যমেই পরিচ্ছন্নতা পর্ব শেষ হলো... এরপর আসা যাক উপসংহারে !

১৪. উপসংহার

অভিনন্দন! আপনি এজেন্ট গেটওয়ে ব্যবহার করে টুলস অ্যাক্সেসকারী একজন এজেন্টের জন্য বহির্গামী যোগাযোগ সফলভাবে স্থাপন ও পরিচালনা করেছেন!

কসমোপাপ

কসমোপাপের মতে কোডল্যাবস অসাধারণ!

এরপর কী?

এই ফিডব্যাক ফর্মটি ব্যবহার করে যেকোনো মন্তব্য, প্রশ্ন বা সংশোধন জানাতে পারেন।

ধন্যবাদ!