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

১. ভূমিকা

এন্টারপ্রাইজ সংস্থাগুলি জেনারেটিভ AI গ্রহণ করার সাথে সাথে, আর্কিটেকচারগুলি দ্রুত স্ট্যান্ডঅ্যালোন, মনোলিথিক চ্যাটবট থেকে ডিস্ট্রিবিউটেড মাল্টি-এজেন্ট সিস্টেমে (এজেন্ট-টু-এজেন্ট / A2A) রূপান্তরিত হচ্ছে। এইসব আধুনিক টপোলজিতে, হাই-লেভেল অর্কেস্ট্রেটর এজেন্টরা জটিল বিজনেস ওয়ার্কফ্লো কোঅর্ডিনেট করে। এর জন্য তারা স্বাধীন Google Cloud প্রোজেক্ট জুড়ে বিশেষ ডোমেন ওয়ার্কার এজেন্ট, Model Context Protocol (MCP) টুল সার্ভার এবং ব্যাকএন্ড এন্টারপ্রাইজ ডেটাবেসে টাস্ক ডেলিগেট করে।

তবে, মাল্টি-এজেন্ট সিস্টেমকে স্কেল অনুযায়ী অপারেট করার সময় নিরাপত্তা, গভর্ন্যান্স ও অপারেশন সংক্রান্ত গুরুতর চ্যালেঞ্জের সম্মুখীন হতে হয়:

  • শ্যাডো এজেন্ট ও টুল স্প্রল: ডেভেলপমেন্ট টিম যখন সেন্ট্রালাইজড ক্যাটালগ ছাড়াই বিচ্ছিন্ন প্রোজেক্টে এজেন্ট ডিপ্লয় করে, তখন কোন টুল ও সাবএজেন্ট আছে তা সংস্থাগুলি দেখতে পায় না।
  • মনিটর না করা ক্রস-প্রোজেক্ট ইগ্রেস: এজেন্টদের সরাসরি, পরীক্ষা না করা নেটওয়ার্ক রুট ব্যবহারের অনুমতি দিলে ডেটা এক্সফিল্ট্রেশনের ঝুঁকি তৈরি হয় এবং নিরাপত্তা সংক্রান্ত পরিধি বাইপাস হয়ে যায়।
  • ফ্র্যাজাইল হার্ডকোডেড ইন্টিগ্রেশন: ডাউনস্ট্রিম এজেন্ট URL এবং রিজনিং ইঞ্জিন আইডি হার্ডকোড করলে ভঙ্গুর ডিপেন্ডেন্সি তৈরি হয় যা আপগ্রেড বা রিডিপ্লয়মেন্টের সময় ভেঙে যায়।
  • ন্যূনতম-সুবিধা পরিচয়ের অভাব: শেয়ার করা পরিষেবা অ্যাকাউন্টগুলি স্বতন্ত্র এজেন্ট ইনস্ট্যান্স লেভেলে ক্রিপ্টোগ্রাফিক নন-রিপুডিয়েশন প্রদান করতে ব্যর্থ হয়।

