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

১. ভূমিকা

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

তবে, বৃহৎ পরিসরে একাধিক এজেন্ট সিস্টেম পরিচালনা করা গুরুতর নিরাপত্তা, শাসন এবং পরিচালনগত চ্যালেঞ্জ তৈরি করে:

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

এই চ্যালেঞ্জগুলো সমাধান করার জন্য, জেমিনি এন্টারপ্রাইজ এজেন্ট প্ল্যাটফর্ম চারটি মূল স্তম্ভের সমন্বয়ে একটি সমন্বিত শাসন ও সংযোগ নিয়ন্ত্রণ ব্যবস্থা প্রদান করে:

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

কোডল্যাব ব্যবসায়িক পরিস্থিতি: একাধিক প্রকল্পের জন্য খাদ্য ও পানীয় ক্রয়

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

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

চিত্র ১

চিত্র ১. একাধিক প্রকল্পের জন্য কেন্দ্রীভূত শাসনব্যবস্থার কাঠামো

আন্তঃ-প্রকল্প কেন্দ্রীভূত শাসনব্যবস্থা কেন?

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

আন্তঃ-প্রকল্প কেন্দ্রীভূত শাসনব্যবস্থা নীতি প্রণয়নকে এজেন্ট নির্বাহ থেকে পৃথক করে:

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

চিত্র ২

চিত্র ২. ত্রি-স্তরীয় আন্তঃপ্রকল্প শাসন কাঠামো এবং সীমানা

একীভূত অ্যাক্সেস নীতিতে দ্বি-স্তরীয় পরিচয় স্কোপিং মডেল

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

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

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

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

চিত্র ৩

চিত্র ৩. ধাপে ধাপে বাস্তবায়নের ক্রম

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

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

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

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

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

২. সেটআপ

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

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

আপনার প্রকল্পের প্রেক্ষাপট সেট করুন

# 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-এর জন্য ক্লাউড অডিট ডেটা অ্যাক্সেস লগ সক্রিয় করুন

অনাকাঙ্ক্ষিত স্টোরেজ খরচ এড়ানোর জন্য, গুগল ক্লাউড ডিফল্টরূপে ডেটা অ্যাক্সেস অডিট লগ নিষ্ক্রিয় করে রাখে। যেহেতু IAP v2 ডেটা অ্যাক্সেস অডিট লগ হিসাবে অনুমোদনের সিদ্ধান্ত ( granted=true এবং granted=false ) প্রকাশ করে, তাই PROJECT_GOVERNANCEiap.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)"

প্রয়োজনীয় গুগল ক্লাউড এপিআই সক্রিয় করুন

# 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

সমস্ত প্রোজেক্ট জুড়ে এপিআই সক্ষমতা যাচাই করুন

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

তিনটি প্রোজেক্ট জুড়ে এপিআই সমতা যাচাই করতে ক্লাউড শেলে নিম্নলিখিত ভ্যালিডেশন স্ক্রিপ্টটি চালান:

# 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

নমুনা যাচাইকরণ আউটপুট:

আপনার সব এপিআই সক্রিয় দেখতে পাওয়া উচিত।

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

সাংগঠনিক নীতি কনফিগার করুন

ডিফল্ট গুগল ক্লাউড অর্গানাইজেশন পলিসি এমন সীমাবদ্ধতা আরোপ করে যা রিসোর্সগুলিতে IAM v3 অ্যাক্সেস পলিসি বাইন্ডিং সীমিত করে ( constraints/iam.managed.disableAccessPolicyBinding )।

প্রজেক্ট লেভেলে উত্তরাধিকারসূত্রে প্রাপ্ত যেকোনো অর্গানাইজেশন পলিসি সীমাবদ্ধতা উপেক্ষা করতে, অনুমতি দেওয়ার জন্য স্পষ্টভাবে 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

এর মাধ্যমেই সেটআপ পর্ব শেষ হলো... এরপর যাওয়া যাক কোর গুগল এপিআই নিবন্ধন (Register Core Google APIs) অংশে।

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

কোর গুগল এপিআই এন্ডপয়েন্ট পরিষেবা নিবন্ধন করুন

