1. บทนำ
Codelab นี้จะแนะนำพื้นฐานของการเริ่มต้นใช้งาน Cloud Run คุณจะได้เรียนรู้วิธีใช้ฟีเจอร์เพิ่มเติม ซึ่งรวมถึงการเข้าถึง VPC, Secret Manager และ ADK สำหรับเอเจนต์ AI ที่โฮสต์ใน Cloud Run
สิ่งที่คุณจะได้เรียนรู้
- ทําให้อิมเมจ nginx ใช้งานได้
- ทําให้ใช้งานได้จากซอร์สโค้ด
- ย้อนกลับการทำให้ใช้งานได้
- แสดงตัวอย่างการทำให้ใช้งานได้
- ใช้เครื่องมือเซิร์ฟเวอร์ MCP ของ Developer Knowledge
- ใช้ Secret Manager กับ Cloud Run
- เชื่อมต่อกับบริการ Cloud Run ภายใน VPC
- ติดตั้งใช้งาน Agent ประเภท ADK ใน Cloud Run
สิ่งที่คุณต้องมี
- เว็บเบราว์เซอร์ เช่น Chrome
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
สร้างโปรเจ็กต์ Google Cloud
- ในคอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่
เริ่มต้น Cloud Shell
Cloud Shell คือสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud ซึ่งโหลดเครื่องมือที่จำเป็นไว้ล่วงหน้า
- คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud
- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ยืนยันการตรวจสอบสิทธิ์โดยทำดังนี้
gcloud auth list - ตรวจสอบว่าได้กำหนดค่าโปรเจ็กต์แล้ว
gcloud config get project - หากไม่ได้ตั้งค่าโปรเจ็กต์ตามที่คาดไว้ ให้ตั้งค่าดังนี้
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
ตั้งค่าตัวแปรสภาพแวดล้อม
Codelab นี้ใช้ตัวแปรสภาพแวดล้อมต่อไปนี้
ก่อนอื่น ให้ตั้งค่าภูมิภาค
export REGION=<YOUR_REGION>
จากนั้นยืนยัน PROJECT_ID และ REGION
echo "PROJECT_ID: $PROJECT_ID | REGION: $REGION"
2. ทำให้ใช้งานได้จากอิมเมจ
ในส่วนนี้ คุณจะทําให้อิมเมจ nginx มาตรฐานใช้งานได้โดยตรงจาก Docker Hub คุณจะกำหนดค่าให้เข้าถึงได้แบบสาธารณะและตั้งค่าพอร์ตคอนเทนเนอร์เป็น 80
- ติดตั้งใช้งานบริการ nginx ด้วยคำสั่งต่อไปนี้
gcloud run deploy nginx-service \
--image=nginx \
--allow-unauthenticated \
--port=80 \
--region=$REGION
- เมื่อการติดตั้งใช้งานเสร็จสมบูรณ์ เอาต์พุตจากคำสั่งจะแสดง URL ของบริการ เปิด URL นั้นในเบราว์เซอร์เพื่อดูหน้า "ยินดีต้อนรับสู่ nginx!"
3. ติดตั้งใช้งานจากแหล่งที่มา
mkdir color-app && cd $_
สร้างไฟล์ชื่อ requirements.txt ที่มีเนื้อหาต่อไปนี้
Flask>=2.0.0
gunicorn>=20.0.0
สร้างไฟล์ชื่อ main.py ที่มีเนื้อหาต่อไปนี้
import os
from flask import Flask, render_template_string
app = Flask(__name__)
TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
<title>Cloud Run Traffic Revisions</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 50vh;
background-color: darkseagreen;
font-family: sans-serif;
}
.content {
background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
padding: 2em;
border-radius: 8px;
text-align: center;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="content">
<!-- ROLLBACK DEMO: change this text to "gray" -->
<p>background color: <strong>darkseagreen</strong></p>
</div>
</body>
</html>
"""
@app.route('/')
def main():
return render_template_string(TEMPLATE)
if __name__ == '__main__':
port = int(os.environ.get('PORT', 8080))
app.run(debug=True, host='0.0.0.0', port=port)
ตอนนี้ให้เรียกใช้คำสั่งต่อไปนี้
gcloud run deploy \
--allow-unauthenticated
--region $REGION
4. การย้อนกลับและลิงก์ตัวอย่าง
ในส่วนนี้ คุณจะแนะนำข้อบกพร่องและเรียนรู้วิธีการย้อนกลับไปใช้การแก้ไขก่อนหน้าขณะที่คุณตรวจสอบการแก้ไข
- ก่อนอื่น ให้บันทึกชื่อของการแก้ไขที่ให้บริการรับส่งข้อมูลในปัจจุบัน เนื่องจากไม่มีข้อบกพร่อง
GOOD_REVISION=$(gcloud run revisions list --service color-app \
--region $REGION --format 'value(REVISION)')
- ในไฟล์ color-app
main.pyให้ค้นหา "ROLLBACK DEMO" แล้วอัปเดตบรรทัดเป็นดังนี้
<p>background color: <strong>gray</strong></p>
- ตอนนี้ให้เรียกใช้
gcloud run deployอีกครั้ง โปรดสังเกตว่าระบบใช้การกำหนดค่าก่อนหน้าของคุณอย่างไร
เมื่อคุณทำให้ข้อบกพร่องใช้งานได้แล้ว คุณสามารถกลับไปที่แหล่งที่มา ทำการเปลี่ยนแปลงหรือใช้ git revert แล้วสร้าง ทริกเกอร์บิลด์ใหม่ ฯลฯ อย่างไรก็ตาม คุณอาจพบข้อผิดพลาดระหว่างทางได้
วิธีที่ปลอดภัยกว่าคือการย้อนกลับ
- หากต้องการย้อนกลับไปเป็นการแก้ไขเวอร์ชันก่อนหน้า ให้เรียกใช้คำสั่งต่อไปนี้
gcloud run services update-traffic color-app \
--to-revisions=$GOOD_REVISION=100 \
--region=$REGION
ตอนนี้คุณสามารถติดตั้งใช้งานรีวิชันใหม่ที่จะไม่รับการเข้าชมใดๆ ได้แล้ว
- ตอนนี้ให้แก้ไขข้อบกพร่องโดยเปลี่ยนข้อความกลับเป็น
darkseagreen
<p>background color: <strong>darkseagreen</strong></p>
- และนำไปใช้เพื่อยืนยันการแก้ไข โปรดทราบว่าเวอร์ชันนี้จะไม่ได้รับการเข้าชมใดๆ เนื่องจากมีการปักหมุดการเข้าชม 100% ไปยัง GOOD_REVISION
gcloud run deploy color-app --no-traffic --tag bugfix --region $REGION
- ยืนยันการติดตั้งใช้งาน
คุณจะเห็นว่า URL แตกต่างกันเล็กน้อย เมื่อไปที่เว็บไซต์ คุณจะเห็นการแก้ไขข้อบกพร่องในการติดตั้งใช้งานนี้
- ส่งการเข้าชมกลับไปยังการแก้ไขล่าสุด
ตอนนี้คุณจะตั้งค่าการเข้าชมกลับไปเป็นการแก้ไขล่าสุด
gcloud run services update-traffic color-app \
--to-latest \
--region=$REGION
และลบแท็กการแก้ไข
gcloud run services update-traffic color-app \
--remove-tags=bugfix \
--region=$REGION
ดูข้อมูลเพิ่มเติมเกี่ยวกับการย้อนกลับได้ในเอกสาร
5. เซิร์ฟเวอร์ MCP ของ Developer Knowledge
เซิร์ฟเวอร์ MCP ความรู้สำหรับนักพัฒนาแอปช่วยให้เครื่องมือพัฒนาที่ทำงานด้วยระบบ AI สามารถค้นหาเอกสารประกอบสำหรับนักพัฒนาแอปอย่างเป็นทางการของ Google และดึงข้อมูลสำหรับผลิตภัณฑ์ของ Google เช่น Firebase, Google Cloud, Android, Maps และอื่นๆ การเชื่อมต่อแอปพลิเคชัน AI กับคลังเอกสารอย่างเป็นทางการของเราโดยตรงจะช่วยให้มั่นใจได้ว่าโค้ดและคำแนะนำที่คุณได้รับนั้นเป็นข้อมูลล่าสุดและอิงตามบริบทที่เชื่อถือได้
คุณจะต้องทำตามคำแนะนำในการติดตั้งเพื่อให้สิทธิ์เข้าถึงเซิร์ฟเวอร์ MCP ความรู้สำหรับนักพัฒนาซอฟต์แวร์แก่ AI Agent
เมื่อติดตั้งแล้ว คุณสามารถถามคำถามเกี่ยวกับฟีเจอร์ล่าสุดในเอกสารประกอบที่อาจพร้อมใช้งานหลังจากวันที่สิ้นสุดการฝึก AI Agent ของคุณได้
เช่น หากดูบันทึกประจำรุ่นของ Cloud Run คุณจะเห็นรายการสำหรับวันที่ 24 กุมภาพันธ์ 2026 เกี่ยวกับ "การทำให้บริการ Cloud Run แบบหลายภูมิภาคที่มีความพร้อมใช้งานสูงใช้งานได้พร้อมการเปลี่ยนไปใช้ระบบสำรองและการเปลี่ยนกลับอัตโนมัติสำหรับการรับส่งข้อมูลภายนอกโดยใช้สถานะบริการของ Cloud Run (ตัวอย่าง)"
ตอนนี้คุณสามารถถาม AI Agent ว่า "บอกฉันเพิ่มเติมเกี่ยวกับฟีเจอร์ใหม่ของ Cloud Run สำหรับเฟลโอเวอร์อัตโนมัติแบบหลายภูมิภาค"
6. การใช้ Secret Manager
คุณแสดงข้อมูลลับใน Cloud Run ได้ 3 วิธีดังนี้
- เป็นตัวแปรสภาพแวดล้อม (ล็อกไว้กับเวอร์ชันที่ดึงมาตอนเวลาที่ทำการติดตั้งใช้งาน)
- ต่อเชื่อมเป็นวอลุ่มไฟล์ (อัปเดตเป็นเวอร์ชันล่าสุดอย่างต่อเนื่อง)
- การใช้ไลบรารีของไคลเอ็นต์ Secret Manager ในโค้ด
ในส่วนนี้ คุณจะเปิดเผยข้อมูลลับเป็นตัวแปรสภาพแวดล้อมโดยใช้บัญชีบริการเฉพาะ
- สร้างข้อมูลลับใหม่ชื่อ "my-secret"
gcloud secrets create my-secret --replication-policy="automatic"
- เพิ่มค่าข้อมูลลับเป็นเวอร์ชันใหม่โดยทำดังนี้
echo -n "my precious" | gcloud secrets versions add my-secret --data-file=-
- สร้างบัญชีบริการเฉพาะสำหรับแอปสีโดยทำดังนี้
gcloud iam service-accounts create color-app-sa \
--display-name="Color App Service Account"
- ให้สิทธิ์เข้าถึงลับแก่บัญชีบริการเฉพาะ
gcloud secrets add-iam-policy-binding my-secret \
--member="serviceAccount:color-app-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
- ทําการติดตั้งใช้งานอีกครั้ง ตอนนี้บริการจะมีสิทธิ์เข้าถึงตัวแปรสภาพแวดล้อม MY_SECRET แล้ว
gcloud run deploy color-app \
--source . \
--update-secrets=MY_SECRET=my-secret:latest \
--service-account=color-app-sa@${PROJECT_ID}.iam.gserviceaccount.com \
--region=$REGION
7. เชื่อมต่อกับ VPC
ในส่วนนี้ คุณจะตั้งค่าสถาปัตยกรรมต่อไปนี้
- แบ็กเอนด์ส่วนตัวที่เข้าถึงจากอินเทอร์เน็ตสาธารณะไม่ได้
- ส่วนหน้าแบบสาธารณะที่สื่อสารกับส่วนหลังผ่านการออก VPC โดยตรง
ตัวอย่างนี้จะใช้เครือข่ายและซับเน็ตเริ่มต้น
ข้อกำหนดเบื้องต้น: ตรวจสอบว่าได้เปิดใช้การเข้าถึง Google แบบส่วนตัวในซับเน็ตแล้วเพื่อให้ VPC สามารถกำหนดเส้นทางคำขอภายในไปยังบริการ Cloud Run ได้
gcloud compute networks subnets update default \
--region=$REGION \
--enable-private-ip-google-access
- สร้างโฟลเดอร์สำหรับส่วนนี้
mkdir ../vpc-demo
cd ../vpc-demo
- สร้างบริการแบ็กเอนด์ส่วนตัว
mkdir backend
touch backend/app.js
touch backend/package.json
เพิ่มข้อมูลต่อไปนี้ในไฟล์ backend/app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World from the Private Backend!');
});
const port = process.env.PORT || 8080;
server.listen(port, () => {
console.log(`Private backend listening on port ${port}`);
});
เพิ่มข้อมูลต่อไปนี้ในไฟล์ backend/package.json
{
"name": "backend",
"scripts": {
"start": "node app.js"
}
}
- ติดตั้งใช้งานแบ็กเอนด์ส่วนตัวที่มี Ingress ภายในเท่านั้น
gcloud run deploy private-backend \
--source ./backend \
--region $REGION \
--ingress internal \
--no-allow-unauthenticated
- บันทึก URL ของแบ็กเอนด์ คุณจะระบุ URL นี้ให้กับแอปส่วนหน้าในภายหลัง
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projec
tNumber)')
export BACKEND_URL="https://private-backend-${PROJECT_NUMBER}.${REGION}.run.app"
- สร้างแอปฟรอนท์เอนด์
mkdir frontend
touch frontend/app.js
touch frontend/package.json
เพิ่มข้อมูลต่อไปนี้ในไฟล์ frontend/app.js
const http = require('http');
const server = http.createServer(async (req, res) => {
const backendUrl = process.env.BACKEND_URL;
if (!backendUrl) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
return res.end('Error: BACKEND_URL environment variable is missing.');
}
try {
// Fetch the OIDC token from the Metadata server
const tokenResponse = await fetch(`http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=${backendUrl}`, {
headers: { 'Metadata-Flavor': 'Google' }
});
if (!tokenResponse.ok) {
throw new Error(`Failed to fetch identity token: ${tokenResponse.statusText}`);
}
const token = await tokenResponse.text();
// Ping the backend with the token
const response = await fetch(backendUrl, {
headers: { 'Authorization': `Bearer ${token}` }
});
const text = await response.text();
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`Frontend successfully routed through VPC. Backend says: "${text}"`);
} catch (error) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(`Frontend failed to reach the backend. Error: ${error.message}`);
}
});
const port = process.env.PORT || 8080;
server.listen(port, () => {
console.log(`Public frontend listening on port ${port}`);
});
- เพิ่มข้อมูลต่อไปนี้ในไฟล์
frontend/package.json
{
"name": "backend",
"scripts": {
"start": "node app.js"
}
}
- สร้างบัญชีบริการเฉพาะสำหรับบริการส่วนหน้าโดยทำดังนี้
gcloud iam service-accounts create frontend-sa \
--display-name="Frontend Service Account"
- มอบบทบาทผู้เรียกใช้ Cloud Run ให้กับบัญชี
PROJECT_ID=$(gcloud config get project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:frontend-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/run.invoker"
- ตอนนี้ให้ทำให้ใช้งานได้ส่วนหน้าแบบสาธารณะโดยใช้ข้อมูลขาออก VPC โดยตรง เราตั้งค่า "--vpc-egress=all-traffic" เพื่อบังคับให้คำขอขาออกเข้าสู่ VPC ดังนี้
gcloud run deploy public-frontend \
--source ./frontend \
--region $REGION \
--allow-unauthenticated \
--network default \
--subnet default \
--vpc-egress all-traffic \
--service-account=frontend-sa@${PROJECT_ID}.iam.gserviceaccount.com \
--set-env-vars BACKEND_URL=$BACKEND_URL
- ยืนยันบริการ
- ทดสอบฟรอนท์เอนด์: Curl URL ของฟรอนท์เอนด์แบบสาธารณะ โดยควรสื่อสารกับแบ็กเอนด์และแสดงผลการตอบกลับได้สำเร็จ
FRONTEND_URL=$(gcloud run services describe public-frontend --region $REGION --format='value(status.url)')
curl $FRONTEND_URL
- ทดสอบแบ็กเอนด์ (โดยตรง): พยายามใช้คำสั่ง curl กับ URL แบ็กเอนด์โดยตรงจากเครื่องในพื้นที่ (อินเทอร์เน็ตสาธารณะ) ควรจะล้มเหลวด้วยข้อผิดพลาด 404 เนื่องจากมีการจำกัด Ingress เป็น "internal" และต้องมีการตรวจสอบสิทธิ์
curl $BACKEND_URL
8. ติดตั้งใช้งาน ADK Agent
ในส่วนนี้ คุณจะเห็นว่า Buildpack ของ Python รองรับการตรวจหาจุดแรกเข้าเริ่มต้นสำหรับ Agent Development Kit (ADK) อย่างไร
คุณจะสร้างโครงสร้างโฟลเดอร์ต่อไปนี้
adk-demo - my_agent - __init.py__ - agent.py - requirements.txt
- สร้างโครงสร้างโฟลเดอร์
mkdir ../adk-demo
cd ../adk-demo
mkdir my_agent
touch my_agent/__init.py__
touch my_agent/agent.py
touch requirements.txt
- เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์
my_agent/__init.py__
from . import agent
- เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์
my_agent/agent.py
from google.adk import Agent
root_agent = Agent(
name="demo_agent",
model="gemini-3-flash-preview",
instruction="You are a helpful assistant for a Cloud Run demo."
)
- เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์
requirements.txt
google-adk
- สร้างบัญชีบริการเฉพาะสำหรับตัวแทนโดยทำดังนี้
gcloud iam service-accounts create agent-sa \
--display-name="Agent Service Account"
- มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:agent-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
- ติดตั้งใช้งาน Agent ของ ADK
คุณต้องติดตั้งใช้งานในภูมิภาคที่เข้าถึง Gemini API ได้ ในตัวอย่างนี้คือ us-west1
gcloud run deploy my-adk-agent-demo \
--source . \
--region us-west1 \
--allow-unauthenticated \
--service-account=agent-sa@${PROJECT_ID}.iam.gserviceaccount.com \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=TRUE,GOOGLE_CLOUD_PROJECT=$PROJECT_ID,GOOGLE_CLOUD_LOCATION=global"
- Curl ปลายทาง
คุณจะเห็นว่าเอเจนต์พร้อมใช้งานทันทีในรูปแบบ API ที่พร้อมใช้งานจริง
บันทึก URL ของบริการ Cloud Run ลงในตัวแปรสภาพแวดล้อม
AGENT_URL=$(gcloud run services describe my-adk-agent-demo \
--region us-west1 \
--format 'value(status.url)')
สร้างเซสชันกับตัวแทน
curl -X POST $AGENT_URL/apps/my_agent/users/u_123/sessions/s_123 -H "Content-Type: application/json" -d '{"key1": "value1", "key2": 42}'
ถามว่า Cloud Run คืออะไร และกรองคำตอบเพื่อแสดงเฉพาะสิ่งที่ Agent พูด
curl -X POST $AGENT_URL/run \
-H "Content-Type: application/json" \
-d "{
\"appName\": \"my_agent\",
\"userId\": \"u_123\",
\"sessionId\": \"s_123\",
\"newMessage\": {
\"role\": \"user\",
\"parts\": [{ \"text\": \"What is Cloud Run?\"
}]}
}" | python3 -c "import sys, json; print(json.load(sys.stdin)[-1]['content']['parts'][0]['text'])"
และคุณควรเห็นข้อมูลที่มีลักษณะคล้ายด้านล่าง
Hello! I am **demo_agent**, and I'm here to help you with your Cloud Run demo. **Cloud Run** is a fully managed compute platform by Google Cloud that allows you to run **containerized applications** in a serverless environment...
9. ล้างข้อมูล
หากต้องการหลีกเลี่ยงการเรียกเก็บเงินอย่างต่อเนื่องในบัญชี Google Cloud คุณสามารถลบทั้งโปรเจ็กต์ (แสดงด้านล่าง) หรือลบทรัพยากรแต่ละรายการที่สร้างขึ้นระหว่าง Codelab นี้ก็ได้
ลบบริการ nginx, color-app, private-backend, public-frontend
gcloud run services delete nginx-service --region $REGION --quiet
gcloud run services delete color-app --region $REGION --quiet
gcloud run services delete private-backend --region $REGION --quiet
gcloud run services delete public-frontend --region $REGION --quiet
ลบ Agent ของ ADK (หมายเหตุ: ตัวอย่างนี้จะทำให้ใช้งานได้ใน us-west1)
gcloud run services delete my-adk-agent-demo --region us-west1 --quiet
นำข้อมูลลับที่จัดเก็บไว้ใน Secret Manager ออกโดยทำดังนี้
gcloud secrets delete my-secret --quiet
ลบบัญชีบริการของแอป Color
gcloud iam service-accounts delete color-app-sa@${PROJECT_ID}.iam.gserviceaccount.com --quiet
ลบบัญชีบริการของ ADK Agent
gcloud iam service-accounts delete agent-sa@${PROJECT_ID}.iam.gserviceaccount.com --quiet
(ไม่บังคับ) ลบโปรเจ็กต์
หากสร้างโปรเจ็กต์ใหม่สำหรับ Codelab นี้โดยเฉพาะ คุณสามารถลบทั้งโปรเจ็กต์เพื่อให้แน่ใจว่าระบบจะนำทรัพยากรทั้งหมดออกพร้อมกัน
# run only if you want to delete the entire project
gcloud projects delete $PROJECT_ID
10. ยินดีด้วย
คุณทำ Codelab เสร็จแล้ว คุณได้ดูข้อมูลเบื้องต้นเกี่ยวกับการเริ่มต้นใช้งาน Cloud Run แล้ว
สิ่งที่คุณได้เรียนรู้
- ทําให้อิมเมจ nginx ใช้งานได้
- ทําให้ใช้งานได้จากซอร์สโค้ด
- ย้อนกลับการทำให้ใช้งานได้
- แสดงตัวอย่างการทำให้ใช้งานได้
- ใช้เครื่องมือเซิร์ฟเวอร์ MCP ของ Developer Knowledge
- ใช้ Secret Manager กับ Cloud Run
- เชื่อมต่อกับบริการ Cloud Run ภายใน VPC
- ติดตั้งใช้งาน Agent ประเภท ADK ใน Cloud Run