এইসব চ্যালেঞ্জের সমাধান করতে, Gemini Enterprise Agent Platform একটি ইউনিফায়েড গভর্নেন্স ও কানেক্টিভিটি কন্ট্রোল প্লেন প্রদান করে যা চারটি মূল স্তম্ভ নিয়ে গঠিত:

  1. এজেন্ট গেটওয়ে (networkservices.googleapis.com): একটি ম্যানেজ করা, আঞ্চলিক নেটওয়ার্ক এবং নীতি এনফোর্সমেন্ট প্রক্সি। AGENT_TO_ANYWHERE ইগ্রেস মোডে কাজ করার সময়, এটি আউটবাউন্ড এজেন্ট ট্রাফিক ইন্টারসেপ্ট করে, নিরাপত্তা এক্সটেনশনে অনুমোদনের মূল্যায়ন ডেলিগেট করে এবং প্রোজেক্টের সীমানা জুড়ে অনুরোধ রুট করে।
  2. এজেন্ট রেজিস্ট্রি (agentregistry.googleapis.com): সিঙ্গেল এন্টারপ্রাইজ সার্ভিস ক্যাটালগ। এটি সংস্থা জুড়ে উপলভ্য সব টুল, MCP সার্ভার ও পিয়ার এজেন্টের একটি সেন্ট্রালাইজড, যাচাই করা ডিরেক্টরি প্রদান করে, যার ফলে কোনও হার্ডকোড করা এন্ডপয়েন্ট ছাড়াই ডায়নামিক রানটাইম অটোডিসকভারি করা সম্ভব হয়।
  3. এজেন্ট আইডেন্টিটি ও IAP v2 গভর্নেন্স (iap.googleapis.com ও iam.googleapis.com): একটি ক্রিপ্টোগ্রাফিক আইডেন্টিটি ও অ্যাক্সেস ফ্রেমওয়ার্ক। এক্সিকিউটিং এজেন্ট অনন্য, অ্যাটেস্ট করা SPIFFE মেশিন URN (principal://...) পায়। আউটবাউন্ড ইগ্রেস সেন্ট্রালাইজড IAM ইউনিফায়েড অ্যাক্সেস পলিসি (UAP / IAP v2)-এর সাথে তুলনা করে মূল্যায়ন করা হয়, যা রিচ কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) ক্যাটালগ কন্ডিশন (destination.agent_registry.*) ব্যবহার করে ইউনিভার্সাল অনুমতি iap.googleapis.com/resources.egressViaIAP যাচাই করে।
  4. এজেন্ট রানটাইম (রিজনিং ইঞ্জিন): Python-ভিত্তিক এজেন্টিক অ্যাপ্লিকেশনের জন্য সম্পূর্ণভাবে ম্যানেজ করা, সার্ভারলেস এক্সিকিউশন প্ল্যাটফর্ম, যাতে সেন্ট্রাল গেটওয়ের সাথে নেটিভ কনফিগারেশন বাইন্ডিং (agent_gateway_config) ফিচার রয়েছে।

কোডল্যাব বিজনেস সিনারিও: মাল্টি-প্রোজেক্ট ফুড ও বেভারেজ কেনাকাটা

এই কোডল্যাবে, আপনি তিনটি স্বতন্ত্র Google Cloud প্রোজেক্ট জুড়ে একটি বাস্তব-জগতের মাল্টি-প্রোজেক্ট ক্রয় ইকোসিস্টেম তৈরি এবং পরিচালনা করবেন:

  • সেন্ট্রাল গভর্নেন্স প্রোজেক্ট (PROJECT_GOVERNANCE): সেন্ট্রাল আইটি এবং SecOps-এর মালিকানাধীন, সেন্ট্রাল এজেন্ট গেটওয়ে, সেন্ট্রাল এজেন্ট রেজিস্ট্রি এবং IAM ইউনিফায়েড অ্যাক্সেস নীতি হোস্ট করে।
  • কনজিউমার অর্কেস্ট্রেটর প্রোজেক্ট (PROJECT_CONCIERGE): প্রোকিওরমেন্ট টিমের মালিকানাধীন, পারচেজিং কনসিয়ার্জ এজেন্ট হোস্ট করে যা ডাইনামিকভাবে ভেন্ডর খুঁজে বের করে এবং গ্রাহকের অর্ডার রুট করে।
  • ডোমেন ভেন্ডর প্রোজেক্ট (PROJECT_SELLERS): এক্সটার্নাল বা ডিপার্টমেন্টাল ভেন্ডরের মালিকানাধীন, Burger Seller Agent এবং Pizza Seller Agent হোস্ট করছে।

figure1

ছবি ১. মাল্টি-প্রোজেক্ট সেন্ট্রালাইজড গভর্নেন্স আর্কিটেকচার

ক্রস-প্রোজেক্ট সেন্ট্রালাইজড গভর্নেন্স কেন?

বড় এন্টারপ্রাইজ সংস্থায়, প্রোডাক্ট টিম এবং ডেটা সায়েন্স গ্রুপ ডজন ডজন স্বাধীন Google Cloud প্রোজেক্ট জুড়ে AI এজেন্ট তৈরি করে। টুল রেজিস্ট্রেশন, ইগ্রেস নেটওয়ার্ক রুট ও নিরাপত্তা গার্ডরেলের উপর প্রতিটি টিমকে সরাসরি কন্ট্রোল দিলে, যাচাই না করা টুলের সংখ্যা বৃদ্ধি, অসামঞ্জস্যপূর্ণ DLP নীতি, মনিটর না করা VPC ইগ্রেস ও ফ্র্যাগমেন্ট করা অডিট লগের মতো সমস্যা তৈরি হয়।

ক্রস-প্রোজেক্ট সেন্ট্রালাইজড গভর্নেন্স নীতি তৈরি করাকে এজেন্ট এক্সিকিউশন থেকে আলাদা করে:

  • Central IT ও SecOps নিরাপত্তা নীতি তৈরি করে, টুল যাচাই করে এবং একটি কেন্দ্রীভূত শাসন প্রোজেক্ট-এর মধ্যে ইগ্রেস মনিটর করে।
  • প্রোডাক্ট ও অ্যাপ্লিকেশন টিম তাদের স্বতন্ত্র এজেন্ট রানটাইম প্রোজেক্টে সম্পূর্ণরূপে ব্যবসায়িক লজিকের উপর ফোকাস করে, লোকাল VPC, ইন্টারকানেক্ট বা ফ্র্যাগমেন্টেড নীতি ইঞ্জিন ম্যানেজ করার অপারেশনাল ওভারহেড ছাড়াই সরাসরি সেন্ট্রাল গেটওয়ের সাথে যুক্ত হয়।

figure2

ছবি ২। তিন-স্তরীয় ক্রস-প্রোজেক্ট গভর্নেন্স আর্কিটেকচার ও বাউন্ডারি

ইউনিফায়েড অ্যাক্সেস নীতিতে টু-টিয়ার আইডেন্টিটি স্কোপিং মডেল

এজেন্টরা যখন সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে যোগাযোগ করে, তখন আইডেন্টিটি-অ্যাওয়ার প্রক্সি (IAP v2) কলারের এজেন্ট আইডেন্টিটি-এর উপর ভিত্তি করে অ্যাক্সেস মূল্যায়ন করে—একটি ক্রিপ্টোগ্রাফিকভাবে প্রমাণিত, SPIFFE-ভিত্তিক পরিচয় যা রানটাইম কন্টেনারে অটোমেটিক ইস্যু করা হয়—একটি গ্লোবাল IAM অ্যাক্সেস নীতির বিপরীতে:

  • টিয়ার ১: বেসলাইন Google Cloud API (নিয়ম ১-এ principalSet://-এর মাধ্যমে কোর্স-গ্রেনড): প্রজেক্ট-ব্যাপী ইগ্রেস অথরাইজেশন যা স্পোক প্রজেক্ট জুড়ে সব এজেন্ট রানটাইমকে ডিসকভারি, টোকেন জেনারেশন ও ইনফারেন্সের জন্য স্ট্যান্ডার্ড Google API (aiplatform, iamcredentials, telemetry, agentregistry) অ্যাক্সেস করার অনুমতি দেয়।
  • টিয়ার ২: বিজনেস টুল ও A2A পরিষেবা (নিয়ম ২ ও ৩-এ principal://-এর মাধ্যমে ফাইন-গ্রেনড): নির্দিষ্ট রেজিস্টার করা এজেন্ট রেজিস্ট্রি পরিষেবাকে (destination.agent_registry.agent.name) টার্গেট করে কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) শর্তের মাধ্যমে এনফোর্স করা, স্বতন্ত্র রিজনিং ইঞ্জিন ইনস্ট্যান্সের সাথে যুক্ত কঠোর ন্যূনতম-বিশেষাধিকার অ্যাক্সেস।

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

  • PROJECT_GOVERNANCE-এ সেন্ট্রালাইজড এজেন্ট গেটওয়ে (centralized-agw)
  • কঠোরভাবে এনফোর্স মোডে IAP v2 অথরাইজেশন সার্ভিস এক্সটেনশন এবং Authz নীতি (failOpen: false)
  • ফাউন্ডেশনাল IAM ইউনিফায়েড অ্যাক্সেস নীতি (uap-rules.json) এবং প্রোজেক্ট নীতি বাইন্ডিং
  • ক্রস-প্রোজেক্ট সার্ভিস এজেন্ট IAM অনুমতি (ar_agw_cross_project_sa)
  • শেয়ার করা সেন্ট্রাল Google Cloud Storage (GCS) স্টেজিং বাকেট
  • PROJECT_SELLERS-এ বার্গার ও পিৎজা বিক্রেতা এজেন্টদের আলাদা করা হয়েছে
  • PROJECT_CONCIERGE-এ ডায়নামিক REST অটোডিসকভারি সহ পারচেজিং কনসিয়ার্জ এজেন্ট
  • ক্রস-প্রোজেক্ট mTLS URL সহ সেন্ট্রাল এজেন্ট রেজিস্ট্রিতে পরিষেবা রেজিস্ট্রেশন
  • লাইভ যাচাইকরণ ও Cloud Logging অডিট সহ ডায়নামিক IAP v2 ইগ্রেস নীতি সংক্রান্ত আপডেট

figure3

ছবি ৩. ধাপে-ধাপে প্রয়োগ করার ক্রম

আপনি কী শিখবেন

  • সেন্ট্রালাইজড গেটওয়ের জন্য ক্রস-প্রোজেক্ট পরিষেবা এজেন্ট IAM অনুমতি কীভাবে কনফিগার করবেন
  • মাল্টি-প্রোজেক্ট এনভায়রনমেন্ট জুড়ে সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে কীভাবে এজেন্ট রানটাইম ইগ্রেস রাউট করবেন
  • সার্ভিস এক্সটেনশন (iapPolicyVersion: "V2") ব্যবহার করে কীভাবে Identity-Aware Proxy (IAP v2)-তে এজেন্ট গেটওয়ে অথরাইজেশন ডেলিগেট করবেন
  • কীভাবে IAM ইউনিফায়েড অ্যাক্সেস পলিসি (UAP) তৈরি ও বাইন্ড করতে হয়, যেখানে কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) নিয়ম রেজিস্টার করা এজেন্ট রেজিস্ট্রি ডেস্টিনেশন (destination.agent_registry.*) পরিচালনা করে
  • এজেন্ট রেজিস্ট্রির বিপরীতে রানটাইম অটোডিসকভারি ব্যবহার করে কীভাবে হার্ডকোড করা এজেন্ট আইডি এবং URL বাদ দেওয়া যায়
  • কীভাবে রিয়েল পেরিমিটার জিরো-ট্রাস্ট ব্লকিং (HTTP 403 Forbidden) পরীক্ষা করবেন এবং Cloud Logging-এ লাইভ নীতি আপডেট যাচাই করবেন

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

  • বিলিং চালু করা আছে এমন ৩টি Google Cloud প্রোজেক্ট:
    • PROJECT_GOVERNANCE: সেন্ট্রাল গভর্নেন্স, গেটওয়ে, রেজিস্ট্রি ও IAM অ্যাক্সেস নীতি
    • PROJECT_CONCIERGE: পারচেজিং কনসিয়ার্জ অর্কেস্ট্রেটর এজেন্ট
    • PROJECT_SELLERS: বার্গার ও পিৎজা স্পেশালিস্ট বিক্রেতা এজেন্ট
  • একটি IAM ব্যবহারকারী বা পরিষেবা অ্যাকাউন্ট যার কাছে roles/owner বা তিনটি প্রোজেক্ট জুড়ে প্রশাসনিক অনুমতি আছে
  • Google Cloud সংস্থা (SPIFFE ট্রাস্ট ডোমেন ম্যাপিংয়ের জন্য)
  • Google Cloud Shell বা gcloud CLI, python (3.11+) ও uv ইনস্টল করা আছে এমন লোকাল মেশিন

এখানেই ভূমিকা শেষ... এবার সেট-আপ ও এনভায়রনমেন্ট বিভাগে যাওয়া যাক।

২. সেট-আপ করুন

যদিও এই আর্কিটেকচার ৩টি আলাদা Google Cloud প্রোজেক্ট জুড়ে বিস্তৃত, আপনি PROJECT_GOVERNANCE-এ সেট করা একটি Cloud Shell টার্মিনাল থেকে টার্মিনাল ডিপ্লয়মেন্ট কমান্ড, রিপোজিটরি ডাউনলোড এবং স্টেজিং অপারেশন ১০০% কার্যকর করতে পারবেন। প্রতিটি ডিপ্লয়মেন্ট স্ক্রিপ্ট এবং gcloud কমান্ড CLI ফ্ল্যাগ (--project)-এর মাধ্যমে উপযুক্ত ডেস্টিনেশন প্রোজেক্টকে স্পষ্টভাবে টার্গেট করে।

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

আপনার প্রোজেক্টের প্রসঙ্গ সেট করুন

# set terminal project context to Central Governance Project
gcloud config set project SET_YOUR_GOVERNANCE_PROJECT_ID_HERE
# login to gcloud cli
gcloud auth login
# login for application default credentials
gcloud auth application-default login
# update gcloud components
gcloud components update --quiet

শেল এনভায়রনমেন্ট ভেরিয়েবল সেট করুন

আপনার প্রোজেক্টের নির্দিষ্ট শনাক্তকারী লিখুন।

# 1. Project Identifiers
export PROJECT_GOVERNANCE="SET_YOUR_GOVERNANCE_PROJECT_ID_HERE"
export PROJECT_CONCIERGE="SET_YOUR_CONCIERGE_PROJECT_ID_HERE"
export PROJECT_SELLERS="SET_YOUR_SELLERS_PROJECT_ID_HERE"

এই শেল ভেরিয়েবলগুলি অটোমেটিক পাওয়া যাবে।

# 2. Regional & Gateway Settings
export REGION="us-central1"
export AGW_NAME="centralized-agw"
export UAP_POLICY_NAME="uap-policy-${AGW_NAME}"
export UAP_BINDING_NAME="uap-binding-${AGW_NAME}"

# 3. Retrieve Project Numbers
export PROJECT_NUMBER_GOVERNANCE=$(gcloud projects describe ${PROJECT_GOVERNANCE} --format="value(projectNumber)")
export PROJECT_NUMBER_CONCIERGE=$(gcloud projects describe ${PROJECT_CONCIERGE} --format="value(projectNumber)")
export PROJECT_NUMBER_SELLERS=$(gcloud projects describe ${PROJECT_SELLERS} --format="value(projectNumber)")

# 4. Obtain Organization ID
export ORG_ID=$(gcloud projects get-ancestors ${PROJECT_GOVERNANCE} --format="value(id, type)" | grep organization | awk '{print $1}')

# 5. Set Application Default Credentials (ADC) Quota Project
gcloud auth application-default set-quota-project ${PROJECT_GOVERNANCE}

echo "Governance Project: ${PROJECT_GOVERNANCE} (${PROJECT_NUMBER_GOVERNANCE})"
echo "Concierge Project:  ${PROJECT_CONCIERGE} (${PROJECT_NUMBER_CONCIERGE})"
echo "Sellers Project:    ${PROJECT_SELLERS} (${PROJECT_NUMBER_SELLERS})"
echo "Organization ID:    ${ORG_ID}"
echo "UAP Policy Name:    ${UAP_POLICY_NAME}"
echo "UAP Binding Name:   ${UAP_BINDING_NAME}"

কনফিগ ফাইলের জন্য লোকাল ডিরেক্টরি তৈরি করুন

# create config folder
mkdir -p cfg

ইউনিফায়েড অ্যাক্সেস নীতির জন্য অ্যাক্সেস নীতি অ্যাডমিন ভূমিকা অ্যাসাইন করুন

# grant Access Policy Admin and Project IAM Admin to current user in Governance Project
for ROLE in "roles/iam.accessPolicyAdmin" "roles/resourcemanager.projectIamAdmin"; do
  gcloud projects add-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="user:$(gcloud config get-value account)" \
    --role="${ROLE}" \
    --condition=None
done

IAP v2-এর জন্য Cloud Audit ডেটা অ্যাক্সেস লগ চালু করুন

ডিফল্ট হিসেবে, Google Cloud ডেটা অ্যাক্সেস অডিট লগ বন্ধ করে দেয় যাতে স্টোরেজের জন্য অনাকাঙ্ক্ষিত খরচ না হয়। IAP v2 ডেটা অ্যাক্সেস অডিট লগ হিসেবে অনুমোদনের সিদ্ধান্ত (granted=true এবং granted=false) প্রকাশ করে, তাই PROJECT_GOVERNANCE-এ iap.googleapis.com-এর জন্য ADMIN_READ, DATA_READ এবং DATA_WRITE লগিং চালু করুন:

# 1. export current IAM policy for PROJECT_GOVERNANCE
gcloud projects get-iam-policy ${PROJECT_GOVERNANCE} \
  --format=json > cfg/gov_iam_policy.json
# 2. append auditConfigs for iap.googleapis.com
python3 -c "
import json
with open('cfg/gov_iam_policy.json') as f:
    policy = json.load(f)
audit_configs = [c for c in policy.get('auditConfigs', []) if c.get('service') != 'iap.googleapis.com']
audit_configs.append({
    'service': 'iap.googleapis.com',
    'auditLogConfigs': [
        {'logType': 'ADMIN_READ'},
        {'logType': 'DATA_READ'},
        {'logType': 'DATA_WRITE'}
    ]
})
policy['auditConfigs'] = audit_configs
with open('cfg/gov_iam_policy.json', 'w') as f:
    json.dump(policy, f, indent=2)
"
# 3. apply updated policy
gcloud projects set-iam-policy ${PROJECT_GOVERNANCE} cfg/gov_iam_policy.json
# 4. verify auditConfigs applied
gcloud projects get-iam-policy ${PROJECT_GOVERNANCE} --format="yaml(auditConfigs)"

প্রয়োজনীয় Google Cloud API চালু করুন

# enable google apis (agent platform & security bundle, part 1)
for PROJ in ${PROJECT_GOVERNANCE} ${PROJECT_CONCIERGE} ${PROJECT_SELLERS}; do
  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 \
    agentidentity.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 \
    --project=${PROJ}
done
# enable google apis (agent platform bundle, part 2)
for PROJ in ${PROJECT_GOVERNANCE} ${PROJECT_CONCIERGE} ${PROJECT_SELLERS}; do
  gcloud services enable \
    securitycenter.googleapis.com \
    saasservicemgmt.googleapis.com \
    storage.googleapis.com \
    telemetry.googleapis.com \
    texttospeech.googleapis.com \
    --project=${PROJ}
done
# enable google apis (foundational & agent runtime build bundle, part 3)
for PROJ in ${PROJECT_GOVERNANCE} ${PROJECT_CONCIERGE} ${PROJECT_SELLERS}; do
  gcloud services enable \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    cloudresourcemanager.googleapis.com \
    iamcredentials.googleapis.com \
    serviceusage.googleapis.com \
    run.googleapis.com \
    orgpolicy.googleapis.com \
    --project=${PROJ}
done

সব প্রোজেক্ট জুড়ে API চালু করার সুবিধা যাচাই করুন

তিনটি প্রোজেক্টেই (PROJECT_GOVERNANCE, PROJECT_CONCIERGE এবং PROJECT_SELLERS) একই API চালু করা থাকলে অপারেশনাল ধারাবাহিকতা বজায় থাকে এবং রানটাইম টোকেন মিন্টিং সংক্রান্ত সমস্যা, স্কিমা ক্যাটালগিং সংক্রান্ত সমস্যা বা টেলিমেট্রি ড্রপআউট এড়ানো যায়।

তিনটি প্রোজেক্ট জুড়ে API প্যারিটি যাচাই করতে Cloud Shell-এ নিম্নলিখিত যাচাইকরণ স্ক্রিপ্ট রান করুন:

# validate that all required APIs are enabled across all 3 projects
python3 - << 'EOF'
import subprocess
import os
import sys

REQUIRED_APIS = [
    "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",
    "agentidentity.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",
    "securitycenter.googleapis.com",
    "saasservicemgmt.googleapis.com",
    "storage.googleapis.com",
    "telemetry.googleapis.com",
    "texttospeech.googleapis.com",
    "artifactregistry.googleapis.com",
    "cloudbuild.googleapis.com",
    "cloudresourcemanager.googleapis.com",
    "iamcredentials.googleapis.com",
    "serviceusage.googleapis.com",
    "run.googleapis.com",
    "orgpolicy.googleapis.com"
]

projects = {
    "GOVERNANCE": os.environ.get("PROJECT_GOVERNANCE", ""),
    "CONCIERGE": os.environ.get("PROJECT_CONCIERGE", ""),
    "SELLERS": os.environ.get("PROJECT_SELLERS", "")
}

enabled = {}
for role, proj in projects.items():
    if not proj:
        print(f"Error: Environment variable for {role} is not set.")
        sys.exit(1)
    res = subprocess.run(
        ["gcloud", "services", "list", "--enabled", f"--project={proj}", "--format=value(config.name)"],
        capture_output=True, text=True, check=True
    )
    enabled[role] = set(res.stdout.strip().splitlines())

print(f"\n{'API Name':<36} | {'GOVERNANCE':<12} | {'CONCIERGE':<12} | {'SELLERS':<12}")
print("-" * 78)

all_synced = True
for api in REQUIRED_APIS:
    g_status = "ENABLED" if api in enabled["GOVERNANCE"] else "MISSING"
    c_status = "ENABLED" if api in enabled["CONCIERGE"] else "MISSING"
    s_status = "ENABLED" if api in enabled["SELLERS"] else "MISSING"
    if "MISSING" in (g_status, c_status, s_status):
        all_synced = False
    print(f"{api:<36} | {g_status:<12} | {c_status:<12} | {s_status:<12}")

print("-" * 78)
if all_synced:
    print("✅ All 29 required APIs are ENABLED and synchronized across all three projects.\n")
else:
    print("❌ Discrepancies detected. Please re-run the enablement commands for missing services.\n")
    sys.exit(1)
EOF

স্যাম্পেল যাচাইকরণের আউটপুট:

আপনি সব API চালু করা অবস্থায় দেখতে পাবেন।

✅ All 30 required APIs are ENABLED and synchronized across all three projects.

Organization Policies কনফিগার করুন

ডিফল্ট Google Cloud সংস্থার নীতি এমন সীমাবদ্ধতা এনফোর্স করে যা রিসোর্সে (constraints/iam.managed.disableAccessPolicyBinding) IAM v3 অ্যাক্সেস নীতি বাইন্ডিংকে সীমাবদ্ধ করে।

স্পষ্টভাবে enforce: false-কে অনুমতি দেওয়ার জন্য সেট করে প্রোজেক্ট লেভেলে উত্তরাধিকার সূত্রে প্রাপ্ত যেকোনও প্রতিষ্ঠানের নীতি সংক্রান্ত বিধিনিষেধ ওভাররাইড করুন।

# disable iam v3 constraint (allow v3 access policies)
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJECT_NUMBER_GOVERNANCE}/policies/iam.managed.disableAccessPolicyBinding
spec:
  rules:
  - enforce: false
EOF
# verify org policy constraints on project
gcloud org-policies describe iam.managed.disableAccessPolicyBinding \
  --project=${PROJECT_GOVERNANCE} --effective

সেট-আপের অংশটি এখানেই শেষ... এর পরে মূল Google API রেজিস্টার করুন বিভাগে যান।

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

Core Google APIs এন্ডপয়েন্ট পরিষেবা রেজিস্টার করুন

এজেন্ট গেটওয়ের জন্য Google API URL-কে সেন্ট্রাল এজেন্ট রেজিস্ট্রিতে রেজিস্টার করতে হয় যাতে agent_gateway_config-এর মাধ্যমে কনফিগার করা এজেন্ট নিরাপদে ইগ্রেস ট্রাফিককে মূল Google Cloud ব্যাকএন্ড পরিষেবায় (যেমন aiplatform, IAM ক্রেডেনশিয়াল ও টেলিমেট্রি) পাঠাতে পারে।

এজেন্ট রেজিস্ট্রিতে core-gapi-services তৈরি করুন

# register core google api endpoints in agent registry with standard and :443 port variants
gcloud agent-registry services create core-gapi-services \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} \
  --display-name="gapi.core.services" \
  --description="Core Google Cloud APIs and Service Endpoints" \
  --endpoint-spec-type=no-spec \
  --interfaces=protocolBinding=JSONRPC,url=https://telemetry.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://telemetry.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://aiplatform.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://aiplatform.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://aiplatform.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://aiplatform.mtls.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.mtls.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.mtls.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://agentregistry.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://agentregistry.mtls.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://agentregistry.googleapis.com:443 \
  --interfaces=protocolBinding=JSONRPC,url=https://agentregistry.mtls.googleapis.com:443

