۱. مقدمه
این Codelab به بررسی مدیریت ورود Agent Gateway برای عاملهای هوش مصنوعی میزبانیشده در Agent Runtime میپردازد.
دروازه عامل (Agent Gateway) که در حالت ورودی ( کلاینت به عامل ) عمل میکند، از ارتباطات حاکم بین کلاینتها - کاربران نهایی انسانی، عاملهای دسکتاپ، IDEهای کدنویسی، عاملهای همتا و غیره - و عاملهای میزبان Agent Runtime پشتیبانی میکند. این حالت برای محافظت از عاملها در برابر حملات تزریق سریع ورودی یا محتوای مضر ارسال شده توسط کلاینتها استفاده میشود. تمام ترافیک ورودی با استفاده از افزونههای مجوز و Model Armor پردازش میشود تا نقطه ورود به شبکه را برای تمام تعاملات عامل ایمن کند.
آنچه میسازید
- دروازه عامل در حالت ورودی ( کلاینت به عامل )
- افزونهی مجوز زره مدل
- عامل ADK Runtime با هویت عامل
- دادههای فایل ذخیرهسازی ابری که توسط عامل با استفاده از MCP پرسوجو میشود
- الگوهای زرهی مدل برای غربالگری سوالات و پاسخهای LLM
- الگوهای حفاظت از دادههای حساس برای شناسایی مجدد دادهها
شکل 1. معماری Codelab
آنچه یاد میگیرید
- نحوهی استقرار Agent Gateway برای غربالگری ترافیک ورودی به یک Agent
- نحوه پیکربندی افزونههای مجوز و واگذاری اختیارات Model Armor
- نحوه ایجاد و استقرار قالبهای سفارشی Model Armor
- نحوه ایجاد و استقرار قالبهای سفارشی حفاظت از دادههای حساس
- نحوه آزمایش و اعتبارسنجی سیاستهای غربالگری LLM
آنچه شما نیاز دارید
- یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب
- مجوزهای IAM برای ارائه خدمات شبکه، مجموعه دادههای BigQuery و منابع پلتفرم Agent
- یک پوسته سازگار با POSIX (
bashیاzsh) که رابط خط فرمان گوگل کلود (کامپوننتgcloud) روی آن نصب شده باشد - ابزارهای خط فرمان:
git،curl،jq(پردازشگر JSON)، پایتون ۳ وuv(مدیر بسته پایتون)
۲. مفاهیم
نقشهای جهت ترافیک و دروازه
Agent Gateway به عنوان یک پروکسی شبکه آگاه از عامل عمل میکند، اما نقش عملیاتی آن بسته به جهت ترافیک تغییر میکند:
- حالت عامل به هر کجا (خروجی): به عنوان یک پروکسی خروجی عمل میکند. هنگامی که یک عامل ابزارهای پایگاه داده خارجی، سرورهای MCP شخص ثالث یا APIها را فراخوانی میکند، دروازه خروجی، کشف سرویس، مسیریابی، TLS متقابل (
mTLS)، تزریق پویای اعتبارنامههای OAuth و کنترل دسترسی به نقاط انتهایی را مدیریت میکند. - حالت کلاینت به عامل (ورودی): به عنوان یک دروازه امنیتی frontend عمل میکند. هدف اصلی آن محافظت از ورودی به زمان اجرای عامل با رهگیری و پاکسازی پیامهای ورودی زبان طبیعی قبل از رسیدن به کد عامل یا مدلهای هوش مصنوعی است.
مسیر ورود به Agent Runtime
درخواستهای کلاینت که یک عامل میزبانیشده در Agent Runtime را هدف قرار میدهند، به نقطه پایانی API مربوط به aiplatform.googleapis.com ارسال میشوند.
POST https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:query
این جریان ارتباطی ورودی به نقطه پایانی API، مسیر ورودی کلاینت به عامل را نشان میدهد.
برای ایمنسازی این مسیر ورودی تحت مدیریت گوگل، Agent Gateway مستقیماً با Google Front End ( GFE ) در لایه زیرساخت سرویسدهنده API ادغام میشود. هنگام استقرار یک عامل مدیریتشده در Agent Runtime، گوگل بهطور بومی سیاست مجوزدهی دروازه ورودی را به درخواستهای ورودی کلاینت در لبه شبکه متصل میکند.
شکل ۲. مدیریت ورود با استفاده از Agent Gateway to Agent Runtime
از آنجا که بازرسی در لایه frontend قبل از ورود درخواستها به Agent Runtime رخ میدهد، این معماری هیچ سربار شبکهای اضافی یا تأخیر hop داخلی ایجاد نمیکند. مقیاسبندی به طور خودکار توسط زیرساخت frontend انجام میشود و نیاز به مدیریت محدودههای IP داخلی، متعادلکنندههای بار یا مسیرهای DNS سفارشی را از بین میبرد.
پاکسازی تهدیدات درون خطی با Model Armor
ارزیابی اعتبارنامههای تماسگیرنده و اعمال کنترل دسترسی IAM ( roles/aiplatform.user ) به صورت بومی توسط لایه میزبانی API aiplatform انجام میشود. خود دروازه ورودی، مجوز هویت را انجام نمیدهد، بلکه بر امنیت محتوا با استفاده از افزونههای مجوز پیکربندی شده با پروفایل CONTENT_AUTHZ تمرکز دارد. این دروازه به عنوان یک نقطه اجرای سیاست درونخطی عمل میکند و پیامهای زبان طبیعی را در حین انتقال، قبل از رسیدن به حلقه استدلال عامل هوش مصنوعی یا LLM زیربنایی، رهگیری میکند.
وقتی یک درخواست کاربر ورودی به سرویس frontend میرسد، دروازه یک فراخوانی ext_proc (پردازش خارجی) را به سرویس توسعه مجوز منطقهای Model Armor آغاز میکند که فراخوانی را به صفحه داده Model Armor ارسال میکند. Model Armor به عنوان یک فایروال زبان طبیعی عمل میکند و متن را در برابر قالبهای فعال ارزیابی میکند تا خطرات ایمنی و امنیتی را اسکن کند:
- تزریقهای غیرمستقیم و تلاشهای فرار از زندان
- URL های مخرب، زبان سمی یا محتوای ناامن
- اطلاعات شخصی قابل شناسایی (
PII) و نشت دادههای حساس
اگر الگو شامل فیلترهای حفاظت از دادههای حساس ( SDP ) باشد، Model Armor یک فراخوانی gRPC اضافی به سرویس Cloud SDP انجام میدهد. Cloud SDP با استفاده از الگوی مشخص شده، محموله را بررسی میکند، هرگونه حذف هویت یا ویرایش درخواستی را انجام میدهد و نتیجهی پاکسازیشده را به زنجیره برمیگرداند تا با خیال راحت ارسال شود.
اگر نقض خطمشی یا تطابق دادههای حساسِ ویرایشنشده تشخیص داده شود، دروازه، بار داده را در لبه، قبل از ورود به زمان اجرا، مسدود یا ویرایش میکند. در نتیجه، برنامه عامل هوش مصنوعیِ در حال اجرا محافظتشده باقی میماند و هرگز بارهای داده مخرب یا ویرایشنشده را پردازش نمیکند.
این بخش مفاهیم را به پایان میرساند... و در ادامه به بخش تنظیمات میپردازیم.
۳. راهاندازی
نقشهای مورد نیاز IAM
برای ایجاد منابع در این Codelab، نقشهای زیر مورد نیاز است:
دسته بندی | نقش IAM مورد نیاز (شناسه) | توضیحات |
مدیریت API | | فعال کردن سرویسهای Google Cloud API |
شبکه و درگاه | | دروازه عامل تأمین |
افزونههای سرویس | | پیکربندی افزونههای مسیریابی |
امنیت شبکه | | استقرار سیاستهای مجوزدهی |
محافظت از دادههای حساس | | مدیریت بازرسی SDP و شناسایی الگوها |
زره مدل | | ایجاد و مدیریت الگوهای ایمنی |
پلتفرم عامل | | بارهای کاری Agent Runtime را مستقر کنید |
فضای ذخیرهسازی ابری | | مدیریت استقرار و دادههای مشتری |
مدیریت IAM | | اتصال مجوزهای سطح پروژه برای هویت عامل |
گزارشها و حسابرسی | | بررسی ردپاها و گزارشهای حسابرسی |
روش دیگر، استفاده از یک نقش اساسی گسترده مانند roles/admin یا نقش قدیمی roles/owner .
به پروژه خود دسترسی پیدا کنید
این Codelab از یک پروژه Google Cloud واحد استفاده میکند. مراحل پیکربندی از gcloud CLI و دستورات پوسته لینوکس استفاده میکنند.
با دسترسی به خط فرمان پروژه Google Cloud خود شروع کنید:
- کلود شل در
shell.cloud.google.com، یا - یک ترمینال محلی که
gcloudCLI روی آن نصب شده باشد
شناسه پروژه خود را تنظیم کنید
gcloud config set project SET_YOUR_PROJECT_ID_HERE
احراز هویت جلسه
# login to gcloud cli
gcloud auth login
# login for gcloud api
gcloud auth application-default login
تنظیم متغیرهای محیطی پوسته
# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
echo ${SLUG}
echo ${REGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-cta"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-crm"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export DATA_BUCKET="customer-data-${PROJ_NO}"
export MCP_URL="https://storage.mtls.googleapis.com/storage/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${DATA_BUCKET}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg
بهروزرسانی gcloud cli (توصیه میشود)
اگر نصب خودمدیریتشدهی Google Cloud SDK (یعنی خارج از Cloud Shell) را اجرا میکنید، اجزا را به آخرین نسخه بهروزرسانی کنید.
# update gcloud cli
gcloud components update
فعال کردن سرویسهای API
# enable google apis (agent platform bundle, part 1)
gcloud services enable \
agentregistry.googleapis.com \
aiplatform.googleapis.com \
apphub.googleapis.com \
apptopology.googleapis.com \
cloudapiregistry.googleapis.com \
cloudtrace.googleapis.com \
compute.googleapis.com \
dataform.googleapis.com \
iam.googleapis.com \
iamconnectors.googleapis.com \
iap.googleapis.com \
logging.googleapis.com \
modelarmor.googleapis.com \
monitoring.googleapis.com \
networksecurity.googleapis.com \
networkservices.googleapis.com \
notebooks.googleapis.com \
observability.googleapis.com
# enable google apis (agent platform bundle, part 2)
gcloud services enable \
securitycenter.googleapis.com \
saasservicemgmt.googleapis.com \
storage.googleapis.com \
telemetry.googleapis.com \
texttospeech.googleapis.com
# enable google apis (all the rest)
gcloud services enable \
dlp.googleapis.com
این بخش تنظیمات را به پایان میرساند... و در ادامه به بخش دروازه (Gateway) میپردازیم.
۴. دروازه
یک دروازه عامل تحت مدیریت گوگل را که در حالت کلاینت به عامل ( CLIENT_TO_AGENT ) کار میکند، مستقر کنید. برخلاف دروازههای خروجی که برای مسیریابی تماسهای خروجی به ارتباطات رجیستری عامل نیاز دارند، دروازه ورودی مستقیماً در لایه فرانتاند متصل میشود تا به عنوان نقطه اجرای درونخطی برای اعلانهای ورودی که Agent Runtime را هدف قرار میدهند، عمل کند.
در حالی که سیاستهای خروجی اغلب در حالت DRY_RUN در لایه دروازه شروع میشوند، مدیریت محتوای ورودی ( CONTENT_AUTHZ ) مستقیماً در حالت اجباری پیادهسازی میشود. در عوض، ثبت وقایع فقط-ممیزی دانهای یا مسدود کردن فعال، به صورت بالادستی در قالبهای منفرد Model Armor کنترل میشوند.
ایجاد دروازه
# create agent gateway config file
cat > cfg/${AGW_NAME}.yaml <<EOF
name: ${AGW_NAME}
protocols:
- MCP
googleManaged:
governedAccessPath: CLIENT_TO_AGENT
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
--source="cfg/${AGW_NAME}.yaml" \
--location=${REGION}
تأیید درگاه
# list agent gateways (in region)
gcloud network-services agent-gateways list --location=${REGION}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} --location=${REGION}
این بخش دروازه را به پایان میرساند... و در ادامه به بخش زره مدل میرسیم.
۵. زره مدل
الگوهای SDP
یک الگوی بازرسی و حذف هویت حفاظت از دادههای حساس ( SDP ) ایجاد کنید تا در الگوی پاسخ Model Armor استفاده شود. این پیکربندی، شمارههای تأمین اجتماعی ایالات متحده (SSN) را برای ویرایش علامتگذاری میکند.
ایجاد الگوی بازرسی
الگوی inspect اطلاعات حساس ( US_SOCIAL_SECURITY_NUMBER ) را در دادهها شناسایی میکند.
# create inspect template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
-d @- << EOF
{
"templateId": "agw-ssn-inspect-template",
"inspectTemplate": {
"displayName": "ssn inspect template",
"inspectConfig": {
"infoTypes": [
{ "name": "US_SOCIAL_SECURITY_NUMBER" }
],
"minLikelihood": "POSSIBLE"
}
}
}
EOF
ایجاد الگوی عدم شناسایی
الگوی de-identify تبدیلی را که باید روی SSN های یافت شده توسط الگوی inspect اعمال شود، مشخص میکند. در این حالت، تبدیل، جایگزینی SSN با نوع info است.
# create de-identify template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
-d @- << EOF
{
"templateId": "agw-ssn-redaction-template",
"deidentifyTemplate": {
"displayName": "SSN Redaction Template",
"deidentifyConfig": {
"infoTypeTransformations": {
"transformations": [{
"primitiveTransformation": { "replaceWithInfoTypeConfig": {} }
}]
}
}
}
}
EOF
الگوهای SDP را تأیید کنید
# get (describe) inspect template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq
# get (describe) de-identify template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq
الگوهای زره مدل
نقطه پایانی پیشفرض برای API مدل آرمور، جهانی است ( modelarmor.googleapis.com ). با این حال، منابع مدل آرمور برای قالبها و موتورهای ارزیابی، به مناطق جغرافیایی خاصی محدود شدهاند. پروکسی نقطه پایانی منطقهای گوگل کلود (REP) یا نقطه پایانی API منطقهای برای مدل آرمور، https://modelarmor.${LOCATION}.rep.googleapis.com/ است.
به طور پیشفرض، هنگام اجرای gcloud model-armor ... ، رابط خط فرمان (CLI) تلاش میکند درخواستهای API را به نقطه پایانی استاندارد جهانی ( https://modelarmor.googleapis.com/ ) ارسال کند. یک override نقطه پایانی API برای هدایت مستقیم تمام درخواستهای HTTP SDK/CLI برای Model Armor به لایه API منطقهای rep.googleapis.com استفاده میشود، جایی که آن قالبهای وابسته به مکان در واقع ایجاد، ذخیره و پرسوجو میشوند.
تنظیم لغو API
# set api endpoint override per location
gcloud config set api_endpoint_overrides/modelarmor "https://modelarmor.${REGION}.rep.googleapis.com/"
لغو API را تأیید کنید
# view api overrides on active gcloud config
gcloud config list api_endpoint_overrides/
ایجاد الگوی فیلتر درخواست
یک الگوی فیلتر درخواست ایجاد کنید تا سخنان نفرتپراکن، آزار و اذیت، محتوای صریح جنسی و حملات تزریق URI را مسدود کند. ثبت وقایع برای ثبت اطلاعات دقیق رویدادها در مورد اجرای سیاستها فعال خواهد شد. کدهای خطا و پیامهای سفارشی نیز برای زمانی که یک درخواست مسدود میشود، پیکربندی شدهاند.
# create model armor template (request)
gcloud beta model-armor templates create ${AGW_NAME}-modar-req-template \
--project=${PROJ_ID} \
--location=${REGION} \
--rai-settings-filters='[
{ "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
]' \
--pi-and-jailbreak-filter-settings-enforcement=enabled \
--pi-and-jailbreak-filter-settings-confidence-level=medium-and-above \
--template-metadata-enforcement-type=INSPECT_AND_BLOCK \
--malicious-uri-filter-settings-enforcement=enabled \
--template-metadata-custom-llm-response-safety-error-code=798 \
--template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
--template-metadata-custom-prompt-safety-error-code=799 \
--template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
--template-metadata-ignore-partial-invocation-failures \
--template-metadata-log-operations \
--template-metadata-log-sanitize-operations
ایجاد الگوی فیلتر پاسخ
یک الگوی فیلتر پاسخ ایجاد کنید تا محتوای مشابه الگوی فیلتر درخواست را مسدود کند. DLP در بخش پاسخ پیکربندی شده است تا SSN های پیام هایی را که از طرف عامل به کلاینت بازمیگردند، شناسایی نکند.
# create model armor template (response)
gcloud beta model-armor templates create ${AGW_NAME}-modar-resp-template \
--project=${PROJ_ID} \
--location=${REGION} \
--rai-settings-filters='[
{ "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
]' \
--malicious-uri-filter-settings-enforcement=enabled \
--advanced-config-inspect-template=projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template \
--advanced-config-deidentify-template=projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template \
--template-metadata-enforcement-type=INSPECT_AND_BLOCK \
--template-metadata-custom-llm-response-safety-error-code=798 \
--template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
--template-metadata-custom-prompt-safety-error-code=799 \
--template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
--template-metadata-ignore-partial-invocation-failures \
--template-metadata-log-operations \
--template-metadata-log-sanitize-operations
الگوهای زره مدل را تأیید کنید
# list model armor templates
gcloud model-armor templates list --location=${REGION}
# show request filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-req-template --location=${REGION}
# show response filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-resp-template --location=${REGION}
مجوزهای IAM
Model Armor فراخوانیهای API را برای فراخوانی سرویس حفاظت از دادههای حساس ( SDP ) انجام میدهد. مجوزهای IAM هویت سرویس Model Armor را برای استفاده از الگوهای بازرسی و شناساییزدایی SDP اعطا کنید.
سیاست IAM را برای حفاظت از دادههای حساس مقید کنید
# grant dlp (sdp) user role to the model armor service identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" \
--role="roles/dlp.user"
مجوزهای IAM را تأیید کنید
# show iam policy for all dlp (sdp) roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.role:roles/dlp" \
--format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"
این بخش زره مدل را به پایان میرساند... و در کنار بخش مجوز قرار میگیرد.
۶. مجوز
مجوزهای IAM
برای بررسی ترافیک درونخطی با استفاده از Model Armor، عامل سرویس Service Extensions ( DEP ) به اتصالات صریح IAM (حتی در منابع درون یک پروژه) نیاز دارد:
-
roles/modelarmor.calloutUserوroles/serviceusage.serviceUsageConsumer: در پروژهی گیتوی اعطا شده تا فراخوانیهای بازرسی درونخطی را امکانپذیر کند. -
roles/modelarmor.user: به پروژهی الگو اعطا میشود تا امکان دسترسی و ارزیابی الگوهای Model Armor فراهم شود.
سیاست IAM را برای Model Armor مقید کنید
# grant model armor callout user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.calloutUser"
# grant service usage consumer role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
# grant model armor user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.user"
مجوزهای IAM را تأیید کنید
# show iam policy on project for dep (service extension) service agent
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
تمدید مجوز
پیکربندی افزونهی مجوز برای Agent Gateway، تنظیمات یکپارچهسازی را که برای ترافیک ورودی و خروجی اعمال میشود، تعریف میکند. این پیکربندی، سرویس پردازش خارجی ( service ) را تعریف میکند که به API منطقهای Model Armor ارجاع میدهد و با استفاده از فیلد فرادادهی model_armor_settings به الگوهای درخواست و پاسخ خاص پیوند میدهد.
ایجاد افزونه مجوز
# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-modar.yaml <<EOF
name: ${AGW_NAME}-svc-ext-authz-modar
service: modelarmor.${REGION}.rep.googleapis.com
metadata:
model_armor_settings: '[
{
"request_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-req-template",
"response_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-resp-template"
}
]'
failOpen: true
timeout: 5s
EOF
افزونه authz را وارد کنید
# import authz extension file
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-modar \
--source=cfg/${AGW_NAME}-svc-ext-authz-modar.yaml \
--location=${REGION}
تأیید افزونه authz
# list authz extensions
gcloud service-extensions authz-extensions list --location=${REGION}
# show authz extension details
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-modar \
--location=${REGION}
سیاست مجوز
سیاستهای مجوزدهی از پروفایلهای سیاست برای تعیین نوع ارزیابی انجامشده استفاده میکنند. در حالی که پروفایلهای مبتنی بر درخواست ( REQUEST_AUTHZ ) هدرهای HTTP را ارزیابی میکنند، این پیکربندی از یک پروفایل مجوزدهی مبتنی بر محتوا ( CONTENT_AUTHZ ) برای اتصال افزونه Model Armor به دروازه برای بازرسی عمیق بار داده استفاده میکند.
ایجاد سیاست مجوز
# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-modar.yaml <<EOF
name: ${AGW_NAME}-authz-policy-modar
target:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: CONTENT_AUTHZ
action: CUSTOM
customProvider:
authzExtension:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-modar"
EOF
سیاست وارد کردن مجوز
# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-modar \
--source=cfg/${AGW_NAME}-authz-policy-modar.yaml \
--location=${REGION}
سیاست authz را تأیید کنید
# list authz policies
gcloud beta network-security authz-policies list --location=${REGION}
# show authz policy details
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-modar \
--location=${REGION}
این بخش مجوزدهی را که در کنار بخش Codebase قرار دارد، به پایان میرساند.
۷. کدبیس
کد عامل و دادههای فایل مورد استفاده برای این Codelab در یک مخزن از راه دور Google Cloud GitHub نگهداری میشوند. مراحل زیر مخزن را به صورت محلی کلون میکند، فایلهای لازم را در ساختار دایرکتوری کاری فعلی کپی میکند و سپس فایلهای موقت را پاکسازی میکند.
مصنوعات از راه دور را دریافت کنید
# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_ingress_modar
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_ingress_modar/codelabs/agw-cuj-arun-ingress-modar/agent-crm ./agent-crm
# remove temporary directory
rm -rf temp_agw_cuj_arun_ingress_modar
یک سطل ذخیرهسازی برای مرحلهبندی توسط Agent Runtime برای آپلود، ساخت و استقرار کد برنامه عامل بستهبندی شده و مصنوعات وابستگی آن استفاده میشود.
ایجاد سطل ذخیرهسازی برای مرحلهبندی
# create storage bucket
gcloud storage buckets create gs://${STAGING_BUCKET} --location=${REGION} --uniform-bucket-level-access
سطل ذخیرهسازی را تأیید کنید
# list storage buckets
gcloud storage buckets list --format="value(storage_url)"
این بخش کدبیس را به پایان میرساند... و در ادامه به بخش دادههای مشتری GCS میپردازیم.
دادههای مشتری
یک مخزن ذخیرهسازی ابری برای ذخیره دادههای مشتری ایجاد کنید. عامل مستقیماً با استفاده از کتابخانه استاندارد کلاینت گوگل کلود که نقطه پایانی Cloud Storage MCP را فراخوانی میکند، اطلاعات را میخواند.
ایجاد سطل ذخیرهسازی برای دادههای مشتری
# create storage bucket
gcloud storage buckets create gs://${DATA_BUCKET} --location=${REGION} --uniform-bucket-level-access
سطل ذخیرهسازی را تأیید کنید
# list storage buckets
gcloud storage buckets list --format="value(storage_url)"
بارگذاری دادههای مشتری
# copy local data to bucket
gcloud storage cp -r ./agent-crm/data/* gs://${DATA_BUCKET}/
تأیید دادههای مشتری
# list bucket objects
gcloud storage ls gs://${DATA_BUCKET}/ --long
این بخش دادههای مشتری GCS را به پایان میرساند... و در ادامه به بخش نماینده ADK میرسد.
۸. مامور ADK
ایجنت ADK مربوط به agent-crm که در Agent Runtime مستقر شده است، با تنظیمات زیر در اسکریپت استقرار پیکربندی شده است تا با Agent Platform ادغام شود:
-
"identity_type": types.IdentityType.AGENT_IDENTITYبرای ارائه یک هویت اصلی منحصر به فرد مبتنی بر SPIFFE برای عامل -
"client_to_agent_config": {"agent_gateway": "${AGW_URI}"}برای هدایت تمام ترافیک ورودی برای عامل به مسیر ارزیابی و اجرای سیاست Agent Gateway
همچنین آدرس اینترنتی سرور mTLS MCP برای سرور Cloud Storage MCP و نام سطل داده برای فراخوانی ابزار GCS MCP از طریق یک اتصال امن به عامل ارسال میشود.
عامل را مستقر کنید
# deploy agent
uv --directory agent-crm run python3 deploy_agent.py \
--project=${PROJ_ID} \
--region=${REGION} \
--src-dir=./agent \
--staging-bucket=${STAGING_BUCKET} \
--display-name="${RE_AGENT_NAME}" \
--description="agent for customer data" \
--mcp-server-url="${MCP_URL}" \
--data-bucket=${DATA_BUCKET} \
--enable-telemetry \
--enable-agent-identity \
--agent-gateway-ingress=${AGW_URI} \
--allow-token-sharing
تأیید استقرار
موارد حیاتی استقرار را دریافت کنید
# fetch agent runtime (reasoning engine) resource id
export RE_ENGINE_ID=$(curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
| jq -r --arg name "${RE_AGENT_NAME}" '.reasoningEngines[] | select(.displayName==$name) | .name | split("/") | last')
echo ${RE_ENGINE_ID}
# fetch agent runtime (reasoning engine) agent identity directly from reasoning engine
export RE_AGENT_IDENTITY="principal://$(curl -s \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
"https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
| jq -r '.spec.effectiveIdentity')"
echo ${RE_AGENT_IDENTITY}
پیکربندی دروازه را تأیید کنید
# show agent runtime config details (gateway config)
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
| jq '{displayName: .displayName, name: .name, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'
مجوزهای IAM
الزام به اعمال سیاستهای IAM برای شناسایی عامل
# grant mcp tool user role to agent set (all agent runtime agents in project)
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_ID_SET}" \
--role="roles/mcp.toolUser"
# grant storage object viewer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/storage.objectViewer"
# grant aiplatform user role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/aiplatform.user"
# grant cloudtrace agent role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/cloudtrace.agent"
# grant cloud monitoring metric writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/monitoring.metricWriter"
# grant cloud logging log writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/logging.logWriter"
# grant telemetry writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/telemetry.writer"
# grant service usage consumer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/serviceusage.serviceUsageConsumer"
# grant browser role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/browser"
مجوزهای IAM را تأیید کنید
# show agent identity roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:${RE_AGENT_IDENTITY}" \
--format="table(bindings.members.sub('^.*locations/', 'principal://agents.[...]/locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
# show agent set roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:${RE_AGENT_ID_SET}" \
--format="table(bindings.members.sub('^.*platformContainer/', 'principalSet://agents.[...]/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
این بخش مربوط به عامل ADK را به پایان میرساند... و در ادامه به بخش تست میپردازیم.
۹. آزمون
ارسال کوئریها از CLI
یک دستور امن را آزمایش کنید
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are the names of our west customers?",
"user_id": "test-user"
}
}
EOF
باید پاسخی مانند ... "مشتریان غرب ما عبارتند از: باب جانسون و آلیس براون."
یک محرک ویرایش را آزمایش کنید
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are ssn's for bob johnson and alice brown?",
"user_id": "test-user"
}
}
EOF
یک دستور امن دیگر را امتحان کنید
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are bob johnson's and alice brown's email addresses?",
"user_id": "test-user"
}
}
EOF
گزارشهای حسابرسی
مشاهده گزارشهای ردیابی
وقتی تلهمتری فعال باشد، Agent Runtime رویدادهای ساختاریافتهای را که نشاندهندهی پرسوجوهای کاربر، پارامترهای ابزار، جریانهای اجرا و خروجیهای انتخاب مدل هستند، استریم میکند.
# show agent runtime (reasoning engine) telemetry and trace logs
gcloud logging read \
"logName:\"projects/${PROJ_ID}/logs/aiplatform.googleapis.com%2Freasoning_engine_stdout\" AND labels.managed-by=\"reasoning-engine\"" \
--project=${PROJ_ID} \
--limit=15 \
--format="table(
timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
trace.basename().sub('^(.{8}).*$', '\\1'):label=TRACE_ID,
labels.\"event.name\".scope(-1):label=EVENT,
jsonPayload.content.role:label=ROLE,
jsonPayload.content.parts[0].text:label=TEXT_CONTENT,
jsonPayload.content.parts[0].function_call.name:label=TOOL_CALL
)"
TRACE_ID پرسوجوی کاربر، فراخوانیهای ابزار میانی و تصمیمات مدل را در یک جدول زمانی واحد گروهبندی میکند:
TIME TRACE_ID EVENT ROLE TEXT_CONTENT TOOL_CALL
HH:MM:SS PM 3070a1fd gen_ai.choice model Bob Johnson's SSN is 219-45-7895.
Alice Brown's SSN is 219-45-7896.
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model read_customer_file
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model read_customer_file
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model list_customer_files
HH:MM:SS PM 3070a1fd gen_ai.user.message user what are ssn's for bob johnson and alice brown?
HH:MM:SS PM 3070a1fd gen_ai.system.message
HH:MM:SS PM 3070a1fd gen_ai.choice model read_customer_file
مشاهده گزارشهای پاکسازی زره مدل
این گزارشها، تهدیدات درونخطی دوطرفه و پاکسازی انجامشده توسط Model Armor را در زمان واقعی و همزمان با عبور ترافیک از Agent Gateway نشان میدهند.
# show model armor logs
gcloud logging read \
"logName:\"projects/${PROJ_ID}/logs/modelarmor.googleapis.com%2Fsanitize_operations\"" \
--project=${PROJ_ID} \
--limit=50 \
--format="table(
timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
jsonPayload.sanitizationResult.sanitizationVerdict:label=VERDICT,
jsonPayload.sanitizationInput.byteItem.byteData.decode(base64).decode(utf-8).sub('\n', ' \\\\\\\\n ').trailoff(123):label=INPUT_DATA
)"
به ورودی گزارش مربوط به درخواستهای پاکسازیشده و مسدودشده توجه کنید.
TIME VERDICT INPUT_DATA
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW Bob Johnson's email address is bob.j@example.com. \n Alice Brown's email address is alice.b...
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are bob johnson's and alice brown's email addresses?
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_BLOCK 6��
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are ssn's for bob johnson and alice brown?
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW Our west customers are: Bob Johnson and Alice Brown.
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are the names of our west customers?
این بخش تست را به پایان میرساند... و پس از آن بخش پاکسازی قرار دارد.
۱۰. پاکسازی
# remove agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/storage.objectViewer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/aiplatform.user"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/cloudtrace.agent"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/monitoring.metricWriter"
# next
# remove more agent and agent set iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/logging.logWriter"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/telemetry.writer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/serviceusage.serviceUsageConsumer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/browser"
# next
# remove rest of iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_ID_SET}" --role="roles/mcp.toolUser"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" --role="roles/dlp.user"
# next
# delete agent runtime (reasoning engine) agent
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json"
# next
# delete storage
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}
gcloud -q storage rm --recursive gs://${DATA_BUCKET}
# next
# delete authz resources
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-modar --location=${REGION}
gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-modar --location=${REGION} --async
# next
# remove dep (service extensions) service agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.calloutUser"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.user"
# next
# delete model armor templates
gcloud -q model-armor templates delete ${AGW_NAME}-modar-resp-template --location=${REGION}
gcloud -q model-armor templates delete ${AGW_NAME}-modar-req-template --location=${REGION}
# unset model armor api endpoint override
gcloud config unset api_endpoint_overrides/modelarmor
# next
# delete sdp (dlp) templates
curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: ${PROJ_ID}"
curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: ${PROJ_ID}"
# next
# delete agent gateway ingress
gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION} --async
# end
این بخش پاکسازی را به پایان میرساند... که در ادامه به بخش نتیجهگیری خواهیم پرداخت.
۱۱. نتیجهگیری
تبریک! شما با موفقیت Agent Gateway را مستقر کرده و ترافیک ورودی به یک عامل هوش مصنوعی را مدیریت کردهاید!

کازموپاپ فکر میکند که Codelabs خیلی مشتاق است!
قدم بعدی چیست؟
- برای ویژگیها و آموزشهای پیشرفته ، مستندات پلتفرم Gemini Enterprise Agent را بررسی کنید.
- پیکربندی گاردریلهای مدل آرمور روی Agent Gateway برای ایمنی و امنیت بیشتر هوش مصنوعی
- بررسی سیاستهای مدیریت معنایی برای اجرای قوانین کسبوکار و انطباق با پرسوجوهای زبان طبیعی
با استفاده از این فرم بازخورد، میتوانید هرگونه نظر، سوال یا اصلاحیهای را ارائه دهید.
متشکرم!