การเชื่อมต่อกับ Cloud SQL: Compute Engine, IP ส่วนตัว และพร็อกซี Cloud SQL

1. บทนำ

อัปเดตล่าสุด 06-05-2021

คำนึงถึงความเชื่อมโยง

แอปพลิเคชันและเฟรมเวิร์กมีอยู่หลายประเภท ใน Codelab นี้ เราจะพูดถึงการเชื่อมต่อกับ Cloud SQL จากแอปพลิเคชันที่ทำงานบนเครื่องเสมือนที่มีการจัดการใน Google Compute Engine ผ่านที่อยู่ IP ส่วนตัวภายในโดยใช้พร็อกซี Cloud SQL วิธีนี้เป็นวิธีที่ปลอดภัยอย่างยิ่งในการเรียกใช้แอปพลิเคชันแบบเก็บสถานะในระบบคลาวด์ คุณกำลังลดจำนวนผู้ที่เห็นอินเทอร์เน็ตโดยจำกัดให้ใช้เฉพาะ IP ส่วนตัว และใช้พร็อกซี SQL ที่จัดการการเชื่อมต่อ SSL ให้คุณ

เช่น แอปพลิเคชันภายในองค์กรที่เปลี่ยนไปทำงานในระบบคลาวด์แทนการทำงานภายในเครื่อง เป็นต้น

สิ่งที่คุณจะสร้าง

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

วิธีการนี้จะมีทั้งคำแนะนำแบบทีละขั้นเกี่ยวกับการดำเนินการต่างๆ ในคอนโซล GCP รวมถึงการรวมคำสั่ง gcloud ที่เทียบเท่าสำหรับการใช้ใน CLI หรือการทำงานอัตโนมัติ

ขั้นตอนแต่ละรายการมีดังนี้

  • สร้างบัญชีบริการขั้นต่ำเพื่อเปิดใช้การเชื่อมต่อกับอินสแตนซ์ Cloud SQL
  • สร้าง VM บน Google Compute Engine (GCE)
  • สร้างอินสแตนซ์ Cloud SQL (บทแนะนำนี้ใช้ Postgres แต่ทำงานคล้ายกันสำหรับ MySQL หรือเซิร์ฟเวอร์ SQL)
  • ดาวน์โหลดและเรียกใช้พร็อกซี Cloud SQL บนอินสแตนซ์ GCE

สิ่งที่คุณต้องมี

  • บัญชี GCP ที่คุณมีสิทธิ์เปิดใช้ API และสร้างบริการ

2. สร้างบัญชีบริการ

บัญชีบริการมีไว้เพื่อให้สิทธิ์การใช้บริการต่างๆ ภายในโปรเจ็กต์ GCP ของคุณ สำหรับ Codelab นี้ เราจำเป็นต้องมีตัวระบุเพื่อให้สิทธิ์พร็อกซี Cloud SQL ในการเชื่อมต่อกับอินสแตนซ์ Cloud SQL

ในคอนโซล

ไปที่หน้าบัญชีบริการ IAM และคลิกปุ่ม f8393a08b37a422c.png ที่ด้านบนของหน้า

ตั้งชื่อและรหัสที่ไม่ซ้ำกันให้แก่บัญชีบริการ แล้วคลิกสร้าง

ในหน้าถัดไป ให้คลิกเมนูแบบเลื่อนลงสำหรับ "เลือกบทบาท" ตัวกรองสำหรับ "Cloud SQL" แล้วเลือกบทบาทไคลเอ็นต์ Cloud SQL คลิกดำเนินการต่อ

คลิก "เสร็จสิ้น"

การใช้ gcloud

สร้างบัญชีบริการ

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

การดำเนินการนี้เป็นการสร้างบัญชีบริการ แต่ปัจจุบันไม่มีการมอบหมายบทบาท/สิทธิ์ให้กับบัญชีบริการ หากต้องการมอบหมายบทบาทที่เหมาะสม ให้เรียกใช้คำสั่งต่อไปนี้

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

เช่น หากบัญชีบริการของคุณมีชื่อว่า sa-test ขณะที่คุณสร้างบัญชี และโปรเจ็กต์ของคุณคือ my-project-test คำสั่งจะเป็นดังนี้

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. กำลังสร้าง VM ของ Compute Engine

Google Compute Engine เป็นบริการที่มีการจัดการที่เครื่องเสมือนจะทำงาน ซึ่งจะเป็นที่เก็บแอปพลิเคชันของเราที่ต้องการเชื่อมต่อ ใน Codelab นี้ เราไม่ได้สร้างแอปพลิเคชัน แต่จะยืนยันการเชื่อมต่อโดยการเรียกใช้ psql