Capture Core APIs Endpoint Resource ID

# capture the underlying Agent Registry endpoint ID
export ENDPOINT_ID=$(gcloud agent-registry services describe core-gapi-services \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} \
  --format="value(registryResource)" | awk -F'/' '{print $NF}')
echo "Core APIs Endpoint ID: ${ENDPOINT_ID}"

এজেন্টের পরিচয়ে principalSet বনাম principal বোঝা

Google Cloud IAM এবং Gemini Enterprise Agent Platform-এ, এক্সিকিউটিং এজেন্ট কন্টেনারে ইস্যু করা মেশিন আইডেন্টিটি, Identity-Aware Proxy (IAP v2) দ্বারা মূল্যায়ন করা ক্রিপ্টোগ্রাফিকভাবে অ্যাটেস্ট করা SPIFFE URN ব্যবহার করে। IAM ইউনিফায়েড অ্যাক্সেস নীতি কনফিগার করার সময়, আপনি নির্দিষ্ট একটি principal অথবা অ্যাট্রিবিউট-ভিত্তিক principalSet টার্গেট করতে পারেন:

আকার

principal:// (সিঙ্গেল মেশিন আইডেন্টিটি)

principalSet:// (অ্যাট্রিবিউট-ভিত্তিক গ্রুপ)

IAM সিনট্যাক্স

principal://...

principalSet://...

গ্র্যানুলারিটি

ফাইন-গ্রেনড (ইনস্ট্যান্স-লেভেল): একটি নির্দিষ্ট রিজনিং ইঞ্জিন কন্টেনার ইনস্ট্যান্স শনাক্ত করে।

কোর্স-গ্রেনড (প্রোজেক্ট-লেভেল): সাধারণ প্রোজেক্ট অ্যাট্রিবিউট শেয়ার করে এমন সব রিজনিং ইঞ্জিন শনাক্ত করে।

URN প্যাটার্ন

principal://agents.global.org-${ORG_ID}.system.id.goog/resources/aiplatform/projects/${PROJECT_NUMBER}/locations/${REGION}/reasoningEngines/${ENGINE_ID}

principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER}

এজেন্ট প্ল্যাটফর্মে ব্যবহারের ক্ষেত্র

টিয়ার ২ (Business Tools ও A2A): টার্গেট ডোমেন টুল (যেমন, Purchasing Concierge $\rightarrow$ Burger Seller) ইনভোক করার জন্য নির্দিষ্ট অর্কেস্ট্রেটর এজেন্টকে অনুমোদন করা।

টিয়ার ১ (ফাউন্ডেশনাল ইনফ্রাস্ট্রাকচার): Google Cloud API (core-gapi-services)-তে কোনও প্রোজেক্টের সব এজেন্টকে ইগ্রেস অ্যাক্সেস প্রদান করা।

লাইফসাইকেল ইমপ্যাক্ট

কোনও এজেন্ট মুছে দিয়ে আবার তৈরি করা হলে, তার নতুন ইঞ্জিন আইডির জন্য একটি আপডেট করা IAM নীতি বাইন্ডিং প্রয়োজন।

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

ইউনিফায়েড অ্যাক্সেস পলিসি (UAP / IAP v2) সহ ডিক্লারেটিভ গভর্নেন্স

পুরনো IAP v1-এ, gcloud beta iap web add-iam-policy-binding ব্যবহার করে সরাসরি স্বতন্ত্র এজেন্ট রেজিস্ট্রি রিসোর্সের সাথে ইগ্রেস নীতি অ্যাটাচ করা হয়েছিল। IAP v2 এবং ইউনিফায়েড অ্যাক্সেস নীতি অনুযায়ী, একক, কেন্দ্রীভূত IAM অ্যাক্সেস নীতি (cfg/uap-rules.json) অনুযায়ী রিসোর্স-ভিত্তিক বাইন্ডিং বাদ দেওয়া হয়েছে।

core-gapi-services-এর জন্য ফাউন্ডেশনাল ইগ্রেস অথরাইজেশন, ৫ নম্বর বিভাগের ইউনিফায়েড অ্যাক্সেস পলিসিতে নিয়ম ১ হিসেবে কনফিগার করা হবে, যাতে ডিপ্লয় করার আগে সব এজেন্ট কন্টেনারের ফাউন্ডেশনাল ইগ্রেস রুট সেট-আপ করা থাকে।

প্রিন্সিপাল আইডেন্টিফায়ার ও ওয়ার্কলোড আইডেন্টিটি মেকানিক্স সম্পর্কে আরও গভীর প্রযুক্তিগত বিবরণ জানতে, দেখুন:

এর মাধ্যমে মূল API এন্ডপয়েন্ট রেজিস্ট্রেশন শেষ হয়... এর পরে সেন্ট্রালাইজড এজেন্ট গেটওয়ে ডিপ্লয় করুন বিভাগে যান।

৪. এজেন্ট গেটওয়ে

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

$PROJECT_GOVERNANCE প্রোজেক্টের মধ্যে AGENT_TO_ANYWHERE ইগ্রেস মোডে সেন্ট্রালাইজড এজেন্ট গেটওয়ে (centralized-agw) ডিপ্লয় করুন।

গেটওয়ে কনফিগারেশন ম্যানিফেস্ট নির্দিষ্ট করুন

ইগ্রেস ট্রাফিক গভর্নেন্সের জন্য cfg/${AGW_NAME}.yaml তৈরি করুন:

# generate agent gateway config yaml
cat > cfg/${AGW_NAME}.yaml << EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
registries:
  - "//agentregistry.googleapis.com/projects/${PROJECT_GOVERNANCE}/locations/${REGION}"
EOF

এজেন্ট গেটওয়ে কনফিগারেশন ইমপোর্ট করুন

# import and create agent gateway
gcloud network-services agent-gateways import ${AGW_NAME} \
  --source="cfg/${AGW_NAME}.yaml" \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE}

এজেন্ট গেটওয়ের বিবরণ যাচাই করুন

# show agent gateway status
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE}

স্যাম্পেল আউটপুট:

agentGatewayCard:
  mtlsEndpoint: projects/${AGW_TP_ID}/regions/us-central1/serviceAttachments/unitkind1-swp-mtls-psc-sa
  rootCertificates:
  - |
    -----BEGIN CERTIFICATE-----
    MIIDwzCCAqugAwIBAgITNQuWGopdOZaHdcK7r7AYFhonqDANBgkqhkiG9w0BAQsF
    ...
    -----END CERTIFICATE-----
  serviceExtensionsServiceAccount: service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com
createTime: 'YYYY-MM-DDT12:34:56.789098765Z'
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
name: projects/${PROJECT_GOVERNANCE}/locations/us-central1/agentGateways/centralized-agw
protocols:
- MCP
registries:
- //agentregistry.googleapis.com/projects/${PROJECT_GOVERNANCE}/locations/us-central1
updateTime: 'YYYY-MM-DDT12:34:56.789098765Z'

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

৫. অনুমোদন

এজেন্ট গেটওয়ে অথরাইজেশন ও ফাউন্ডেশনাল UAP কনফিগার করা

