การเชื่อมต่อกับ 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 และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้อง สร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์ คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณสามารถอัปเดตชื่อนี้ได้ทุกเมื่อ
  • รหัสโปรเจ็กต์ ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เมื่อตั้งค่าแล้วจะเปลี่ยนไม่ได้) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือจะลองใช้รหัสของคุณเองและดูว่ารหัสนั้นพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนรหัสไม่ได้หลังจากขั้นตอนนี้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ใน เอกสารประกอบ
  1. จากนั้นคุณจะต้อง เปิดใช้การเรียกเก็บเงิน ในคอนโซล Cloud เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การทำตาม 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 ของคุณกับเครือข่าย VPC ของ Google Cloud ที่อยู่เบื้องหลังซึ่งอินสแตนซ์ 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 สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ ให้ลบโปรเจ็กต์ที่มีทรัพยากร หรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ

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

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