การเชื่อมต่อกับ Private CloudSQL จาก Cloud Run

1. ภาพรวม

ในแล็บนี้ คุณจะได้สร้างบริการเมนู Cymbal Eats โดยแสดง RESTful API เพื่อเพิ่ม อัปเดต ลบ และแสดงรายการเมนู คุณจะสร้างฐานข้อมูล Cloud SQL เป็นฐานข้อมูลแบ็กเอนด์สำหรับบริการเมนู ซึ่งจะทำงานใน Cloud Run เนื่องจาก Cloud Run ไม่ได้อยู่ใน VPC เดียวกับฐานข้อมูล Cloud SQL คุณจะต้องกำหนดค่าเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless เพื่ออนุญาตให้ Cloud Run สื่อสารกับ Cloud SQL ผ่านที่อยู่ IP ส่วนตัว

19c7b05f35789fda.png

สิ่งที่คุณจะได้เรียนรู้

ในแล็บนี้ คุณจะได้เรียนรู้วิธีทำสิ่งต่อไปนี้

  • กำหนดค่าเครือข่าย VPC ส่วนตัว
  • สร้างฐานข้อมูล Cloud SQL ของ Postgres แบบส่วนตัว
  • เชื่อมต่อ Cloud Run กับ VPC ส่วนตัว
  • ติดตั้งใช้งานบริการใน Cloud Run ที่เชื่อมต่อกับฐานข้อมูล Cloud SQL

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

การตั้งค่าสภาพแวดล้อม

  1. สร้างตัวแปรสภาพแวดล้อมที่เกี่ยวข้องกับโปรเจ็กต์และทรัพยากร
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
  1. โคลนที่เก็บและไปที่ไดเรกทอรี
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. เปิดใช้บริการ
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. กำหนดค่าการเข้าถึงแบบส่วนตัว

ระบบจะให้สิทธิ์เข้าถึงบริการส่วนตัวเป็นลิงก์การเพียร์ VPC ระหว่างเครือข่าย VPC ของคุณกับเครือข่าย Google Cloud VPC ที่อยู่เบื้องหลังซึ่งอินสแตนซ์ Cloud SQL ของคุณอยู่ การเชื่อมต่อส่วนตัวช่วยให้อินสแตนซ์ VM ในเครือข่าย VPC และบริการที่คุณใช้สื่อสารผ่านที่อยู่ IP ภายในเท่านั้น อินสแตนซ์ VM ไม่จำเป็นต้องมีการเชื่อมต่ออินเทอร์เน็ตหรือที่อยู่ IP ภายนอกเพื่อเข้าถึงบริการที่พร้อมใช้งานผ่านการเข้าถึงบริการส่วนตัว

  1. จัดสรรช่วงที่อยู่ IP
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. สร้างการเชื่อมต่อส่วนตัว
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

ตัวอย่างเอาต์พุต

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. การตั้งค่า Cloud SQL

Cloud SQL เป็นบริการฐานข้อมูลที่มีการจัดการครบวงจร ซึ่งช่วยให้การตั้งค่า บำรุงรักษา จัดการ และดูแลฐานข้อมูลเชิงสัมพันธ์ PostgreSQL และ MySQL ในระบบคลาวด์เป็นเรื่องง่าย อินสแตนซ์ Cloud SQL แต่ละรายการขับเคลื่อนด้วยเครื่องเสมือน (VM) ที่ทำงานบนเซิร์ฟเวอร์โฮสต์ของ Google Cloud นอกจากนี้ ตัวเลือกความพร้อมใช้งานสูงยังมี VM สแตนด์บายในโซนอื่นที่มีการตั้งค่าเหมือนกับ VM หลักด้วย ระบบจะเก็บฐานข้อมูลไว้ในอุปกรณ์จัดเก็บข้อมูลเครือข่ายที่ปรับขนาดได้และใช้งานได้ยาวนาน ซึ่งเรียกว่าดิสก์ถาวรที่เชื่อมต่อกับ VM ระบบจะกำหนดที่อยู่ IP แบบคงที่ให้กับ VM แต่ละรายการเพื่อให้มั่นใจว่าที่อยู่ IP ที่แอปพลิเคชันเชื่อมต่อจะยังคงเดิมตลอดอายุการใช้งานของอินสแตนซ์ Cloud SQL

219cb722c2dd1b82.png

คุณจะสร้างฐานข้อมูล Cloud SQL ของ Postgres ด้วยที่อยู่ IP ส่วนตัว

สร้างฐานข้อมูลและผู้ใช้

  1. สร้างอินสแตนซ์ Cloud SQL ของ Postgres เพื่อใช้ IP ส่วนตัว
gcloud sql instances create $DB_INSTANCE_NAME \
    --project=$PROJECT_ID \
    --network=projects/$PROJECT_ID/global/networks/default \
    --no-assign-ip \
    --database-version=POSTGRES_12 \
    --cpu=2 \
    --memory=4GB \
    --region=$REGION \
    --root-password=${DB_INSTANCE_PASSWORD}

ตัวอย่างเอาต์พุต

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance].
NAME: menu-instance
DATABASE_VERSION: POSTGRES_12
LOCATION: us-east1-a
TIER: db-custom-2-4096
PRIMARY_ADDRESS: -
PRIVATE_ADDRESS: 10.8.80.5
STATUS: RUNNABLE
  1. เพิ่มฐานข้อมูลไปยังอินสแตนซ์ฐานข้อมูล
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