এজেন্ট গেটওয়ে, Identity-Aware Proxy (IAP v2) ইউনিফায়েড অ্যাক্সেস পলিসি (UAP)-এর সাথে ইন্টিগ্রেট করা Authorization Policies (networksecurity.authzPolicies) ব্যবহার করে আউটবাউন্ড টুল ও এজেন্ট ট্রাফিক সুরক্ষিত ও পরিচালনা করে।

অনুমোদন আর্কিটেকচার ওভারভিউ

figure4

ছবি ৪. অনুমোদন আর্কিটেকচার ওভারভিউ

অনুমোদন আর্কিটেকচার তিনটি পরস্পর সংযুক্ত স্তর নিয়ে গঠিত:

  1. IAP সার্ভিস এক্সটেনশন (authzExtension): কঠোর পেরিমিটার জিরো-ট্রাস্ট এনফোর্সমেন্টের জন্য service: iap.googleapis.com, metadata: iapPolicyVersion: "V2" ও failOpen: false-এর সাথে কনফিগার করা আঞ্চলিক রিসোর্স।
  2. গেটওয়ে অথরাইজেশন নীতি (authzPolicy): policyProfile: REQUEST_AUTHZ ও action: CUSTOM সহ আপনার এজেন্ট গেটওয়েকে টার্গেট করা আঞ্চলিক রিসোর্স, IAP Authz এক্সটেনশনে অথরাইজেশন চেক রাউট করা।
  3. IAM ইউনিফায়েড অ্যাক্সেস নীতি ও বাইন্ডিং (accessPolicy ও policyBinding): IAP-এর মাধ্যমে মূল্যায়ন করা গ্লোবাল IAM v3 রিসোর্স। এটি কলার SPIFFE পরিচয় ও CEL ক্যাটালগ শর্তের সাথে iap.googleapis.com/resources.egressViaIAP ইউনিভার্সাল অনুমতি যাচাই করে।

ধাপ ১: IAP v2 Authz এক্সটেনশন তৈরি ও ইম্পোর্ট করা

কঠোর ENFORCE মোডে iapPolicyVersion: "V2" ও failOpen: false সহ সার্ভিস এক্সটেনশন ম্যানিফেস্ট তৈরি করুন:

# create authz extension config file in ENFORCE mode
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

Authz এক্সটেনশন ইমপোর্ট করুন:

# import IAP v2 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} \
  --project=${PROJECT_GOVERNANCE}

Authz এক্সটেনশন অ্যাক্টিভ আছে কিনা তা যাচাই করুন:

# describe authz extension
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-iap \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE}

স্যাম্পেল আউটপুট:

createTime: 'YYYY-MM-DDT12:34:56.789098765Z'
failOpen: false
metadata:
  iapPolicyVersion: V2
name: projects/${PROJECT_GOVERNANCE}/locations/us-central1/authzExtensions/centralized-agw-svc-ext-authz-iap
service: iap.googleapis.com
timeout: 1s

ধাপ ২: গেটওয়ে অথরাইজেশন নীতি তৈরি ও ইমপোর্ট করা

একটি অনুমোদন নীতি কনফিগারেশন তৈরি করুন যা এজেন্ট গেটওয়ের সাথে অ্যাটাচ করে এবং IAP Authz এক্সটেনশনে অনুরোধ যাচাইকরণ ডেলিগেট করে:

# create authz policy manifest
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
  resources:
    - "projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJECT_GOVERNANCE}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap"
EOF

অনুমোদন নীতি ইমপোর্ট করুন:

# import 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} \
  --project=${PROJECT_GOVERNANCE}

অ্যাক্টিভ অথরাইজেশন নীতি যাচাই করুন:

# describe authz policy
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE}

ধাপ ৩: প্রাথমিক ইউনিফায়েড অ্যাক্সেস নীতি (নিয়ম ১: মূল Google API) তৈরি করা

core-gapi-services-এ পৌঁছানোর জন্য তিনটি প্রোজেক্ট principalSet-কে অনুমোদন করে নিয়ম ১ সহ cfg/uap-rules.json তৈরি করুন:

# create initial unified access policy rules manifest
cat > cfg/uap-rules.json << EOF
[
  {
    "description": "Rule 1: Allow agent runtimes across all 3 projects to reach Core Google APIs",
    "effect": "ALLOW",
    "principals": [
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_GOVERNANCE}",
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}",
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_SELLERS}"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.resource_type == 'ENDPOINT' && ( \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/endpoints/core-gapi-services' || \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/endpoints/${ENDPOINT_ID}' || \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/${REGION}/endpoints/${ENDPOINT_ID}')"
      }
    }
  }
]
EOF

ধাপ ৪: IAM অ্যাক্সেস নীতি তৈরি ও বাইন্ড করা

গ্লোবাল IAM অ্যাক্সেস নীতি তৈরি করুন:

# create global IAM access policy
gcloud iam access-policies create ${UAP_POLICY_NAME} \
  --details-rules=cfg/uap-rules.json \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

PROJECT_GOVERNANCE-এ অ্যাক্সেস নীতি বাইন্ড করুন:

# bind access policy to governance project
gcloud iam policy-bindings create ${UAP_BINDING_NAME} \
  --policy="projects/${PROJECT_GOVERNANCE}/locations/global/accessPolicies/${UAP_POLICY_NAME}" \
  --target-resource="//cloudresourcemanager.googleapis.com/projects/${PROJECT_GOVERNANCE}" \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

নীতি বাইন্ডিং অ্যাক্টিভ আছে কিনা তা যাচাই করুন:

# verify policy binding
gcloud iam policy-bindings describe ${UAP_BINDING_NAME} \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

স্যাম্পেল আউটপুট:

name: projects/${PROJECT_GOVERNANCE}/locations/global/policyBindings/uap-binding-centralized-agw
policy: projects/${PROJECT_GOVERNANCE}/locations/global/accessPolicies/uap-policy-centralized-agw
policyKind: ACCESS_POLICY
target:
  resource: //cloudresourcemanager.googleapis.com/projects/${PROJECT_GOVERNANCE}

ফাউন্ডেশনাল Google Cloud API ইগ্রেস এখন তিনটি প্রোজেক্ট জুড়ে স্ট্রিক্ট ENFORCE মোডে নিরাপদে অনুমোদিত।

এর মাধ্যমে গেটওয়ে অথরাইজেশন সেট-আপ সম্পূর্ণ হয়... এরপরে ক্রস-প্রোজেক্ট IAM অনুমতি কনফিগার করুন বিভাগে যান।

৬. ক্রস-প্রোজেক্ট IAM

ক্রস-প্রোজেক্ট IAM অনুমতি কনফিগার করুন

এই মাল্টি-প্রোজেক্ট টপোলজিতে, এজেন্ট রানটাইম স্পোক প্রোজেক্টে (PROJECT_CONCIERGE এবং PROJECT_SELLERS) থাকে, যেখানে সেন্ট্রাল এজেন্ট গেটওয়ে এবং এজেন্ট রেজিস্ট্রি PROJECT_GOVERNANCE-এ থাকে।

Google Cloud প্রোজেক্টগুলি যেহেতু বিচ্ছিন্ন নিরাপত্তা পরিধি, তাই দুটি অপারেশনাল লেয়ার জুড়ে ক্রস-প্রজেক্ট অ্যাক্সেস স্পষ্টভাবে মঞ্জুর করতে হবে:

  1. কন্ট্রোল প্লেন (ডিপ্লয়মেন্টের সময়): --agent-gateway-config দিয়ে কনফিগার করা এজেন্ট কন্টেনার ডিপ্লয় করার সময়, স্পোক প্রোজেক্টের এজেন্ট রানটাইম সার্ভিস এজেন্ট (service-@gcp-sa-aiplatform.iam.gserviceaccount.com) অবশ্যই কন্টেনারটিকে সেন্ট্রাল গেটওয়ের সাথে অ্যাটাচ করবে। আমরা PROJECT_GOVERNANCE-এ networkservices.agentGateways.use, get ও operations.get-এর অনুমতি দিয়ে একটি ন্যূনতম কাস্টম ভূমিকা (ar_agw_cross_project_sa) তৈরি করি।
  2. ডেটা প্লেন (রানটাইম এক্সিকিউশন):
    • ক্যাটালগ ডিসকভারি: টার্গেট এজেন্ট এন্ডপয়েন্ট ডায়নামিকভাবে সমাধান করতে, স্পোক আইডেন্টিটির জন্য PROJECT_GOVERNANCE-এ roles/agentregistry.viewer প্রয়োজন।
    • টার্গেট ইনভোকেশন: বিক্রেতার রিজনিং ইঞ্জিনের বিরুদ্ধে কোয়েরি এক্সিকিউট করার জন্য কনসিয়ার্জ এজেন্টের PROJECT_SELLERS-এ roles/aiplatform.user প্রয়োজন।

PROJECT_GOVERNANCE-এ কাস্টম IAM ভূমিকা তৈরি করুন

# create custom role in central governance project
gcloud iam roles create ar_agw_cross_project_sa \
  --project=${PROJECT_GOVERNANCE} \
  --title="Runtime Agent Gateway Cross-Project SA" \
  --description="Custom role for cross-project service agents to access Central Agent Gateway" \
  --permissions="networkservices.agentGateways.get,networkservices.agentGateways.use,networkservices.operations.get" \
  --stage="GA"

এজেন্ট রানটাইম সার্ভিস এজেন্টকে কাস্টম ভূমিকা অ্যাসাইন করুন

# 1. ensure aiplatform service identities are provisioned across all projects
for PROJ in ${PROJECT_GOVERNANCE} ${PROJECT_CONCIERGE} ${PROJECT_SELLERS}; do
  gcloud beta services identity create --service=aiplatform.googleapis.com --project=${PROJ}
done
# 2. derive aiplatform service agent emails
export CONCIERGE_AI_SA="service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform.iam.gserviceaccount.com"
export CONCIERGE_RE_SA="service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
export CONCIERGE_COMPUTE_SA="${PROJECT_NUMBER_CONCIERGE}-compute@developer.gserviceaccount.com"

export SELLERS_AI_SA="service-${PROJECT_NUMBER_SELLERS}@gcp-sa-aiplatform.iam.gserviceaccount.com"
export SELLERS_RE_SA="service-${PROJECT_NUMBER_SELLERS}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
export SELLERS_COMPUTE_SA="${PROJECT_NUMBER_SELLERS}-compute@developer.gserviceaccount.com"
# 3. grant custom role & network viewer to Concierge and Sellers Service Agents
for SA in ${CONCIERGE_AI_SA} ${SELLERS_AI_SA}; do
  gcloud projects add-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="serviceAccount:${SA}" \
    --role="projects/${PROJECT_GOVERNANCE}/roles/ar_agw_cross_project_sa" \
    --condition=None

  gcloud projects add-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="serviceAccount:${SA}" \
    --role="roles/networkservices.viewer" \
    --condition=None
done
# 4. grant agent registry viewer on Governance Project for dynamic autodiscovery
for MEMBER in "serviceAccount:${CONCIERGE_AI_SA}" "serviceAccount:${CONCIERGE_RE_SA}" "serviceAccount:${CONCIERGE_COMPUTE_SA}" "serviceAccount:${SELLERS_AI_SA}" "serviceAccount:${SELLERS_RE_SA}" "serviceAccount:${SELLERS_COMPUTE_SA}" "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}" "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_SELLERS}"; do
  gcloud projects add-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="${MEMBER}" \
    --role="roles/agentregistry.viewer" \
    --condition=None
done
# 5. grant agent project viewer on Governance Project for dynamic autodiscovery
for SA in ${CONCIERGE_COMPUTE_SA} ${CONCIERGE_AI_SA}; do
  gcloud projects add-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="serviceAccount:${SA}" \
    --role="roles/viewer" \
    --condition=None
done
# 6. grant aitplatform user on Sellers project to Concierge for cross-project A2A invocation
for MEMBER in "serviceAccount:${CONCIERGE_AI_SA}" "serviceAccount:${CONCIERGE_RE_SA}" "serviceAccount:${CONCIERGE_COMPUTE_SA}" "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}"; do
  gcloud projects add-iam-policy-binding ${PROJECT_SELLERS} \
    --member="${MEMBER}" \
    --role="roles/aiplatform.user" \
    --condition=None
