การเชื่อมต่อกับ 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 ส่วนตัว
  • สร้างฐานข้อมูล Private Postgres Cloud SQL
  • เชื่อมต่อ CloudRun กับ 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 ของระบบคลาวด์ การใช้งาน 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

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

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

  1. สร้างอินสแตนซ์ Postgres Cloud SQL เพื่อใช้ 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 ไปยังรีจิสทรีของคอนเทนเนอร์โดยทำดังนี้
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 สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ

กำลังลบโปรเจ็กต์

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