এজেন্ট গেটওয়ের জন্য সেন্ট্রাল এজেন্ট রেজিস্ট্রি-তে গুগল এপিআই ইউআরএল (Google API URL) রেজিস্টার করা প্রয়োজন, যাতে agent_gateway_config দিয়ে কনফিগার করা এজেন্টরা বহির্গামী ট্র্যাফিককে নিরাপদে গুগল ক্লাউডের মূল ব্যাকএন্ড পরিষেবাগুলিতে (যেমন aiplatform , IAM Credentials, এবং Telemetry) রাউট করতে পারে।

এজেন্ট রেজিস্ট্রিতে 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://iamcredentials.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.mtls.googleapis.com \
  --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 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 Unified Access Policies কনফিগার করার সময়, আপনি একটি নির্দিষ্ট একক principal অথবা একটি অ্যাট্রিবিউট-ভিত্তিক principalSet টার্গেট করতে পারেন।

মাত্রা

principal:// (একক মেশিন পরিচয়)

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

আইএএম সিনট্যাক্স

principal://...

principalSet://...

দানাদারত্ব

সূক্ষ্ম-স্তরের (ইনস্ট্যান্স-স্তর): একটি একক, নির্দিষ্ট রিজনিং ইঞ্জিন কন্টেইনার ইনস্ট্যান্সকে শনাক্ত করে।

স্থূল-স্তরের (প্রকল্প-স্তর): এমন সমস্ত রিজনিং ইঞ্জিন শনাক্ত করে যেগুলির একটি সাধারণ প্রকল্প বৈশিষ্ট্য রয়েছে।

ইউআরএন প্যাটার্ন

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}

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

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

স্তর ১ (মৌলিক পরিকাঠামো): একটি প্রকল্পের সকল এজেন্টকে গুগল ক্লাউড এপিআই ( core-gapi-services ) ব্যবহারের জন্য বহির্গমন অ্যাক্সেস প্রদান করা।

জীবনচক্রের প্রভাব

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

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

একীভূত প্রবেশাধিকার নীতি সহ ঘোষণামূলক শাসন (UAP / IAP v2)

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

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

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

এর মাধ্যমেই কোর এপিআই এন্ডপয়েন্ট রেজিস্ট্রেশন শেষ হলো... এরপর আমরা সেন্ট্রালাইজড এজেন্ট গেটওয়ে ডেপ্লয় (Deploy Centralized Agent Gateway) অংশে যাব।

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

কেন্দ্রীয় এজেন্ট গেটওয়ে স্থাপন করুন

$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'

এর মাধ্যমে গেটওয়ে স্থাপন সম্পন্ন হলো... এরপর আমরা অনুমোদন কনফিগার করার অংশে যাব।

৫. অনুমোদন

এজেন্ট গেটওয়ে অনুমোদন এবং ফাউন্ডেশনাল ইউএপি কনফিগার করুন

এজেন্ট গেটওয়ে, আইডেন্টিটি-অ্যাওয়্যার প্রক্সি (IAP v2) ইউনিফাইড অ্যাক্সেস পলিসি (UAP)- এর সাথে সমন্বিত অথরাইজেশন পলিসি ( networksecurity.authzPolicies ) ব্যবহার করে বহির্গামী টুল এবং এজেন্ট ট্র্যাফিককে সুরক্ষিত ও নিয়ন্ত্রণ করে।

অনুমোদন স্থাপত্যের সংক্ষিপ্ত বিবরণ

চিত্র ৪

চিত্র ৪. অনুমোদন কাঠামোর সংক্ষিপ্ত বিবরণ

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

  1. আইএপি সার্ভিস এক্সটেনশন ( authzExtension ) : কঠোর পেরিমিটার জিরো-ট্রাস্ট প্রয়োগের জন্য service: iap.googleapis.com , metadata: iapPolicyVersion: "V2" , এবং failOpen: false দিয়ে কনফিগার করা আঞ্চলিক রিসোর্স।
  2. গেটওয়ে অনুমোদন নীতি ( authzPolicy ) : এটি একটি আঞ্চলিক রিসোর্স যা আপনার এজেন্ট গেটওয়েকে লক্ষ্য করে তৈরি, যার policyProfile: REQUEST_AUTHZ এবং action: CUSTOM , এবং এটি অনুমোদন যাচাই প্রক্রিয়াকে IAP Authz এক্সটেনশনে প্রেরণ করে।
  3. আইএএম ইউনিফাইড অ্যাক্সেস পলিসি ও বাইন্ডিং ( accessPolicy & policyBinding ) : এটি একটি গ্লোবাল আইএএম v3 রিসোর্স যা আইএপি (IAP) দ্বারা মূল্যায়ন করা হয়। এটি কলারের 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}