done

এর মাধ্যমে ক্রস-প্রোজেক্ট IAM সেট-আপ শেষ হল... এর পরে বিক্রেতা ও Concierge এজেন্ট ডেপ্লয় করুন বিভাগে যান।

৭. এজেন্ট রানটাইম

বিক্রেতা ও কনসিয়ার্জ এজেন্ট নিয়োগ করা

এই কোডল্যাবের জন্য ব্যবহৃত মাল্টি-এজেন্ট অ্যাপ্লিকেশন কোডবেস এবং ডিপ্লয়মেন্ট স্ক্রিপ্ট একটি রিমোট Google Cloud GitHub রিপোজিটরিতে ম্যানেজ করা হয়। নিম্নলিখিত ধাপগুলি রিপোজিটরি লোকালি ক্লোন করবে, প্রয়োজনীয় ফাইল বর্তমান ওয়ার্কিং ডিরেক্টরি স্ট্রাকচারে কপি করবে, সাময়িক ফাইল মুছে দেবে এবং uv-এর সাথে ডিপেন্ডেন্সি ইনস্টল করবে।

রিমোট আর্টিফ্যাক্ট ফেচ করুন

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_multiproject
# copy multi-agent application files to current working directory
cp -r temp_agw_multiproject/codelabs/agw-multiproject ./cross-project-multiagent
# remove temporary directory
rm -rf temp_agw_multiproject
# install dependencies
uv sync --directory ./cross-project-multiagent

শেয়ার করা সেন্ট্রাল স্টেজিং বাকেট তৈরি করুন

# create shared central staging bucket
gcloud storage buckets create gs://${PROJECT_GOVERNANCE}-shared-staging \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION}
# grant cross-project read/write access to runtime service agents
gcloud storage buckets add-iam-policy-binding gs://${PROJECT_GOVERNANCE}-shared-staging \
  --member="serviceAccount:service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform.iam.gserviceaccount.com" \
  --role="roles/storage.objectAdmin"

gcloud storage buckets add-iam-policy-binding gs://${PROJECT_GOVERNANCE}-shared-staging \
  --member="serviceAccount:service-${PROJECT_NUMBER_SELLERS}@gcp-sa-aiplatform.iam.gserviceaccount.com" \
  --role="roles/storage.objectAdmin"

ক্রস-প্রোজেক্ট এজেন্ট গেটওয়ে বাইন্ডিং কীভাবে কাজ করে

এই ধাপে, আপনি স্পোক প্রোজেক্টে (PROJECT_SELLERS) বিক্রেতা এজেন্ট ডিপ্লয় করবেন এবং PROJECT_GOVERNANCE-এ সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে ইগ্রেস রাউট করার জন্য তাদের কনফিগার করবেন:

# !-- for example purposes -- NOT a command to execute --!
# snippet from deploy_burger.py
burger_config = {
    "staging_bucket": staging_bucket_uri,
    "gcs_dir_name": "burger_agent",
    "display_name": "burger-seller-agent-adk",
    "identity_type": "AGENT_IDENTITY",
    "agent_gateway_config": {
        "agent_to_anywhere_config": {
            "agent_gateway": f"projects/{args.governance_project}/locations/{args.region}/agentGateways/{args.gateway}"
        }
    },
}
deployed_burger = client.agent_engines.create(agent=burger_playground, config=burger_config)

যেহেতু আমাদের ইউনিফায়েড অ্যাক্সেস নীতিতে নিয়ম ১ আগে থেকেই সেট করা আছে, তাই Google Cloud API-তে কন্টেনার ইনিশিয়ালাইজ করার অনুরোধ গেটওয়ের মাধ্যমে কোনও বাধা ছাড়াই অনুমোদিত হয়।

PROJECT_SELLERS-এ বার্গার ও পিৎজা বিক্রেতা এজেন্ট ডিপ্লয় করা

# 1. deploy Burger Seller Agent to PROJECT_SELLERS
uv run --directory ./cross-project-multiagent python deploy_burger.py \
  --project=${PROJECT_SELLERS} \
  --region=${REGION} \
  --governance-project=${PROJECT_GOVERNANCE} \
  --gateway=projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agentGateways/${AGW_NAME}
# 2. deploy Pizza Seller Agent to PROJECT_SELLERS
uv run --directory ./cross-project-multiagent python deploy_pizza.py \
  --project=${PROJECT_SELLERS} \
  --region=${REGION} \
  --governance-project=${PROJECT_GOVERNANCE} \
  --gateway=projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agentGateways/${AGW_NAME}

বিক্রেতার গেটওয়ে রাউটিং যাচাই করুন

# retrieve deployed seller reasoning engine IDs
export BURGER_ENGINE_ID=$(grep BURGER_SELLER_AGENT_ID cross-project-multiagent/burger_agent.env | awk -F'/' '{print $NF}')
export PIZZA_ENGINE_ID=$(grep PIZZA_SELLER_AGENT_ID cross-project-multiagent/pizza_agent.env | awk -F'/' '{print $NF}')

echo "Burger Engine ID: ${BURGER_ENGINE_ID}"
echo "Pizza Engine ID:  ${PIZZA_ENGINE_ID}"
# inspect runtime configuration for both Seller Agents
for ENGINE_ID in ${BURGER_ENGINE_ID} ${PIZZA_ENGINE_ID}; do
  curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_SELLERS}/locations/${REGION}/reasoningEngines/${ENGINE_ID}" \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    | jq '{displayName: .displayName, identityType: .spec.identityType, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'
done

PROJECT_CONCIERGE-এ পারচেজিং কনসিয়ার্জ এজেন্ট ডিপ্লয় করা

# deploy Purchasing Concierge to PROJECT_CONCIERGE
uv run --directory ./cross-project-multiagent python deploy_concierge_adk.py \
  --project=${PROJECT_CONCIERGE} \
  --region=${REGION} \
  --staging-bucket=gs://${PROJECT_GOVERNANCE}-shared-staging \
  --gateway-name=${AGW_NAME} \
  --gateway-project=${PROJECT_GOVERNANCE}

Purchasing Gateway Routing যাচাই করুন

# retrieve Concierge engine ID
export CONCIERGE_ENGINE_ID=$(grep CONCIERGE_AGENT_ID cross-project-multiagent/concierge_agent.env | awk -F'/' '{print $NF}')
echo "Concierge Engine ID: ${CONCIERGE_ENGINE_ID}"
# inspect runtime configuration for Purchasing Concierge
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" \
  | jq '{displayName: .displayName, identityType: .spec.identityType, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'

আউটপুটে Concierge এজেন্ট রানটাইম আইডেন্টিটি ও প্রোজেক্ট এবং গভর্নেন্স প্রোজেক্ট এজেন্ট গেটওয়ের সাথে বাইন্ডিং দেখানো উচিত।

{
  "displayName": "purchasing-concierge-adk",
  "identityType": "AGENT_IDENTITY",
  "effectiveIdentity": "agents.global.org-${ORG_ID}.system.id.goog/resources/aiplatform/projects/${PROJECT_CONCIERGE}/locations/us-central1/reasoningEngines/${CONCIERGE_ENGINE_ID}",
  "agentGatewayConfig": {
    "agentToAnywhereConfig": {
      "agentGateway": "projects/${PROJECT_GOVERNANCE}/locations/us-central1/agentGateways/centralized-agw"
    }
  }
}

এজেন্ট ডিপ্লয়মেন্টের কাজ এখানেই শেষ... এর পরে সেন্ট্রাল এজেন্ট রেজিস্ট্রিতে এজেন্ট রেজিস্টার করুন বিভাগে যান।

৮. ক্রস-প্রোজেক্ট রেজিস্ট্রি

সেন্ট্রাল এজেন্ট রেজিস্ট্রিতে এজেন্ট রেজিস্টার করা

ক্রস-প্রোজেক্ট আঞ্চলিক mTLS এন্ডপয়েন্ট ও সংখ্যাসূচক প্রোজেক্ট নম্বর ব্যবহার করে PROJECT_GOVERNANCE-এ সেন্ট্রাল এজেন্ট রেজিস্ট্রিতে তিনটি এজেন্টই রেজিস্টার করুন।

এজেন্ট রেজিস্ট্রিতে নন-A2A এজেন্ট হিসেবে পরিষেবা রেজিস্টার করা

# 1. register Burger Seller Agent
gcloud agent-registry services create burger-seller-agent \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} \
  --display-name="Burger Seller Agent" \
  --description="Specialist agent that sells burgers and fries" \
  --agent-spec-type=no-spec \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${BURGER_ENGINE_ID}:query
# 2. register Pizza Seller Agent
gcloud agent-registry services create pizza-seller-agent \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} \
  --display-name="Pizza Seller Agent" \
  --description="Specialist agent that sells pizzas and pasta" \
  --agent-spec-type=no-spec \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_SELLERS}/locations/${REGION}/reasoningEngines/${PIZZA_ENGINE_ID}:query
# 3. register Purchasing Concierge Agent
gcloud agent-registry services create purchasing-concierge-adk \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} \
  --display-name="Purchasing Concierge Agent" \
  --description="Orchestrator concierge agent that routes purchasing requests" \
  --agent-spec-type=no-spec \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.mtls.googleapis.com:443/v1beta1/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}:query

আন্ডারলাইং এজেন্ট রেজিস্ট্রি আইডি ক্যাপচার করুন

# capture underlying Agent Registry Agent UUIDs
export BURGER_AGENT_ID=$(gcloud agent-registry services describe burger-seller-agent --project=${PROJECT_GOVERNANCE} --location=${REGION} --format="value(registryResource)" | awk -F'/' '{print $NF}')
export PIZZA_AGENT_ID=$(gcloud agent-registry services describe pizza-seller-agent --project=${PROJECT_GOVERNANCE} --location=${REGION} --format="value(registryResource)" | awk -F'/' '{print $NF}')
export CONCIERGE_AGENT_ID=$(gcloud agent-registry services describe purchasing-concierge-adk --project=${PROJECT_GOVERNANCE} --location=${REGION} --format="value(registryResource)" | awk -F'/' '{print $NF}')

echo "Burger Agent ID:    ${BURGER_AGENT_ID}"
echo "Pizza Agent ID:     ${PIZZA_AGENT_ID}"
echo "Concierge Agent ID: ${CONCIERGE_AGENT_ID}"

রেজিস্ট্রি কনফিগারেশন সম্পূর্ণ হয়েছে... এরপর A2A ইগ্রেস নীতি কনফিগার করুন বিভাগে যান।

৯. UAP নীতি

ইউনিফায়েড অ্যাক্সেস পলিসিতে A2A ইগ্রেস পলিসি কনফিগার করা

স্ট্রিক্ট ENFORCE মোডে এজেন্ট গেটওয়ের ডিফল্ট ডিনাই আর্কিটেকচারের অধীনে:

  1. নিয়ম ১ (বেসলাইন Google Cloud API): ৩টি প্রোজেক্ট জুড়ে এজেন্ট কন্টেনারকে core-gapi-services-এ পৌঁছানোর অনুমতি দেয়।
  2. নিয়ম ২ (বার্গার বিক্রেতা এজেন্ট: অনুমতি দিন): পারচেজিং কনসিয়ার্জ এজেন্ট ইনস্ট্যান্সকে বিশেষভাবে বার্গার বিক্রেতা এজেন্টকে ইনভোক করার অনুমতি দেয়।
  3. পিৎজা বিক্রেতা এজেন্ট (ডিফল্ট হিসেবে প্রত্যাখ্যান করা হয়েছে): ইচ্ছাকৃতভাবে নীতি সংক্রান্ত নিয়ম থেকে বাদ দেওয়া হয়েছে। ENFORCE মোডে (failOpen: false), Concierge-এর মাধ্যমে Pizza Seller-কে ইনভোক করার যেকোনও প্রচেষ্টা HTTP 403 Forbidden-এর সাথে গেটওয়ে পেরিমিটারে অবিলম্বে বন্ধ করা হবে।

কনসিয়ার্জ এজেন্টের পরিচয় তৈরি করুন