ในคอนโซล

ไปที่หน้า Google Compute Engine และคลิกปุ่ม 77c46cd1f51bed5c.png

มีตัวเลือกมากมายที่นี่ สิ่งเดียวที่คุณต้องทำมีดังนี้

  1. ตั้งชื่ออินสแตนซ์
  2. เปลี่ยน Machine type เป็น f1-micro
  3. ในส่วนข้อมูลประจำตัวและการเข้าถึง API ให้เปลี่ยนเมนูแบบเลื่อนลงของ Service account จาก Default compute service account เป็นรายการที่คุณสร้างในขั้นตอนก่อนหน้า
  4. คลิก สร้าง จนสุดที่ด้านล่างของหน้า

การใช้ gcloud

บัญชีบริการคือชื่อเต็มของบัญชีบริการที่คุณสร้างขึ้นก่อนหน้านี้ ซึ่งจะอยู่ในรูปแบบ <NAME>@<PROJECT>.iam.gserviceaccount.com

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. การสร้างอินสแตนซ์ Cloud SQL

Cloud SQL คือข้อเสนอฐานข้อมูลเชิงสัมพันธ์ที่มีการจัดการของเรา รองรับเซิร์ฟเวอร์ MySQL, PostgreSQL และ SQL สำหรับ Codelab นี้ เราจะสร้างฐานข้อมูล Postgres แต่วิธีการจะคล้ายกันสำหรับทั้ง 3 แพลตฟอร์ม

ในคอนโซล

ไปที่หน้า Cloud SQL และคลิกปุ่ม 241836b315e11bf5.png

อย่างที่บอกไปแล้วว่า Codelab ส่วนใหญ่นี้เป็นแบบทั่วไปสำหรับ SQL เวอร์ชันใดก็ได้ แต่สำหรับ Codelab นี้ ให้เลือก PostgreSQL

  1. กำหนดรหัสสำหรับอินสแตนซ์
  2. ป้อนรหัสผ่านสำหรับผู้ใช้เริ่มต้น (ชื่อผู้ใช้จะเป็นค่าเริ่มต้นสำหรับฐานข้อมูลที่เลือก เช่น root สำหรับ MySQL หรือ postgres สำหรับ PostgreSQL)
  3. หากคุณเปลี่ยนภูมิภาคของอินสแตนซ์การประมวลผล คุณก็ควรเปลี่ยนภูมิภาคที่นี่ด้วย
  4. เลื่อนลงและคลิก show configuration options
  5. ขยายส่วน Connectivity
  6. ยกเลิกการเลือกตัวเลือกสำหรับ Public IP และเลือกช่องทำเครื่องหมาย Private IP
  7. ตรวจสอบว่าได้เลือก default ในเมนูแบบเลื่อนลงที่แสดงขึ้นเมื่อมีการเลือก IP ส่วนตัว
  8. เลื่อนลงแล้วคลิก "สร้าง"

โดยปกติแล้วอินสแตนซ์จะใช้เวลา 2-3 นาทีในการเริ่มต้น

การใช้ gcloud

เนื่องจากเราไม่มีข้อความแจ้งดีๆ ให้เปิดใช้ API จากที่นี่ เราจึงต้องดำเนินการด้วยตนเอง

gcloud services enable servicenetworking.googleapis.com

ถัดไป เราจะต้องเปิดใช้การเชื่อมต่อบริการส่วนตัวในเครือข่าย VPC เริ่มต้น ขั้นตอนแรกคือการจัดสรรช่วงที่อยู่ IP ที่ตั้งชื่อแล้วเพื่อใช้กับอินสแตนซ์ของเรา

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

ขั้นตอนต่อไปคือการกำหนดช่วง IP ดังกล่าวให้กับบริการภายในของเรา (ซึ่งใช้เวลาประมาณ 1 นาที)

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

สุดท้าย การสร้างอินสแตนซ์นั้นพร้อมให้ใช้งานเฉพาะในรุ่นเบต้าเท่านั้นในขณะนี้ การใช้ --no-assign-ip และ --network=default ร่วมกันคือสิ่งที่เปิดใช้การเชื่อมต่อ IP ส่วนตัว ในขณะนี้ยังไม่มีวิธีเปิดใช้ทั้ง IP ส่วนตัวและ IP สาธารณะพร้อมกันได้ ดังนั้นหากต้องการสิทธิ์เข้าถึงแบบสาธารณะ คุณจะต้องแก้ไขอินสแตนซ์หลังการสร้าง การดำเนินการนี้ใช้เวลาเพียงไม่กี่นาที

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. ตั้งค่าและเรียกใช้พร็อกซี Cloud SQL