ตัวอย่างเอาต์พุต

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. สร้างผู้ใช้ SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

ตัวอย่างเอาต์พุต

Created user [menu-user].
  1. จัดเก็บที่อยู่ IP ของฐานข้อมูล
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. เพิ่มบทบาทไคลเอ็นต์ Cloud SQL ให้กับบัญชีบริการ Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

ตัวอย่างเอาต์พุต

Updated IAM policy for project [cymbal1].
[...]

5. VPC แบบ Serverless

การเข้าถึง VPC แบบ Serverless ช่วยให้คุณเชื่อมต่อกับเครือข่าย Virtual Private Cloud ได้โดยตรงจากสภาพแวดล้อมแบบ Serverless เช่น Cloud Run, App Engine หรือ Cloud Functions การกำหนดค่าการเข้าถึง VPC แบบ Serverless ช่วยให้สภาพแวดล้อมแบบ Serverless ส่งคำขอไปยังเครือข่าย VPC โดยใช้ DNS ภายในและที่อยู่ IP ภายใน (ตามที่กำหนดโดย RFC 1918 และ RFC 6598) ได้ การตอบกลับคำขอเหล่านี้จะใช้เครือข่ายภายในของคุณด้วย

คุณจะสร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless สำหรับบริการ Cloud Run เพื่อเชื่อมต่อกับ Cloud SQL

19c7b05f35789fda.png

  1. สร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless ในเครือข่าย VPC เดียวกับอินสแตนซ์ Cloud SQL
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

ตัวอย่างเอาต์พุต

Created connector [cymbalconnector].

6. การทำให้ใช้งานได้กับ Cloud Run

คุณจะสร้างและทําให้อิมเมจ Docker ใช้งานได้ใน Cloud Run และเชื่อมต่อ Cloud Run กับเครื่องมือเชื่อมต่อ VPC แบบ Serverless เพื่อเข้าถึงฐานข้อมูล Cloud SQL

  1. คอมไพล์แอปพลิเคชันโดยใช้ Maven
./mvnw package -DskipTests

ตัวอย่างเอาต์พุต

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. สร้างอิมเมจ Docker
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

ตัวอย่างเอาต์พุต

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. พุชอิมเมจ Docker ไปยัง Container Registry
docker push gcr.io/$PROJECT_NAME/menu-service

ตัวอย่างเอาต์พุต

Using default tag: latest
The push refers to repository [gcr.io/cymbalsql/menu-service]
17b374963800: Pushed
d9a51c06430d: Pushed
fff5d2a2cfc9: Pushed
f21fceb558c6: Pushed
5ffbbbf218dd: Pushed
60609ec85f86: Layer already exists
f2c4302f03b8: Layer already exists
latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
  1. ติดตั้งใช้งานบริการเมนู
gcloud run deploy $MENU_SERVICE_NAME \
    --image=gcr.io/$PROJECT_NAME/menu-service:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars DB_USER=$DB_USER \
    --set-env-vars DB_PASS=$DB_PASSWORD \
    --set-env-vars DB_DATABASE=$DB_DATABASE \
    --set-env-vars DB_HOST=$DB_INSTANCE_IP \
    --vpc-connector $SERVERLESS_VPC_CONNECTOR \
    --project=$PROJECT_ID \
    --quiet

ตัวอย่างเอาต์พุต

[...]
Done.
Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic.
Service URL: https://menu-service-g2mfphytdq-uk.a.run.app

Google ขอแนะนำให้คุณใช้ Secret Manager เพื่อจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลเข้าสู่ระบบ SQL คุณสามารถส่งข้อมูลลับเป็นตัวแปรสภาพแวดล้อมหรือติดตั้งเป็นวอลุ่มด้วย Cloud Run

  1. URL ของบริการเมนูร้านค้า
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. ยืนยัน URL ของบริการเมนู
echo $MENU_SERVICE_URL

ตัวอย่างเอาต์พุต

https://menu-service-g2mfphytdq-uk.a.run.app

7. การทดสอบบริการ

  1. สร้างรายการเมนูใหม่โดยส่งคำขอ POST ดังนี้
curl -X POST "${MENU_SERVICE_URL}/menu" \
  -H 'Content-Type: application/json' \
  -d '{
       "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "itemName": "Curry Plate",
       "itemPrice": 12.5,
       "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "spiceLevel": 3,
       "status": "Ready",
       "tagLine": "Spicy touch for your taste buds!!"
   }'

ตัวอย่างเอาต์พุต

{
    "id": 16,
    "createDateTime": "2022-04-28T18:14:04.17225",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.5,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 3,
    "status": "Processing",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T18:14:04.172298"
}
  1. เปลี่ยนสถานะของรายการเมนูโดยส่งคำขอ PUT ดังนี้
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

ตัวอย่างเอาต์พุต

{
    "id": 1,
    "createDateTime": "2022-04-28T17:21:02.369093",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.50,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 0,
    "status": "Ready",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T17:21:02.657636"
}

8. ยินดีด้วย

ยินดีด้วย คุณทำ Codelab เสร็จแล้ว

ขั้นตอนต่อไปที่ทำได้

ดู Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

การลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