# formulate the exact SPIFFE machine identity for the Concierge Agent
export CONCIERGE_SPIFFE_PRINCIPAL="principal://agents.global.org-${ORG_ID}.system.id.goog/resources/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}"
echo "Concierge SPIFFE Principal: ${CONCIERGE_SPIFFE_PRINCIPAL}"

নিয়ম ১ ও ২ সহ ম্যানিফেস্ট আপডেট করুন

আগে থেকে থাকা নিয়মগুলি ওভাররাইট না করে অ্যাক্সেস নীতি নিরাপদে আপডেট করতে, নিয়ম ১ (মূল Google API) এবং নিয়ম ২ (বার্গার বিক্রেতা এজেন্ট) সহ সম্পূর্ণ কনসোলিডেট করা ম্যানিফেস্ট সংজ্ঞায়িত করুন:

# create consolidated policy manifest with Rule 1 and Rule 2
cat > cfg/uap-rules-consolidated.json << EOF
[
  {
    "description": "Rule 1: Allow agent runtimes across all 3 projects to reach Core Google APIs",
    "effect": "ALLOW",
    "principals": [
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_GOVERNANCE}",
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}",
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_SELLERS}"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.resource_type == 'ENDPOINT' && ( \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/endpoints/core-gapi-services' || \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/endpoints/${ENDPOINT_ID}' || \
         destination.agent_registry.endpoint.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/${REGION}/endpoints/${ENDPOINT_ID}')"
      }
    }
  },
  {
    "description": "Rule 2: Allow Purchasing Concierge to invoke Burger Seller Agent via Central Gateway",
    "effect": "ALLOW",
    "principals": [
      "${CONCIERGE_SPIFFE_PRINCIPAL}",
      "principal://agents.global.org-${ORG_ID}.system.id.goog/attribute.agentIdentity/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}",
      "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.agentIdentity/projects/${PROJECT_NUMBER_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.resource_type == 'AGENT' && ( \
         destination.agent_registry.agent.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agents/burger-seller-agent' || \
         destination.agent_registry.agent.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agents/${BURGER_AGENT_ID}' || \
         destination.agent_registry.agent.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/${REGION}/agents/${BURGER_AGENT_ID}')"
      }
    }
  }
]
EOF

আপডেট করা অ্যাক্সেস নীতি প্রয়োগ করুন

--details-rules ব্যবহার করে কনসোলিডেট করা নিয়ম ম্যানিফেস্ট ডিক্লেরেটিভভাবে প্রয়োগ করুন:

# update IAM access policy with consolidated manifest (Rule 1 + Rule 2)
gcloud iam access-policies update ${UAP_POLICY_NAME} \
  --details-rules=cfg/uap-rules-consolidated.json \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

IAM অ্যাক্সেস নীতি সংক্রান্ত বিবরণ যাচাই করুন

# inspect updated access policy
gcloud iam access-policies describe ${UAP_POLICY_NAME} \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

স্যাম্পেল আউটপুট:

details:
  rules:
  - conditions:
      iap.googleapis.com:
        expression: destination.is_registered == true && destination.agent_registry.resource_type
          == 'ENDPOINT' && (destination.agent_registry.endpoint.name == 'projects/${PROJECT_GOVERNANCE}/locations/us-central1/endpoints/core-gapi-services'
          || destination.agent_registry.endpoint.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/us-central1/endpoints/${ENDPOINT_ID}')
    description: 'Rule 1: Allow agent runtimes across all 3 projects to reach Core
      Google APIs'
    effect: ALLOW
    operation:
      permissions:
      - iap.googleapis.com/resources.egressViaIAP
    principals:
    - principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_GOVERNANCE}
    - principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}
    - principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_SELLERS}
  - conditions:
      iap.googleapis.com:
        expression: (destination.is_registered == true) && (destination.agent_registry.resource_type
          == 'AGENT') && (destination.agent_registry.agent.name == 'projects/${PROJECT_GOVERNANCE}/locations/us-central1/agents/burger-seller-agent'
          || destination.agent_registry.agent.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/us-central1/agents/${BURGER_AGENT_ID}')
    description: 'Rule 2: Allow Purchasing Concierge to invoke Burger Seller Agent
      via Central Gateway'
    effect: ALLOW
    operation:
      permissions:
      - iap.googleapis.com/resources.egressViaIAP
    principals:
    - principal://agents.global.org-${ORG_ID}.system.id.goog/resources/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}/locations/us-central1/reasoningEngines/${CONCIERGE_ENGINE_ID}
name: projects/${PROJECT_GOVERNANCE}/locations/global/accessPolicies/uap-policy-centralized-agw

এর মাধ্যমে নীতি সেট-আপ করার প্রক্রিয়া শেষ হল... এর পরে গভর্ন্যান্স নীতি পরীক্ষা ও যাচাই করা বিভাগে যান।

১০. নীতি যাচাই করুন

Cloud Logging-এর মাধ্যমে গভর্নেন্স নীতি পরীক্ষা ও যাচাই করুন

এই বিভাগে, আপনি Agent Runtime AI Playground-এ ক্রস-প্রোজেক্ট এজেন্ট-টু-এজেন্ট (A2A) ইন্টার‍্যাকশন পরীক্ষা করবেন, স্ট্রিক্ট ENFORCE মোডে আসল পেরিমিটার HTTP 403 Forbidden ব্লক করা পর্যবেক্ষণ করবেন, ইউনিফায়েড অ্যাক্সেস নীতি লাইভ পরিবর্তন করবেন এবং অবিলম্বে অর্ডার অনুমোদন যাচাই করবেন।

ধাপ ১: PROJECT_CONCIERGE-এ Agent Runtime AI Playground খুলুন

  1. Google Cloud Console খুলুন।
  2. সবচেয়ে উপরে প্রোজেক্ট বেছে নেওয়ার বারে, PROJECT_CONCIERGE-এ পাল্টে নিন।
  3. নেভিগেশন মেনুতে, এজেন্ট প্ল্যাটফর্ম > এজেন্ট > ডেপ্লয়মেন্ট বিকল্পে যান।
  4. purchasing-concierge-adk-এ ক্লিক করুন।
  5. স্ক্রিনের ডানদিকে ইন্টার‍্যাক্টিভ চ্যাট ইন্টারফেস খুলতে Playground বেছে নিন।

ধাপ ২: বার্গার অর্ডার টেস্ট করুন (নিয়ম ২ ম্যাচ -> ২০০ ঠিক আছে)

Playground চ্যাট উইন্ডোতে, নিম্নলিখিত অর্ডার প্রম্পট জমা দিন:

I would like 10 Classic Cheeseburgers. Place this order now.

এবং যদি একটি নিশ্চিতকরণ প্রতিক্রিয়া প্রয়োজন হয়, নিম্নলিখিত উত্তর জমা দিন:

Confirmed, please place the order.

অন্যথায়, Cloud Shell / টার্মিনাল থেকে প্রোগ্রাম্যাটিক্যালি পরীক্ষা করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input={'message': 'I would like 22 Spicy Cajun Burgers please. Place this order now.'})
print(response)
"

আর যদি কনফার্মেশন উত্তরের প্রয়োজন হয়, তাহলে এই কমান্ড ব্যবহার করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input='Yes please place the order now.')
print(response['text'])
"

পর্দার পিছনে কী হয়:

  1. ডাইনামিক ডিসকভারি: সেশন শুরু করার সময়, burger-seller-agent-এর জন্য আঞ্চলিক mTLS এন্ডপয়েন্ট খুঁজে পেতে, Purchasing Concierge, PROJECT_GOVERNANCE-এ (নিয়ম ১ দ্বারা অনুমোদিত Agent Gateway-এর মাধ্যমে core-gapi-services-এর মাধ্যমে) Central Agent Registry-কে কোয়েরি করেছে।
  2. ইনটেন্ট রেজোলিউশন ও A2A ইনভোকেশন: পারচেজিং কনসিয়ার্জের মধ্যে Gemini খাবারের অর্ডার সংক্রান্ত ইনটেন্ট পার্স করে এবং https://${REGION}-aiplatform.mtls.googleapis.com/.../reasoningEngines/${BURGER_ENGINE_ID}-এ আউটবাউন্ড RPC-এর মাধ্যমে বার্গার সেলার এজেন্টকে ইনভোক করে।
  3. গেটওয়ে ইন্টারসেপশন ও SPIFFE প্রোপাগেশন: ইগ্রেস ট্রাফিক agent_gateway_config-এর মাধ্যমে ক্যাপচার করা হয় এবং PROJECT_GOVERNANCE-এ সেন্ট্রাল এজেন্ট গেটওয়েতে ডাইরেক্ট করা হয়, যা Concierge-এর ক্রিপ্টোগ্রাফিক SPIFFE পরিচয় (principal://...) বহন করে।
  4. IAP v2 নীতি মূল্যায়ন: Central Agent Gateway, IAP অনুমোদনের এক্সটেনশন (authzExtension) চালু করে। IAP v2, IAM ইউনিফায়েড অ্যাক্সেস নীতিতে নিয়ম ২ মূল্যায়ন করে। যেহেতু কলার ${CONCIERGE_SPIFFE_PRINCIPAL}-এর সাথে এবং টার্গেট burger-seller-agent-এর সাথে ম্যাচ করে, তাই IAP ALLOW (granted: true) রিটার্ন করে।
  5. ক্রস-প্রোজেক্ট এক্সিকিউশন: এজেন্ট গেটওয়ে অনুমোদিত অনুরোধ ক্রস-প্রোজেক্ট করে PROJECT_SELLERS-এ পাঠায়, যেখানে বার্গার সেলার রিজনিং ইঞ্জিন অর্ডার প্রসেস করে এবং কনফার্মেশন পাঠায়।

প্রত্যাশিত উত্তর:

Your order for 10 Classic Cheeseburger(s) has been placed!
Here is a summary of your order:
- 10x Classic Cheeseburger @ IDR 85,000/each = IDR 850,000

Total: IDR 850,000
Your Order ID is: e8f9c732-f347-4cc4-acff-cfe09ccbeddd

ধাপ ৩: Agent Gateway ও IAP v2 অডিট লগ (HTTP 200 / অনুমোদিত) চেক করুন

PROJECT_GOVERNANCE-এ কোয়েরি এজেন্ট গেটওয়ে অনুরোধের লগ:

# query Agent Gateway logs for successful 200 OK requests
gcloud logging read "
  logName=\"projects/${PROJECT_GOVERNANCE}/logs/networkservices.googleapis.com%2Fgateway_requests\"
  AND jsonPayload.authzPolicyInfo.result=\"ALLOWED\"
" \
  --project="${PROJECT_GOVERNANCE}" \
  --limit=10 \
  --format="table(
    timestamp.date('%H:%M:%S'):label=TIME,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ,
    httpRequest.requestUrl:label=URL
  )"

লগগুলি উভয় স্পোক প্রোজেক্ট (PROJECT_CONCIERGE এবং PROJECT_SELLERS) থেকে উদ্ভূত আউটবাউন্ড ট্রাফিক ক্যাপচার করবে, যার মধ্যে Gemini রিজনিং কল (generateContent), Cloud Trace টেলিমেট্রি (/v1/traces) এবং IAM ক্রেডেনশিয়াল লুকআপের মতো ইগ্রেস ফিল্ড থাকবে—যা নিয়ম ১ (core-gapi-services) দ্বারা স্বচ্ছভাবে ইন্টারসেপ্ট এবং অনুমোদিত হবে।

নীতি ভার্সন POLICY_VERSION_V2 যাচাই করতে IAP v2 ক্লাউড অডিট ডেটা অ্যাক্সেস লগ কোয়েরি করুন:

# query IAP v2 audit logs with shortened principal and resource fields
gcloud logging read "
  logName=\"projects/${PROJECT_GOVERNANCE}/logs/cloudaudit.googleapis.com%2Fdata_access\"
  AND protoPayload.serviceName=\"iap.googleapis.com\"
" \
  --project="${PROJECT_GOVERNANCE}" \
  --limit=5 \
  --format="table(
    timestamp.date('%H:%M:%S'):label=TIME,
    protoPayload.authenticationInfo.principalSubject.sub('\.global\..*\/reasoningEngines\/', '.[...]/reasoningEngines/'):label=CALLER,
    protoPayload.authorizationInfo[0].granted:label=GRANTED,
    protoPayload.metadata.destination.agent_registry.resource_type.basename():label=TYPE,
    protoPayload.metadata.destination.agent_registry.resource_id.basename():label=RESOURCE_ID,
    protoPayload.authorizationInfo[0].permission.basename():label=PERMISSION
  )"

স্যাম্পেল আউটপুট:

TIME      CALLER                                                            GRANTED  TYPE      RESOURCE_ID     PERMISSION
HH:MM:SS  principal://agents.[...]/reasoningEngines/${CONCIERGE_ENGINE_ID}  True     Endpoint  ${ENDPOINT_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${BURGER_ENGINE_ID}     True     Endpoint  ${ENDPOINT_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${CONCIERGE_ENGINE_ID}  True     Endpoint  ${ENDPOINT_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${BURGER_ENGINE_ID}     True     Endpoint  ${ENDPOINT_ID}  resources.egressViaIAP

ধাপ ৪: পিৎজা অর্ডার পরীক্ষা করা (ডিফল্ট অস্বীকার -> HTTP 403 নিষিদ্ধ এনফোর্স করা হয়েছে)

একই Playground চ্যাট উইন্ডোতে, পিৎজা অর্ডার করার জন্য নিম্নলিখিত প্রম্পট জমা দিন:

I would like 10 BBQ Chicken Pizzas. Place this order now.

এবং যদি একটি নিশ্চিতকরণ প্রতিক্রিয়া প্রয়োজন হয়, নিম্নলিখিত উত্তর জমা দিন:

Confirmed, please place the order.

অন্যথায়, Cloud Shell / টার্মিনাল থেকে প্রোগ্রাম্যাটিক্যালি পরীক্ষা করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input='I would like 8 Hawaiian pizzas, please. Place this order now.')
print(response)
"

