1. บทนำ
อัปเดตล่าสุด: 2021-05-06
พิจารณาการเชื่อมต่อ
มีแอปพลิเคชันและเฟรมเวิร์กหลายประเภท ในโค้ดแล็บนี้ เราจะพูดถึงการเชื่อมต่อกับ Cloud SQL จากแอปพลิเคชันที่ทำงานบนเครื่องเสมือนที่มีการจัดการใน Google Compute Engine ผ่านที่อยู่ IP ส่วนตัวภายในโดยใช้พร็อกซี Cloud SQL ซึ่งเป็นวิธีที่ปลอดภัยอย่างยิ่งในการเรียกใช้แอปพลิเคชันแบบมีสถานะในระบบคลาวด์ คุณลดการเข้าถึงอินเทอร์เน็ตโดยจำกัดให้ใช้เฉพาะ IP ส่วนตัว และใช้พร็อกซี SQL ซึ่งจัดการการเชื่อมต่อ SSL ให้คุณ
กรณีการใช้งานทั่วไปอย่างหนึ่งคือแอปพลิเคชันในองค์กรที่เปลี่ยนไปทำงานในระบบคลาวด์แทนที่จะทำงานในเครื่อง
สิ่งที่คุณจะสร้าง
Codelab นี้เรียบง่ายมาก แนวคิดนี้คือการแนะนำรายละเอียดของการเชื่อมต่อโดยไม่ต้องคิดถึงแอปพลิเคชันมากเกินไป ในโลกที่สมบูรณ์แบบ การเชื่อมต่อกับ Cloud SQL ก็เหมือนกับการเชื่อมต่อกับอินสแตนซ์อื่นๆ ของฐานข้อมูล SQL ดังนั้นคุณจึงควรนำสิ่งที่สร้างในโค้ดแล็บนี้ไปใช้กับแอปพลิเคชันที่ใช้งานจริงได้
คำสั่งจะรวมทั้งคำแนะนำแบบทีละขั้นตอนในการดำเนินการต่างๆ ในคอนโซล GCP รวมถึงคำสั่ง gcloud ที่เทียบเท่าสำหรับการใช้ใน CLI หรือการทำงานอัตโนมัติ
ขั้นตอนแต่ละขั้นตอนมีดังนี้
- สร้างบัญชีบริการขั้นต่ำเพื่อเปิดใช้การเชื่อมต่อกับอินสแตนซ์ Cloud SQL
- สร้าง VM ใน Google Compute Engine (GCE)
- สร้างอินสแตนซ์ Cloud SQL (บทแนะนำนี้ใช้ Postgres แต่จะทำงานคล้ายกันสำหรับ MySQL หรือ SQL Server)
- ดาวน์โหลดและเรียกใช้พร็อกซี Cloud SQL ในอินสแตนซ์ GCE
สิ่งที่คุณต้องมี
- บัญชี GCP ที่คุณมีสิทธิ์เปิดใช้ API และสร้างบริการ
2. สร้างบัญชีบริการ
บัญชีบริการใช้ในการให้สิทธิ์เพื่อใช้บริการต่างๆ ภายในโปรเจ็กต์ GCP สำหรับโค้ดแล็บนี้ เราจำเป็นต้องมีบัญชีเพื่อมอบสิทธิ์ให้พร็อกซี Cloud SQL เชื่อมต่อกับอินสแตนซ์ Cloud SQL
ในคอนโซล
ไปที่หน้าบัญชีบริการของ IAM แล้วคลิกปุ่ม
ที่ด้านบนของหน้า
ตั้งชื่อและรหัสที่ไม่ซ้ำกันให้กับบัญชีบริการ แล้วคลิกสร้าง
ในหน้าถัดไป ให้คลิกเมนูแบบเลื่อนลงสำหรับเลือกบทบาท กรองหา "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 เป็นบริการที่มีการจัดการซึ่งเครื่องเสมือนจะทำงานและโฮสต์แอปพลิเคชันที่เราต้องการเชื่อมต่อ ในโค้ดแล็บนี้ เราไม่ได้สร้างแอปพลิเคชัน แต่จะยืนยันการเชื่อมต่อโดยการเรียกใช้ psql
ในคอนโซล
ไปที่หน้า Google Compute Engine แล้วคลิกปุ่ม 
คุณมีตัวเลือกมากมายในส่วนนี้ สิ่งที่คุณต้องทำมีเพียง
- ตั้งชื่ออินสแตนซ์
- เปลี่ยน
Machine typeเป็นf1-micro - ในส่วน "ข้อมูลประจำตัวและการเข้าถึง API" ให้เปลี่ยนเมนูแบบเลื่อนลงสำหรับ
Service accountจากDefault compute service accountเป็นรายการที่คุณสร้างไว้ในขั้นตอนก่อนหน้า - คลิกสร้างที่ด้านล่างสุดของหน้า
การใช้ 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 แล้วคลิกปุ่ม 
ดังที่ได้กล่าวไปแล้วว่า Codelab นี้ส่วนใหญ่ใช้ได้กับ SQL ทุกรูปแบบ แต่สำหรับ Codelab นี้ ให้เลือก PostgreSQL
- กำหนดรหัสให้แก่อินสแตนซ์
- ป้อนรหัสผ่านสำหรับผู้ใช้เริ่มต้น (ชื่อผู้ใช้จะเป็นค่าเริ่มต้นสำหรับ DB ที่เลือก เช่น
rootสำหรับ MySQL หรือpostgresสำหรับ PostgreSQL) - หากเปลี่ยนภูมิภาคของอินสแตนซ์ Compute คุณควรเปลี่ยนภูมิภาคที่นี่ให้ตรงกันด้วย
- เลื่อนลงแล้วคลิก
show configuration options - ขยายส่วน
Connectivity - ยกเลิกการเลือกตัวเลือกสำหรับ
Public IPแล้วเลือกช่องทำเครื่องหมายPrivate IP - ตรวจสอบว่าได้เลือก
defaultในเมนูแบบเลื่อนลงที่ปรากฏขึ้นเมื่อเลือก IP ส่วนตัว - เลื่อนลงแล้วคลิกสร้าง
โดยปกติแล้วอินสแตนซ์จะใช้เวลา 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 วิธีการสำหรับส่วนต่างๆ เหล่านี้จะอยู่ในส่วนที่เกี่ยวข้องสำหรับ Console กับ gcloud จากนั้นส่วนที่เหลือจะเป็นคำสั่งที่เรียกใช้จากเชลล์ใน VM ในส่วนของตัวเอง
ในคอนโซล
ไปที่นี่แล้วคลิกชื่ออินสแตนซ์ Cloud SQL
เลื่อนลงเล็กน้อย แล้วคัดลอก Connection name ไว้เพื่อใช้ในภายหลัง
ไปที่หน้ารายการอินสแตนซ์ Google Compute Engine แล้วค้นหาแถวที่มี VM
ในคอลัมน์ Connect ให้คลิกปุ่ม SSH แล้วระบบจะเปิดหน้าต่างแยกต่างหากที่เชื่อมต่อกับเครื่องเสมือนอย่างปลอดภัย
ข้ามส่วน 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 อาจเปลี่ยนแปลงได้หากคุณไม่ได้ใช้ฐานข้อมูล Postgres หรือหากคุณเปลี่ยนพอร์ตเริ่มต้นที่ฐานข้อมูลกำลังฟังอยู่
./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 เหล่านี้