เมื่อเราเชื่อมต่อกับ VM แล้ว คุณจะต้องมีสตริงการเชื่อมต่ออินสแตนซ์ ก่อนอื่นเราจะเก็บข้อมูลนั้นไว้ จากนั้นจึงเชื่อมต่อกับ VM เองผ่าน SSH วิธีการสำหรับชิ้นส่วนเหล่านี้จะอยู่ในส่วนที่เกี่ยวข้องสำหรับคอนโซลและ gcloud จากนั้นคำสั่งที่เหลือจะเป็นคำสั่งที่เรียกใช้จาก Shell บน VM ในส่วนของตัวเอง

ในคอนโซล

ไปที่นี่ แล้วคลิกชื่ออินสแตนซ์ Cloud SQL

เลื่อนลงมาเล็กน้อยแล้วคัดลอก Connection name ไปที่ไหนก็ได้เพื่อใช้ภายหลัง

ไปที่หน้ารายการอินสแตนซ์ของ Google Compute Engine และค้นหาแถวที่มี VM ของคุณ

คลิกปุ่ม SSH ในคอลัมน์ Connect แล้วระบบจะเปิดหน้าต่างแยกที่เชื่อมต่อกับเครื่องเสมือนอย่างปลอดภัย

ข้ามส่วน Using gcloud สำหรับวิธีการที่เหลือ เพราะเหมือนกันในทั้ง 2 วิธีการ

การใช้ gcloud

แทนที่ <INSTANCE NAME> ด้วยชื่อของอินสแตนซ์ Cloud SQL

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

บันทึกชื่อการเชื่อมต่ออินสแตนซ์ไว้ใช้ในภายหลัง

คุณจะต้องแทนที่ <ZONE> ด้วยโซนที่ใช้กลับเมื่อสร้างอินสแตนซ์ หากคุณไม่ได้เปลี่ยนการตั้งค่าดังกล่าว แสดงว่ามีการตั้งค่าเป็น us-central1-b และแทนที่ <INSTANCE_NAME> ด้วยสิ่งที่คุณได้ระบุไว้ก่อนหน้านี้

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

เมื่อเชื่อมต่อกับ VM แล้ว

ก่อนอื่น เราต้องดาวน์โหลดพร็อกซี ขึ้นอยู่กับระบบปฏิบัติการของคุณ หากไม่ได้เปลี่ยนระบบปฏิบัติการในการสร้าง VM ระบบปฏิบัติการนั้นจะเป็น Linux และคุณใช้สิ่งต่อไปนี้ได้

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

หากคุณเปลี่ยนระบบปฏิบัติการ คุณสามารถไปที่นี่เพื่อดูคำสั่งที่ถูกต้องเพื่อรับพร็อกซีสำหรับระบบปฏิบัติการ

หากต้องการเรียกใช้พร็อกซี ให้ใช้ชื่อการเชื่อมต่ออินสแตนซ์ที่คัดลอกมาจากรายละเอียดอินสแตนซ์ Cloud SQL เพื่อแทนที่ <INSTANCE_CONNECTION_NAME> นอกจากนี้ หมายเลขพอร์ต tcp อาจเปลี่ยนแปลงถ้าคุณไม่ได้ใช้ db ของ Postgres หรือถ้าคุณเปลี่ยนพอร์ตเริ่มต้นที่ db เปิดใช้งานอยู่

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. ทดสอบการเชื่อมต่อและสรุป

ดังที่กล่าวไว้ก่อนหน้านี้ หากคุณมีแอปพลิเคชันที่ต้องการใช้งานในอินสแตนซ์ GCE เพื่อทดสอบ ก็ไม่มีปัญหาเช่นกัน สำหรับ Codelab นี้ เราจะติดตั้ง psql และใช้ไคลเอ็นต์ดังกล่าวเพื่อยืนยันว่าเราเชื่อมต่อกับฐานข้อมูลได้

จากเซสชัน SSH บน VM ให้ทำดังนี้

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

จากนั้นระบุรหัสผ่านเริ่มต้นของผู้ใช้ที่คุณตั้งค่าไว้เมื่อสร้างอินสแตนซ์ Cloud SQL

ยินดีด้วย หากทุกอย่างดูดีแล้ว คุณควรมีข้อความแจ้ง Postgres และสามารถเรียกใช้คำสั่งกับฐานข้อมูลของคุณได้

สิ่งที่ต้องทำต่อไป

ลองดู Codelab เหล่านี้...

เอกสารอ้างอิง