আর যদি কনফার্মেশন উত্তরের প্রয়োজন হয়, তাহলে এই কমান্ড ব্যবহার করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input='Yes please place the order now.')
print(response['text'])
"

প্রত্যাশিত উত্তর:

I apologize, but I am unable to process that request at the moment. It seems
there was an issue connecting to the pizza seller agent. Please try again later.

পর্দার পিছনে কী হয়:

  1. ডায়নামিক ডিসকভারি: স্টার্টআপের সময় পারচেজিং কনসিয়ার্জ সেন্ট্রাল এজেন্ট রেজিস্ট্রি থেকে pizza-seller-agent এন্ডপয়েন্ট সমাধান করেছে।
  2. ইনটেন্ট রেজোলিউশন ও A2A ইনভোকেশন: পারচেজিং কনসিয়ার্জের মধ্যে থাকা Gemini, PROJECT_SELLERS-এ পিৎজা বিক্রেতার এন্ডপয়েন্টে পিৎজা অর্ডারের অনুরোধ পাঠানোর চেষ্টা করে।
  3. গেটওয়ে ইন্টারসেপশন: আউটবাউন্ড RPC agent_gateway_config-এর মাধ্যমে ক্যাপচার করা হয় এবং সেন্ট্রাল এজেন্ট গেটওয়েতে পাঠানো হয়।
  4. IAP v2 নীতি মূল্যায়ন (ডিফল্ট প্রত্যাখ্যান): সেন্ট্রাল এজেন্ট গেটওয়ে IAP v2-কে ইনভোক করে। যেহেতু pizza-seller-agent-এর সাথে মেলে এমন কোনও নিয়ম ইউনিফায়েড অ্যাক্সেস নীতিতে নেই, তাই IAP DENY (granted: false) রিটার্ন করে।
  5. কঠোর পেরিমিটার ব্লক: Authz এক্সটেনশন এনফোর্স মোডে (failOpen: false) থাকার কারণে, সেন্ট্রাল এজেন্ট গেটওয়ে অবিলম্বে আউটবাউন্ড কানেকশন বন্ধ করে দেয় এবং HTTP 403 Forbidden রিটার্ন করে। ট্রাফিক গেটওয়ে থেকে কখনও বের হয় না এবং PROJECT_SELLERS-এ কখনও পৌঁছায় না।

ধাপ ৫: ব্লক করা অনুরোধের (HTTP 403 / DENIED) জন্য এজেন্ট গেটওয়ে লগ চেক করা

# query Agent Gateway logs for blocked 403 requests
gcloud logging read "
  logName=\"projects/${PROJECT_GOVERNANCE}/logs/networkservices.googleapis.com%2Fgateway_requests\"
  AND httpRequest.status=403
" \
  --project="${PROJECT_GOVERNANCE}" \
  --limit=5 \
  --format="table(
    timestamp.date('%H:%M:%S'):label=TIME,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ,
    httpRequest.requestUrl:label=URL
  )"

স্যাম্পেল ডিনাইড লগ আউটপুট:

TIME      METHOD  STATUS  AUTHZ   URL
HH:MM:SS  POST    403     DENIED  https://us-central1-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_SELLERS}/locations/us-central1/reasoningEngines/${PIZZA_ENGINE_ID}:query

প্রত্যাখ্যাত সিদ্ধান্তের জন্য IAP v2 ডেটা অ্যাক্সেস অডিট লগ কোয়েরি করুন:

# query IAP v2 audit logs with shortened principal and resource fields
gcloud logging read "
  logName=\"projects/${PROJECT_GOVERNANCE}/logs/cloudaudit.googleapis.com%2Fdata_access\"
  AND protoPayload.serviceName=\"iap.googleapis.com\"
" \
  --project="${PROJECT_GOVERNANCE}" \
  --limit=5 \
  --format="table(
    timestamp.date('%H:%M:%S'):label=TIME,
    protoPayload.authenticationInfo.principalSubject.sub('\.global\..*\/reasoningEngines\/', '.[...]/reasoningEngines/'):label=CALLER,
    protoPayload.authorizationInfo[0].granted:label=GRANTED,
    protoPayload.metadata.destination.agent_registry.resource_type.basename():label=TYPE,
    protoPayload.metadata.destination.agent_registry.resource_id.basename():label=RESOURCE_ID,
    protoPayload.authorizationInfo[0].permission.basename():label=PERMISSION
  )"

স্যাম্পেল ডিনাইড অডিট লগ আউটপুট:

TIME      CALLER                                                            GRANTED  TYPE      RESOURCE_ID     PERMISSION
HH:MM:SS  principal://agents.[...]/reasoningEngines/${PIZZA_ENGINE_ID}      True     Endpoint  ${REGISTRY_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${PIZZA_ENGINE_ID}      True     Endpoint  ${REGISTRY_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${CONCIERGE_ENGINE_ID}  False    Agent     ${REGISTRY_ID}  resources.egressViaIAP
HH:MM:SS  principal://agents.[...]/reasoningEngines/${PIZZA_ENGINE_ID}      True     Endpoint  ${REGISTRY_ID}  resources.egressViaIAP

ধাপ ৬: পিৎজা এজেন্টকে ডাইনামিকভাবে ইগ্রেস অ্যাক্সেস প্রদান করা

নিয়ম ১ (কোর API), নিয়ম ২ (বার্গার বিক্রেতা এজেন্ট) এবং এখন নিয়ম ৩ (পিজ্জা বিক্রেতা এজেন্ট) অন্তর্ভুক্ত করতে নতুন cfg/uap-rules-update-3.json তৈরি করুন

# create addendum to update policy manifest with Rule 3 for Pizza Agent
cat > cfg/uap-rules-update-3.json << EOF
[
  {
    "description": "Rule 3: Allow Purchasing Concierge to invoke Pizza Seller Agent via Central Gateway",
    "effect": "ALLOW",
    "principals": [
      "${CONCIERGE_SPIFFE_PRINCIPAL}"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.resource_type == 'AGENT' && ( \
         destination.agent_registry.agent.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agents/pizza-seller-agent' || \
         destination.agent_registry.agent.name == 'projects/${PROJECT_GOVERNANCE}/locations/${REGION}/agents/${PIZZA_AGENT_ID}' || \
         destination.agent_registry.agent.name == 'projects/${PROJECT_NUMBER_GOVERNANCE}/locations/${REGION}/agents/${PIZZA_AGENT_ID}')"
      }
    }
  }
]
EOF

লাইভ নীতি আপডেট প্রয়োগ করুন:

# update IAM access policy with Pizza rule
gcloud iam access-policies update ${UAP_POLICY_NAME} \
  --add-details-rules=cfg/uap-rules-update-3.json \
  --project=${PROJECT_GOVERNANCE} \
  --location=global

ধাপ ৭: পিৎজা এজেন্টকে আবার কোয়েরি করা (অবিলম্বে ২০০ OK সাফল্য)

Playground চ্যাট উইন্ডোতে, পিৎজা অর্ডার করার প্রম্পট আবার জমা দিন:

I would like 10 BBQ Chicken Pizzas. Place this order now.

এবং যদি একটি নিশ্চিতকরণ প্রতিক্রিয়া প্রয়োজন হয়, নিম্নলিখিত উত্তর জমা দিন:

Confirmed, please place the order.

অন্যথায়, Cloud Shell / টার্মিনাল থেকে প্রোগ্রাম্যাটিক্যালি পরীক্ষা করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input='I would like 11 Veggie pizzas, please. Place this order now.')
print(response)
"

আর যদি কনফার্মেশন উত্তরের প্রয়োজন হয়, তাহলে এই কমান্ড ব্যবহার করুন:

uv run --directory ./cross-project-multiagent python -c "
import vertexai
from vertexai.preview import reasoning_engines
vertexai.init(project='${PROJECT_CONCIERGE}', location='${REGION}')
agent = reasoning_engines.ReasoningEngine('projects/${PROJECT_CONCIERGE}/locations/${REGION}/reasoningEngines/${CONCIERGE_ENGINE_ID}')
response = agent.query(input='Yes please place the order now.')
print(response['text'])
"

প্রত্যাশিত উত্তর:

Your order has been placed!

**Order ID:** 8d6c13d7-31dc-4d80-b6a7-80d1e50b6411

**Order Details:**
*   10 x BBQ Chicken Pizza @ IDR 130,000 each = IDR 1,300,000

**Total: IDR 1,300,000**

পর্দার পিছনে কী হয়:

  1. ডায়নামিক নীতি রিফ্রেশ: IAM ইউনিফায়েড অ্যাক্সেস নীতি আপডেট করলে তা IAP মূল্যায়ন ইঞ্জিনে অবিলম্বে কার্যকর হয়, এর জন্য কোনও ডাউনটাইম বা কন্টেনার আবার ডেপ্লয় করার প্রয়োজন হয় না।
  2. A2A ইনভোকেশন: কনসিয়ার্জ সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে অনুরোধ পাঠায়।
  3. IAP v2 নীতি মূল্যায়ন (অনুমোদন): IAP v2 নিয়ম ৩-এর সাথে মেলে, কলারের পরিচয় ও টার্গেট CEL এক্সপ্রেশন যাচাই করে এবং ALLOW (granted: true) রিটার্ন করে।
  4. ক্রস-প্রোজেক্ট এক্সিকিউশন: সেন্ট্রাল এজেন্ট গেটওয়ে অনুমোদিত ট্রাফিককে PROJECT_SELLERS-এ প্রক্সি করে, যেখানে পিৎজা বিক্রেতা অর্ডার প্রসেস করে।

ধাপ ৮: অনুমোদিত পিৎজা অনুরোধের জন্য এজেন্ট গেটওয়ে লগগুলি পরীক্ষা করুন

# query Agent Gateway logs for successful 200 OK requests
gcloud logging read "
  logName=\"projects/${PROJECT_GOVERNANCE}/logs/networkservices.googleapis.com%2Fgateway_requests\"
  AND jsonPayload.authzPolicyInfo.result=\"ALLOWED\"