ধাপ ৩: লেখকের প্রাথমিক সমন্বিত অ্যাক্সেস নীতি (বিধি ১: কোর গুগল এপিআই)

তিনটি প্রজেক্ট principalSet কে core-gapi-services অ্যাক্সেস করার অনুমোদন দিয়ে Rule 1 সহ 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}

তিনটি প্রজেক্ট জুড়েই মৌলিক গুগল ক্লাউড এপিআই থেকে বহির্গমন এখন কঠোর ENFORCE মোডে নিরাপদে অনুমোদিত।

এর মাধ্যমে গেটওয়ে অনুমোদন সেটআপ সম্পন্ন হলো... এরপর আমরা ক্রস-প্রজেক্ট আইএএম অনুমতি কনফিগার করার অংশে যাব।

৬. ক্রস-প্রজেক্ট আইএএম

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

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

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

  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_GOVERNANCEroles/agentregistry.viewer প্রয়োজন।
    • টার্গেট ইনভোকেশন: সেলার রিজনিং ইঞ্জিনগুলোর বিরুদ্ধে কোয়েরি চালানোর জন্য কনসিয়ার্জ এজেন্টের PROJECT_SELLERSroles/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 সেটআপ সম্পন্ন হলো... এরপর আমরা 'Deploy Seller & Concierge Agents' বিভাগে যাব।

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

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

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

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

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_multiproject
# copy multi-agent application files to current working directory
cp -r temp_agw_cuj_arun_multiproject/codelabs/agw-cuj-arun-multiproject ./cross-project-multiagent
# remove temporary directory
rm -rf temp_agw_cuj_arun_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 এ থাকা সেন্ট্রাল এজেন্ট গেটওয়ের মাধ্যমে তাদের বহির্গমন পথ (egress) রাউট করার জন্য কনফিগার করবেন।

# !-- 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)

যেহেতু আমাদের ইউনিফাইড অ্যাক্সেস পলিসিতে নিয়ম ১ আগেই প্রতিষ্ঠিত হয়েছিল, তাই গুগল ক্লাউড এপিআই-এর জন্য কন্টেইনার ইনিশিয়ালাইজেশন অনুরোধগুলি গেটওয়ের মাধ্যমে কোনো বাধা ছাড়াই অনুমোদিত হয়।

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}

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

# 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}'

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

{
  "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"
    }
  }
}

এর মাধ্যমেই এজেন্ট স্থাপন পর্ব শেষ হলো... এরপর আমরা সেন্ট্রাল এজেন্ট রেজিস্ট্রি-তে এজেন্ট নিবন্ধন (Register Agents in Central Agent Registry ) অংশে যাব।

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

কেন্দ্রীয় এজেন্ট রেজিস্ট্রিতে এজেন্টদের নিবন্ধন করুন

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

এজেন্ট রেজিস্ট্রিতে পরিষেবাগুলিকে নন-এ২এ এজেন্ট হিসাবে নিবন্ধন করুন।

# 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.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
# 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.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
# 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.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

অন্তর্নিহিত এজেন্ট রেজিস্ট্রি আইডিগুলি ক্যাপচার করুন

# 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 বহির্গমন নীতিগুলি কনফিগার করুন

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

  1. নিয়ম ১ (বেসলাইন গুগল ক্লাউড এপিআই): তিনটি প্রোজেক্ট জুড়ে এজেন্ট কন্টেইনারগুলিকে core-gapi-services অ্যাক্সেস করার অনুমতি দেয়।
  2. নিয়ম ২ (বার্গার সেলার এজেন্ট: অনুমতি): পারচেজিং কনসিয়ার্জ এজেন্ট ইনস্ট্যান্সকে বিশেষভাবে বার্গার সেলার এজেন্টকে আহ্বান করার অনুমতি দেয়।
  3. পিজ্জা সেলার এজেন্ট (ডিফল্টরূপে প্রত্যাখ্যাত): ইচ্ছাকৃতভাবে পলিসি নিয়ম থেকে বাদ রাখা হয়েছে। ENFORCE মোডে ( failOpen: false ), কনসিয়ার্জ কর্তৃক পিজ্জা সেলারকে আহ্বান করার যেকোনো প্রচেষ্টা গেটওয়ে পেরিমিটারে 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}"