" \
  --project="${PROJECT_GOVERNANCE}" \
  --limit=10 \
  --format="table(
    timestamp.date('%H:%M:%S'):label=TIME,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ,
    httpRequest.requestUrl:label=URL
  )"

অনুমতি দেওয়া লগ আউটপুটের স্যাম্পেল:

TIME      METHOD  STATUS  AUTHZ    URL
HH:MM:SS  POST    200     ALLOWED  https://aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_SELLERS}/locations/global/publishers/google/models/gemini-3.5-flash:generateContent
HH:MM:SS  POST    200     ALLOWED  https://us-central1-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_SELLERS}/locations/us-central1/reasoningEngines/${PIZZA_ENGINE_ID}:query

এর মাধ্যমে টেস্টিং ও যাচাইকরণ প্রক্রিয়া শেষ হয়... এর পরে ক্লিন-আপ বিভাগ।

১১. মুছুন

এই কোডল্যাবে ব্যবহৃত রিসোর্সের জন্য আপনার Google Cloud অ্যাকাউন্টে চার্জ এড়াতে, টিয়ারডাউন ধাপগুলি কঠোরভাবে বিপরীত নির্ভরতা ক্রমে কার্যকর করুন:

১. রিজনিং ইঞ্জিন ডিপ্লয়মেন্ট ক্লিন-আপ করুন

রিজনিং ইঞ্জিন মুছে দিতে এবং তাদের দীর্ঘ-চলমান অপারেশনের জন্য অপেক্ষা করতে উভয় রানটাইম প্রোজেক্ট জুড়ে অন্তর্ভুক্ত cleanup_old_deployments.py স্ক্রিপ্টটি চালান:

# delete all Reasoning Engines deployed in Concierge and Sellers projects
uv run --directory ./cross-project-multiagent python cleanup_old_deployments.py --project=${PROJECT_CONCIERGE} --region=${REGION}
uv run --directory ./cross-project-multiagent python cleanup_old_deployments.py --project=${PROJECT_SELLERS} --region=${REGION}

বিকল্প হিসেবে, আপনি ইনলাইন রিজনিং ইঞ্জিন তালিকাভুক্ত করতে এবং মুছে ফেলতে পারেন:

uv run --directory ./cross-project-multiagent python -c '
import vertexai
import os
from vertexai.preview import reasoning_engines

region = os.environ.get("REGION", "us-central1")
for proj in [os.environ.get("PROJECT_CONCIERGE"), os.environ.get("PROJECT_SELLERS")]:
    if not proj:
        continue
    print(f"Cleaning reasoning engines in {proj}...")
    vertexai.init(project=proj, location=region)
    for eng in reasoning_engines.ReasoningEngine.list():
        print(f"  Deleting {eng.resource_name} ({eng.display_name})...")
        eng.delete()
'

২. এজেন্ট রেজিস্ট্রি পরিষেবা মুছুন

# delete agent registry services in Central Governance Project
for SERVICE in burger-seller-agent pizza-seller-agent purchasing-concierge-adk core-gapi-services; do
  gcloud agent-registry services delete ${SERVICE} \
    --project=${PROJECT_GOVERNANCE} \
    --location=${REGION} \
    --quiet || true
done

৩. IAM ইউনিফায়েড অ্যাক্সেস পলিসি বাইন্ডিং ও অ্যাক্সেস পলিসি মুছে দিন

# 1. delete IAM policy binding
gcloud -q iam policy-bindings delete ${UAP_BINDING_NAME} \
  --project=${PROJECT_GOVERNANCE} \
  --location=global || true

# 2. delete IAM access policy
gcloud -q iam access-policies delete ${UAP_POLICY_NAME} \
  --project=${PROJECT_GOVERNANCE} \
  --location=global || true

৪. এজেন্ট গেটওয়ে ও নিরাপত্তা নীতি মুছে দিন

# 1. delete authorization policy
gcloud beta network-security authz-policies delete ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE} --quiet || true

# 2. delete authorization extension
gcloud service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap \
  --location=${REGION} \
  --project=${PROJECT_GOVERNANCE} --quiet || true
# 3. delete agent gateway
gcloud network-services agent-gateways delete ${AGW_NAME} \
  --project=${PROJECT_GOVERNANCE} \
  --location=${REGION} --quiet || true

৫. ক্রস-প্রোজেক্ট IAM বাইন্ডিং ও কাস্টম রোল সরিয়ে দিন

# 1. remove custom role and network viewer bindings for spoke service agents
for NUM in "${PROJECT_NUMBER_CONCIERGE}" "${PROJECT_NUMBER_SELLERS}"; do
  SA="service-${NUM}@gcp-sa-aiplatform.iam.gserviceaccount.com"
  
  gcloud projects remove-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="serviceAccount:${SA}" \
    --role="projects/${PROJECT_GOVERNANCE}/roles/ar_agw_cross_project_sa" --quiet || true

  gcloud projects remove-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="serviceAccount:${SA}" \
    --role="roles/networkservices.viewer" --quiet || true
done
# 2. remove registry viewer permissions across both spoke projects
for NUM in "${PROJECT_NUMBER_CONCIERGE}" "${PROJECT_NUMBER_SELLERS}"; do
  for MEMBER in \
    "serviceAccount:service-${NUM}@gcp-sa-aiplatform.iam.gserviceaccount.com" \
    "serviceAccount:service-${NUM}@gcp-sa-aiplatform-re.iam.gserviceaccount.com" \
    "serviceAccount:${NUM}-compute@developer.gserviceaccount.com" \
    "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${NUM}"; do
      gcloud projects remove-iam-policy-binding ${PROJECT_GOVERNANCE} \
        --member="${MEMBER}" \
        --role="roles/agentregistry.viewer" --quiet || true
  done
done
# 3. remove project viewer permissions
for MEMBER in \
  "serviceAccount:${PROJECT_NUMBER_CONCIERGE}-compute@developer.gserviceaccount.com" \
  "serviceAccount:service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform.iam.gserviceaccount.com"; do
    gcloud projects remove-iam-policy-binding ${PROJECT_GOVERNANCE} \
      --member="${MEMBER}" \
      --role="roles/viewer" --quiet || true
done
# 4. remove spoke-to-spoke delegation in Sellers project
for MEMBER in \
  "serviceAccount:service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform.iam.gserviceaccount.com" \
  "serviceAccount:service-${PROJECT_NUMBER_CONCIERGE}@gcp-sa-aiplatform-re.iam.gserviceaccount.com" \
  "serviceAccount:${PROJECT_NUMBER_CONCIERGE}-compute@developer.gserviceaccount.com" \
  "principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJECT_NUMBER_CONCIERGE}"; do
    gcloud projects remove-iam-policy-binding ${PROJECT_SELLERS} \
      --member="${MEMBER}" \
      --role="roles/aiplatform.user" --quiet || true
done
# 5. delete custom IAM role after all bindings have been unlinked
gcloud iam roles delete ar_agw_cross_project_sa \
  --project=${PROJECT_GOVERNANCE} --quiet || true

সেট-আপ করার সময় আপনি roles/iam.accessPolicyAdmin ও roles/resourcemanager.projectIamAdmin অ্যাসাইন করে থাকলে, সবচেয়ে কম-প্রিভিলেজ ফিরিয়ে আনতে আপনার অ্যাক্টিভ ব্যবহারকারীর অ্যাকাউন্ট থেকে সেগুলি সরিয়ে দিন:

# 6. remove Access Policy Admin and Project IAM Admin roles from user
for ROLE in "roles/iam.accessPolicyAdmin" "roles/resourcemanager.projectIamAdmin"; do
  gcloud projects remove-iam-policy-binding ${PROJECT_GOVERNANCE} \
    --member="user:$(gcloud config get-value account)" \
    --role="${ROLE}" \
    --condition=None --quiet || true
done

৬. অডিট ডেটা লগিং ও Org নীতি সংক্রান্ত সীমাবদ্ধতা আগের অবস্থায় ফিরিয়ে আনুন

# 1. Export current Central Governance IAM policy
gcloud projects get-iam-policy ${PROJECT_GOVERNANCE} --format=json > cfg/gov_iam_policy.json
# 2. Filter out iap.googleapis.com from auditConfigs
python3 -c "
import json
with open('cfg/gov_iam_policy.json') as f:
    policy = json.load(f)

if 'auditConfigs' in policy:
    # Remove iap.googleapis.com; if nothing else remains, clear the list
    policy['auditConfigs'] = [
        ac for ac in policy['auditConfigs'] if ac.get('service') != 'iap.googleapis.com'
    ]

with open('cfg/gov_iam_policy.json', 'w') as f:
    json.dump(policy, f, indent=2)
"
# 3. Apply the updated policy to revert audit logging to default
gcloud projects set-iam-policy ${PROJECT_GOVERNANCE} cfg/gov_iam_policy.json

৭. Org নীতি সংক্রান্ত সীমাবদ্ধতা আগের অবস্থায় ফিরিয়ে আনুন

# revert iam v3 access policy binding org policy on project to org level setting
gcloud org-policies delete iam.managed.disableAccessPolicyBinding --project=${PROJECT_GOVERNANCE}

৮. শেয়ার করা GCS স্টেজিং বাকেট ও লোকাল আর্টিফ্যাক্ট মুছে দিন

# delete central staging bucket
gcloud storage rm -r gs://${PROJECT_GOVERNANCE}-shared-staging
# remove local configuration manifests, environment files, and application
rm -rf cfg/ cross-project-multiagent/ *.env

এর মাধ্যমে ক্লিন-আপের অংশ শেষ হল... এর পরে উপসংহার!

১২. উপসংহার

অভিনন্দন! আপনি Vertex AI Agent Runtime, Central Agent Gateway, Agent Registry এবং IAM Unified Access Policies (UAP) ব্যবহার করে Google Cloud-এ মাল্টি-প্রোজেক্ট এজেন্ট-টু-এজেন্ট (A2A) আর্কিটেকচার ডিপ্লয় ও পরিচালনা করেছেন।

মূল ধারণার সারসংক্ষেপ

  • সেন্ট্রালাইজড ইগ্রেস পেরিমিটার: agentGatewayConfig ব্যবহার করে PROJECT_GOVERNANCE-এ সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে স্পোক রানটাইম কন্টেনার (PROJECT_CONCIERGE, PROJECT_SELLERS) রাউট করা হয়েছে।
  • ডিক্লারেটিভ গভর্নেন্স (UAP): IAP v2-এর মাধ্যমে গেটওয়েতে মূল্যায়ন করা একটি অডিটযোগ্য IAM অ্যাক্সেস নীতির মাধ্যমে ফ্র্যাগমেন্টেড প্রতি-রিসোর্স বাইন্ডিং প্রতিস্থাপন করা হয়েছে।
  • ক্রিপ্টোগ্রাফিক পরিচয়: দীর্ঘস্থায়ী কী-এর পরিবর্তে কন্টেনার SPIFFE পরিচয় (principal://...) ব্যবহার করে এনফোর্স করা সবচেয়ে কম-প্রিভিলেজ ইগ্রেস।
  • ডায়নামিক সার্ভিস ডিসকভারি: সেন্ট্রাল এজেন্ট রেজিস্ট্রির মাধ্যমে রানটাইমে পিয়ার এজেন্ট এন্ডপয়েন্ট সমাধান করা হয়েছে, হার্ডকোড করা URL এবং প্রোজেক্ট আইডি বাদ দেওয়া হয়েছে।
  • রানটাইম নীতি সংক্রান্ত তৎপরতা: কন্টেনার রিস্টার্ট না করেই নীতি আপডেটের মাধ্যমে রিয়েল টাইমে ডিফল্ট অস্বীকার (403 Forbidden) থেকে অনুমোদিত (200 OK) অবস্থায় pizza-seller-agent ট্রানজিশন করা হয়েছে।

cosmopup

Cosmopup বলছে: "এজেন্টরা দারুণ—আমি যখন আমার প্রাথমিক উদ্দেশ্য: ঘুমানোর দিকে মনোযোগ দিই, তখন তারা সমস্ত ক্রস-প্রজেক্টের কাজ করে!"

পরবর্তী ধাপ ও ডকুমেন্টেশন