নিয়ম ১ এবং ২ দিয়ে ম্যানিফেস্ট আপডেট করুন।

নিয়ম ১ (কোর এপিআই) এবং এখন নিয়ম ২ (বার্গার সেলার এজেন্ট) অন্তর্ভুক্ত করতে নতুন cfg/uap-rules-update-2.json তৈরি করুন:

# create addendum to update policy manifest with Rule 2 for Burger Agent
cat > cfg/uap-rules-update-2.json << EOF
[
  {
    "description": "Rule 2: Allow Purchasing Concierge to invoke Burger 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/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

হালনাগাদকৃত অ্যাক্সেস নীতি প্রয়োগ করুন

# update IAM access policy with Burger rule
gcloud iam access-policies update ${UAP_POLICY_NAME} \
  --add-details-rules=cfg/uap-rules-update-2.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

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

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

ক্লাউড লগিংয়ের মাধ্যমে গভর্নেন্স নীতিসমূহ পরীক্ষা ও যাচাই করুন

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

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

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

ধাপ ২: বার্গার অর্ডার পরীক্ষা করুন (নিয়ম ২ মিললে -> ২০০ ওকে)

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

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

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

Confirmed, please place the order.

বিকল্পভাবে, ক্লাউড শেল / টার্মিনাল থেকে প্রোগ্রাম্যাটিকভাবে পরীক্ষা করুন:

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 এন্ডপয়েন্টটি খুঁজে বের করার জন্য PROJECT_GOVERNANCE এ অবস্থিত সেন্ট্রাল এজেন্ট রেজিস্ট্রি-কে কোয়েরি করে (রুল ১ দ্বারা অনুমোদিত এজেন্ট গেটওয়ের মাধ্যমে core-gapi-services ব্যবহার করে)।
  2. ইনটেন্ট রেজোলিউশন ও A2A ইনভোকেশন: পারচেজিং কনসিয়ার্জ-এর ভিতরে থাকা জেমিনি ফুড অর্ডার ইনটেন্টটি পার্স করে এবং https://${REGION}-aiplatform.mtls.googleapis.com/.../reasoningEngines/${BURGER_ENGINE_ID} -এ একটি আউটবাউন্ড RPC-এর মাধ্যমে বার্গার সেলার এজেন্টকে ইনভোক করে।
  3. গেটওয়ে ইন্টারসেপশন ও SPIFFE প্রোপাগেশন: বহির্গামী ট্র্যাফিক agent_gateway_config দ্বারা ক্যাপচার করা হয় এবং PROJECT_GOVERNANCE এর সেন্ট্রাল এজেন্ট গেটওয়েতে পাঠানো হয়, যা কনসিয়ার্জের ক্রিপ্টোগ্রাফিক SPIFFE আইডেন্টিটি ( principal://... ) বহন করে।
  4. IAP v2 পলিসি মূল্যায়ন: সেন্ট্রাল এজেন্ট গেটওয়ে 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

ধাপ ৩: এজেন্ট গেটওয়ে এবং 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 ) থেকে উদ্ভূত বহির্গামী ট্র্যাফিক ক্যাপচার করা উচিত, যার মধ্যে জেমিনি রিজনিং কল ( generateContent ), ক্লাউড ট্রেস টেলিমেট্রি ( /v1/traces ), এবং আইএএম ক্রেডেনশিয়াল লুকআপের মতো ইগ্রেস ফিল্ড থাকবে—যা রুল ১ ( 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 নিষিদ্ধ কার্যকর)

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

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

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

Confirmed, please place the order.

বিকল্পভাবে, ক্লাউড শেল / টার্মিনাল থেকে প্রোগ্রাম্যাটিকভাবে পরীক্ষা করুন:

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. ইনটেন্ট রেজোলিউশন ও এ২এ আহ্বান: পারচেজিং কনসিয়ার্জের অভ্যন্তরে থাকা জেমিনি, PROJECT_SELLERS এ অবস্থিত পিজ্জা সেলার এন্ডপয়েন্টে পিজ্জা অর্ডারের অনুরোধটি পাঠানোর চেষ্টা করে।
  3. গেটওয়ে ইন্টারসেপশন: বহির্গামী RPC-টি agent_gateway_config দ্বারা গ্রহণ করা হয় এবং সেন্ট্রাল এজেন্ট গেটওয়েতে পাঠানো হয়।
  4. IAP v2 পলিসি মূল্যায়ন (ডিফল্ট ডিনাই): সেন্ট্রাল এজেন্ট গেটওয়ে IAP v2 চালু করে। যেহেতু ইউনিফাইড অ্যাক্সেস পলিসিতে pizza-seller-agent সাথে মেলে এমন কোনো নিয়ম নেই , তাই IAP DENY ( granted: false ) রিটার্ন করে।
  5. কঠোর পেরিমিটার ব্লক: যেহেতু Authz এক্সটেনশনটি ENFORCE মোডে ( 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

ধাপ ৬: পিজা এজেন্টকে গতিশীলভাবে বহির্গমন অ্যাক্সেস প্রদান করুন

Rule 1 (Core APIs), Rule 2 (Burger Seller Agent), এবং এখন Rule 3 (Pizza Seller Agent) অন্তর্ভুক্ত করতে নতুন 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

ধাপ ৭: পিজ্জা এজেন্টকে পুনরায় জিজ্ঞাসা করুন (তাৎক্ষণিক ২০০ ওকে সফলতার বার্তা)

প্লেগ্রাউন্ড চ্যাট উইন্ডোতে, পিৎজা অর্ডারের অনুরোধটি পুনরায় জমা দিন:

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

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

Confirmed, please place the order.

বিকল্পভাবে, ক্লাউড শেল / টার্মিনাল থেকে প্রোগ্রাম্যাটিকভাবে পরীক্ষা করুন:

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://us-central1-aiplatform.mtls.googleapis.com/v1beta1/projects/${PROJECT_SELLERS}/locations/us-central1/publishers/google/models/gemini-2.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

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

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

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

১. রিজনিং ইঞ্জিন ডেপ্লয়মেন্টগুলো পরিষ্কার করুন

রিজনিং ইঞ্জিনগুলো মুছে ফেলতে এবং তাদের দীর্ঘ-চলমান অপারেশনগুলোর জন্য অপেক্ষা করতে, উভয় রানটাইম প্রজেক্ট জুড়ে অন্তর্ভুক্ত 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

৫. ক্রস-প্রজেক্ট আইএএম বাইন্ডিং এবং কাস্টম রোল অপসারণ করুন

# 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 অ্যাসাইন করে থাকেন, তাহলে সর্বনিম্ন-সুবিধা (least-privilege) পুনরুদ্ধার করতে আপনার সক্রিয় ব্যবহারকারী অ্যাকাউন্ট থেকে সেগুলি সরিয়ে ফেলুন:

# 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

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

# 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

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

# 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

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

১২. উপসংহার

অভিনন্দন! আপনি ভার্টেক্স এআই এজেন্ট রানটাইম, সেন্ট্রাল এজেন্ট গেটওয়ে, এজেন্ট রেজিস্ট্রি এবং আইএএম ইউনিফাইড অ্যাক্সেস পলিসি (ইউএপি) ব্যবহার করে গুগল ক্লাউডে একটি মাল্টি-প্রজেক্ট এজেন্ট-টু-এজেন্ট (এ২এ) আর্কিটেকচার স্থাপন ও পরিচালনা করেছেন।

মূল ধারণাগুলির সারাংশ

  • কেন্দ্রীয় বহির্গমন পরিধি: agentGatewayConfig ব্যবহার করে PROJECT_GOVERNANCE এর একটি কেন্দ্রীয় এজেন্ট গেটওয়ের মাধ্যমে স্পোক রানটাইম কন্টেইনারগুলিকে ( PROJECT_CONCIERGE , PROJECT_SELLERS ) রাউট করা হয়।
  • Declarative Governance (UAP): Replaced fragmented per-resource bindings with a single, auditable IAM Access Policy evaluated at the gateway by IAP v2.
  • Cryptographic Identity: Enforced least-privilege egress using container SPIFFE identities ( principal://... ) rather than long-lived keys.
  • Dynamic Service Discovery: Resolved peer agent endpoints at runtime via Central Agent Registry, eliminating hardcoded URLs and project IDs.
  • Runtime Policy Agility: Transitioned pizza-seller-agent from Default Deny ( 403 Forbidden ) to Allowed ( 200 OK ) in real time via policy update, with zero container restarts.

cosmopup

Cosmopup says: "Agents are great—they do all the cross-project work while I focus on my primary objective: napping!"

Next Steps & Documentation