1. ภาพรวม
ชุดโปรแกรม Codelab สำหรับการย้ายข้อมูลแบบ Serverless (บทแนะนำแบบลงมือทำด้วยตนเอง) และวิดีโอที่เกี่ยวข้องมีจุดประสงค์เพื่อช่วยให้นักพัฒนาแอป Google Cloud Serverless ปรับการดำเนินการให้ทันสมัยได้ด้วยคำแนะนำการย้ายข้อมูลอย่างน้อย 1 รายการ โดยให้ย้ายออกจากบริการเดิมเป็นหลัก การดำเนินการดังกล่าวทำให้แอปพกพาไปได้ทุกที่ รวมถึงมอบตัวเลือกและความยืดหยุ่นที่มากขึ้น ทำให้สามารถผสานรวมและเข้าถึงผลิตภัณฑ์ Cloud ที่หลากหลายยิ่งขึ้น และอัปเกรดเป็นรุ่นภาษาใหม่ๆ ได้ง่ายยิ่งขึ้น แม้ว่าในช่วงแรกจะมุ่งเน้นที่ผู้ใช้ Cloud รุ่นแรกสุด ซึ่งเป็นนักพัฒนา App Engine (สภาพแวดล้อมมาตรฐาน) เป็นหลัก แต่ชุดโซลูชันนี้ก็กว้างพอที่จะรวมแพลตฟอร์มแบบ Serverless อื่นๆ เช่น Cloud Functions และ Cloud Run หรือแพลตฟอร์มอื่นๆ ที่เกี่ยวข้อง
วัตถุประสงค์ของ Codelab นี้คือแสดงให้นักพัฒนาซอฟต์แวร์ Python 2 App Engine ทราบวิธีย้ายข้อมูลจาก App Engine Memcache ไปยัง Cloud Memorystore (สำหรับ Redis) นอกจากนี้ ยังมีการย้ายข้อมูลโดยนัยจาก App Engine ndb
ไปยัง Cloud NDB แต่ครอบคลุมอยู่ใน Codelab ของโมดูล 2 เป็นหลัก ให้ดูข้อมูลเพิ่มเติมแบบทีละขั้นตอน
คุณจะได้เรียนรู้วิธีต่อไปนี้
- ตั้งค่าอินสแตนซ์ Cloud Memorystore (จาก Cloud Console หรือเครื่องมือ
gcloud
) - ตั้งค่าเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Cloud Serverless (จาก Cloud Console หรือเครื่องมือ
gcloud
) - ย้ายข้อมูลจาก App Engine Memcache ไปยัง Cloud Memorystore
- ใช้การแคชด้วย Cloud Memorystore ในแอปตัวอย่าง
- ย้ายข้อมูลจาก App Engine
ndb
ไปยัง Cloud NDB
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud ที่มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่ (ไม่ใช่ Codelab แบบไม่มีค่าใช้จ่าย)
- ทักษะพื้นฐานเรื่อง Python
- ความรู้เกี่ยวกับคำสั่งทั่วไปของ Linux
- ความรู้พื้นฐานเกี่ยวกับการพัฒนาและการทำให้แอป App Engine ใช้งานได้
- แอป App Engine โมดูล 12 ที่ใช้งานได้ (ทำตามขั้นตอนใน Codelab ของโมดูล 12 [แนะนำ] หรือคัดลอกแอปโมดูล 12 จากที่เก็บ)
แบบสำรวจ
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร
คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร
2. ข้อมูลเบื้องต้น
Codelab นี้จะสาธิตวิธีย้ายข้อมูลแอปตัวอย่างจาก App Engine Memcache (และ NDB) ไปยัง Cloud Memorystore (และ Cloud NDB) กระบวนการนี้เกี่ยวข้องกับการแทนที่ทรัพยากร Dependency ในบริการแบบรวมของ App Engine ซึ่งทำให้แอปพกพาสะดวกยิ่งขึ้น คุณสามารถเลือกที่จะใช้ App Engine ต่อไปหรือลองเปลี่ยนไปใช้ทางเลือกอื่นที่อธิบายก่อนหน้านี้
การย้ายข้อมูลนี้ต้องใช้ความพยายามมากขึ้นเมื่อเทียบกับการย้ายข้อมูลอื่นๆ ในซีรีส์นี้ สิ่งที่แนะนำให้ใช้แทน App Engine Memcache คือ Cloud Memorystore ซึ่งเป็นบริการแคชในระบบคลาวด์ที่มีการจัดการครบวงจร Memorystore รองรับเครื่องมือแคชแบบโอเพนซอร์สยอดนิยมทั้ง Redis และ Memcached โมดูลการย้ายข้อมูลนี้ใช้ Cloud Memorystore สำหรับ Redis ดูข้อมูลเพิ่มเติมได้ในภาพรวม Memorystore และ Redis
เนื่องจาก Memorystore ต้องใช้เซิร์ฟเวอร์ที่ทำงานอยู่ จึงต้องมี Cloud VPC ด้วย กล่าวอย่างเจาะจงคือ คุณต้องสร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless เพื่อให้แอป App Engine เชื่อมต่อกับอินสแตนซ์ Memorystore ผ่านที่อยู่ IP ส่วนตัวได้ เมื่อทำแบบฝึกหัดนี้เสร็จแล้ว คุณจะได้อัปเดตแอปเพื่อให้แอปทำงานตามเดิม แต่ Cloud Memorystore จะเป็นบริการแคชแทนบริการ Memcache ของ App Engine
บทแนะนำนี้เริ่มต้นด้วยแอปตัวอย่างโมดูล 12 ใน Python 2 ตามด้วยการอัปเกรดเล็กน้อยเพิ่มเติมที่ไม่บังคับเป็น Python 3 หากคุณคุ้นเคยกับการเข้าถึงบริการแพ็กเกจของ App Engine จาก Python 3 ผ่าน Python 3 App Engine SDK อยู่แล้ว คุณสามารถเริ่มต้นด้วยเวอร์ชัน Python 3 ของแอปตัวอย่างโมดูล 12 แทน การทำเช่นนี้จะส่งผลให้มีการใช้ SDK ด้วย เนื่องจาก Memorystore ไม่ใช่บริการแพ็กเกจของ App Engine การเรียนรู้วิธีใช้ Python 3 App Engine SDK อยู่นอกขอบเขตของบทแนะนำนี้
บทแนะนำนี้มีขั้นตอนสำคัญดังต่อไปนี้
- การตั้งค่า/งานล่วงหน้า
- ตั้งค่าบริการแคช
- อัปเดตไฟล์การกำหนดค่า
- อัปเดตแอปพลิเคชันหลัก
3. การตั้งค่า/งานล่วงหน้า
เตรียมโปรเจ็กต์ที่อยู่ในระบบคลาวด์
เราขอแนะนำให้ใช้โปรเจ็กต์เดียวกันกับที่คุณใช้สำหรับทำ Codelab ของโมดูล 12 ให้เสร็จสิ้น หรือคุณจะสร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์อื่นที่มีอยู่มาใช้ใหม่ก็ได้ Codelab ทุกรายการในชุดนี้จะมี "START" (โค้ดพื้นฐานที่จะเริ่มต้น) และ "FINISH" (แอปที่ย้ายข้อมูลแล้ว) รหัส FINISH จัดเตรียมไว้ให้เพื่อให้คุณเปรียบเทียบวิธีแก้ปัญหากับบริการของเราได้ในกรณีที่คุณพบปัญหา คุณสามารถย้อนกลับไปใช้ START ได้ทุกเมื่อหากเกิดข้อผิดพลาด จุดตรวจเหล่านี้ออกแบบมาเพื่อให้แน่ใจว่าคุณประสบความสำเร็จในการเรียนรู้วิธีดำเนินการย้ายข้อมูล
ไม่ว่าคุณจะใช้โปรเจ็กต์ Cloud ใดก็ตาม โปรดตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่ และตรวจสอบว่าได้เปิดใช้ App Engine แล้ว ทบทวนและทำความเข้าใจผลกระทบต่อต้นทุนทั่วไปในการทำบทแนะนำเหล่านี้ แต่ Codelab นี้ต่างจากเครื่องมืออื่นๆ ในซีรีส์นี้ตรงที่ใช้ทรัพยากรระบบคลาวด์ที่ไม่มีรุ่นฟรี ดังนั้นจึงจะเกิดค่าใช้จ่ายบางอย่างขึ้นเพื่อดำเนินการให้เสร็จสิ้น จะมีข้อมูลค่าใช้จ่ายที่เฉพาะเจาะจงมากขึ้นพร้อมกับคำแนะนำสำหรับการใช้งานที่ลดลง รวมทั้งคำแนะนำในตอนท้ายเกี่ยวกับการปล่อยทรัพยากรเพื่อลดค่าใช้จ่ายในการเรียกเก็บเงิน
รับแอปตัวอย่างพื้นฐาน
Codelab นี้จะแนะนำการย้ายข้อมูลแบบทีละขั้นตอนจากโค้ดพื้นฐานของโมดูล 12 ที่เราอยู่ในช่วงเริ่มต้น เมื่อเสร็จแล้ว คุณจะเข้าสู่แอปโมดูล 13 ที่ใช้งานได้คล้ายกับโค้ดในโฟลเดอร์หนึ่งของ FINISH แหล่งข้อมูลดังกล่าวมีดังนี้
- START: โมดูล 12 Python 2 (
mod12
) หรือแอป Python 3 (mod12b
) - สิ้นสุด: โมดูล 13 Python 2 (
mod13a
) หรือแอป Python 3 (mod13b
) - พื้นที่เก็บข้อมูลการย้ายข้อมูลทั้งหมด (โคลนหรือดาวน์โหลด ZIP)
โฟลเดอร์ START ควรมีไฟล์ต่อไปนี้
$ ls README.md app.yaml main.py requirements.txt templates
หากคุณเริ่มต้นจากเวอร์ชัน Python 2 คุณจะเห็นไฟล์ appengine_config.py
และอาจเป็นโฟลเดอร์ lib
หากคุณทำ Codelab ของโมดูล 12 เสร็จสมบูรณ์
ทำให้แอปโมดูล 12 ใช้งานได้ (ใหม่)
ขั้นตอนก่อนการทำงานที่เหลือของคุณมีดังนี้
- ทำความคุ้นเคยกับเครื่องมือบรรทัดคำสั่ง
gcloud
(หากจำเป็น) - (อีกครั้ง) ทำให้โค้ดโมดูล 12 ใช้งานได้ใน App Engine (หากจำเป็น)
ผู้ใช้ Python 2 ควรลบและติดตั้งโฟลเดอร์ lib
อีกครั้งด้วยคำสั่งต่อไปนี้
rm -rf ./lib; pip install -t lib -r requirements.txt
ตอนนี้ทุกคน (ผู้ใช้ Python 2 และ 3) ควรอัปโหลดโค้ดไปยัง App Engine ด้วยคำสั่งนี้
gcloud app deploy
เมื่อติดตั้งใช้งานสำเร็จแล้ว ให้ยืนยันว่าแอปมีลักษณะและการทำงานเหมือนกับแอปในโมดูล 12 ซึ่งเป็นเว็บแอปที่ติดตามการเข้าชม โดยแคชการเข้าชมให้กับผู้ใช้รายเดียวกันเป็นเวลา 1 ชั่วโมง
เนื่องจากการเข้าชมล่าสุดจะถูกแคชไว้ การรีเฟรชหน้าควรจะโหลดได้เร็วพอสมควร
4. ตั้งค่าบริการแคช
Cloud Memorystore ไม่ใช่แบบ Serverless ต้องมีอินสแตนซ์ ซึ่งในกรณีนี้มีไฟล์ Redis อยู่ Memorystore เป็นผลิตภัณฑ์ระบบคลาวด์แบบสแตนด์อโลนและไม่มีรุ่นฟรี ซึ่งแตกต่างจาก Memcache ตรงที่แนะนำให้ตรวจสอบข้อมูลราคา Memorystore สำหรับ Redis ก่อนดำเนินการต่อ เราขอแนะนำให้ใช้ทรัพยากรน้อยที่สุดในการปฏิบัติงาน เพื่อลดค่าใช้จ่ายสำหรับแบบฝึกหัดนี้ ซึ่งได้แก่ ระดับบริการพื้นฐานและความจุ 1 GB
อินสแตนซ์ Memorystore อยู่ในเครือข่ายที่แตกต่างจากแอป (อินสแตนซ์) ในแอป App Engine ของคุณ จึงเป็นเหตุผลที่ต้องสร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless เพื่อให้ App Engine เข้าถึงทรัพยากร Memorystore ได้ หากต้องการลดค่าใช้จ่าย VPC ให้เลือกประเภทอินสแตนซ์ (f1-micro
) และจำนวนอินสแตนซ์ขั้นต่ำที่จะขอ (ขอแนะนำเป็นขั้นต่ำ 2 สูงสุด 3) นอกจากนี้ โปรดดูหน้าข้อมูลราคา VPC
เราจะให้คำแนะนำดังกล่าวซ้ำเพื่อลดค่าใช้จ่าย เนื่องจากเราจะแนะนำคุณตลอดขั้นตอนการสร้างทรัพยากรที่จำเป็นแต่ละรายการ นอกจากนี้ เมื่อสร้างทรัพยากร Memorystore และ VPC ใน Cloud Console คุณจะเห็นเครื่องคำนวณราคาสำหรับแต่ละผลิตภัณฑ์ที่มุมขวาบน ซึ่งจะแสดงค่าใช้จ่ายรายเดือนโดยประมาณ (ดูภาพประกอบด้านล่าง) ค่าเหล่านี้จะปรับโดยอัตโนมัติหากคุณเปลี่ยนตัวเลือก นี่คือสิ่งที่คุณควรเห็นโดยประมาณ:
คุณจำเป็นต้องใช้ทรัพยากรทั้ง 2 รายการนี้ และจะสร้างทรัพยากรใดก่อนก็ได้ หากสร้างอินสแตนซ์ Memorystore ก่อน แอป App Engine จะเข้าถึงอินสแตนซ์นั้นไม่ได้หากไม่มีเครื่องมือเชื่อมต่อ VPC ในทำนองเดียวกัน หากคุณสร้างเครื่องมือเชื่อมต่อ VPC ก่อน จะไม่มีข้อมูลในเครือข่าย VPC นั้นให้แอป App Engine พูดคุยด้วย บทแนะนำนี้จะให้คุณสร้างอินสแตนซ์ Memorystore ก่อน ตามด้วยเครื่องมือเชื่อมต่อ VPC
เมื่อแหล่งข้อมูลทั้ง 2 รายการออนไลน์แล้ว คุณจะเพิ่มข้อมูลที่เกี่ยวข้องใน app.yaml
เพื่อให้แอปเข้าถึงแคชได้ นอกจากนี้ คุณยังดูคู่มือ Python 2 หรือ Python 3 ในเอกสารอย่างเป็นทางการได้ด้วย คู่มือการแคชข้อมูลในหน้าการย้ายข้อมูล Cloud NDB ( Python 2 หรือ Python 3) ก็ควรอ้างอิงเช่นกัน
สร้างอินสแตนซ์ Cloud Memorystore
เนื่องจาก Cloud Memorystore ไม่มีรุ่นฟรี เราจึงแนะนำให้จัดสรรทรัพยากรจำนวนน้อยที่สุดเพื่อดำเนินการ Codelab ให้เสร็จสมบูรณ์ คุณสามารถจำกัดค่าใช้จ่ายให้น้อยที่สุดโดยใช้การตั้งค่าเหล่านี้:
- เลือกระดับบริการต่ำสุด ได้แก่ พื้นฐาน (ค่าเริ่มต้นของคอนโซล: "มาตรฐาน", ค่าเริ่มต้น
gcloud
คือ "พื้นฐาน") - เลือกปริมาณพื้นที่เก็บข้อมูลน้อยที่สุดคือ 1 GB (ค่าเริ่มต้นของคอนโซลคือ 16 GB, ค่าเริ่มต้น
gcloud
คือ 1 GB) - โดยทั่วไปแล้ว ซอฟต์แวร์เวอร์ชันใดก็ได้ที่ใหม่ที่สุดจะต้องใช้ทรัพยากรมากที่สุด แต่เราไม่แนะนำให้เลือกเวอร์ชันที่เก่าที่สุดเช่นกัน เวอร์ชันที่สองล่าสุดในปัจจุบันคือเวอร์ชัน Redis 5.0 (ค่าเริ่มต้นของคอนโซลคือ 6.x)
เมื่อคำนึงถึงการตั้งค่าเหล่านั้นแล้ว ส่วนถัดไปจะแนะนำขั้นตอนการสร้างอินสแตนซ์จาก Cloud Console หากต้องการดำเนินการจากบรรทัดคำสั่ง ให้ข้ามไปข้างหน้า
จาก Cloud Console
ไปที่หน้า Cloud Memorystore ใน Cloud Console (ระบบอาจแจ้งให้คุณป้อนข้อมูลสำหรับการเรียกเก็บเงิน) หากยังไม่ได้เปิดใช้ Memorystore คุณจะได้รับข้อความแจ้งให้เปิดใช้ดังนี้
เมื่อคุณเปิดใช้ (และอาจรวมทั้งการเรียกเก็บเงิน) คุณจะเข้าสู่หน้าแดชบอร์ดของ Memorystore ในส่วนนี้คุณจะเห็นอินสแตนซ์ทั้งหมดที่สร้างขึ้นในโปรเจ็กต์ โปรเจ็กต์ที่แสดงด้านล่างไม่มีแถวใดเลย ด้วยเหตุนี้คุณจึงเห็นข้อความ "ไม่มีแถวที่จะแสดง" หากต้องการสร้างอินสแตนซ์ Memorystore ให้คลิกสร้างอินสแตนซ์ที่ด้านบน
หน้านี้จะมีแบบฟอร์มสำหรับกรอกการตั้งค่าที่คุณต้องการเพื่อสร้างอินสแตนซ์ Memorystore
โปรดทำตามคำแนะนำที่พูดถึงไปก่อนหน้านี้เพื่อลดค่าใช้จ่ายสำหรับบทแนะนำนี้และแอปตัวอย่าง หลังจากเลือกแล้ว ให้คลิกสร้าง ขั้นตอนการสร้างใช้เวลาหลายนาที เมื่อเสร็จแล้ว ให้คัดลอกที่อยู่ IP ของอินสแตนซ์และหมายเลขพอร์ตเพื่อเพิ่มลงใน app.yaml
จากบรรทัดคำสั่ง
แม้ว่าการสร้างอินสแตนซ์ Memorystore จาก Cloud Console จะเป็นข้อมูลที่เห็นได้ชัดเจน แต่บางคนก็เลือกใช้บรรทัดคำสั่งมากกว่า โปรดตรวจสอบว่า gcloud
ติดตั้งและเริ่มต้นแล้วก่อนที่จะดำเนินการต่อ
ต้องเปิดใช้ Cloud Memorystore สำหรับ Redis เช่นเดียวกับ Cloud Console ออกคำสั่ง gcloud services enable redis.googleapis.com
และรอให้ดำเนินการเสร็จสิ้น ดังตัวอย่างต่อไปนี้
$ gcloud services enable redis.googleapis.com Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
หากเปิดใช้บริการแล้ว การเรียกใช้คำสั่ง (อีกครั้ง) จะไม่ส่งผลข้างเคียง (เชิงลบ) เมื่อเปิดใช้บริการแล้ว เราจะสร้างอินสแตนซ์ Memorystore คำสั่งดังกล่าวมีลักษณะดังนี้
gcloud redis instances create NAME --redis-version VERSION \ --region REGION --project PROJECT_ID
เลือกชื่อสำหรับอินสแตนซ์ Memorystore ของคุณ ห้องทดลองนี้ใช้ "demo-ms
" เป็นชื่อพร้อมกับรหัสโปรเจ็กต์ "my-project
" ภูมิภาคของแอปตัวอย่างนี้คือ us-central1
(เหมือนกับ us-central
) แต่คุณอาจใช้ภูมิภาคอื่นที่อยู่ใกล้คุณมากกว่าหากกังวลเกี่ยวกับเวลาในการตอบสนอง คุณต้องเลือกภูมิภาคเดียวกับแอป App Engine คุณจะเลือกเวอร์ชัน Redis ใดก็ได้ตามต้องการ แต่เราใช้เวอร์ชัน 5 ตามที่แนะนำก่อนหน้านี้แล้ว จากการตั้งค่าเหล่านั้น นี่คือคำสั่งที่คุณจะออก (พร้อมด้วยเอาต์พุตที่เกี่ยวข้อง)
$ gcloud redis instances create demo-ms --region us-central1 \ --redis-version redis_5_0 --project my-project Create request issued for: [demo-ms] Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done. Created instance [demo-ms].
gcloud
จะใช้ทรัพยากรน้อยที่สุดโดยค่าเริ่มต้น ซึ่งต่างจากค่าเริ่มต้นของ Cloud Console ผลที่ได้คือไม่จำเป็นต้องใช้ระดับบริการและปริมาณพื้นที่เก็บข้อมูลในคำสั่งนั้น การสร้างอินสแตนซ์ Memorystore ใช้เวลาหลายนาที และเมื่อดำเนินการเสร็จแล้ว โปรดจดบันทึกที่อยู่ IP และหมายเลขพอร์ตของอินสแตนซ์ เนื่องจากจะมีการเพิ่มลงใน app.yaml
ในไม่ช้า
ยืนยันการสร้างอินสแตนซ์
จาก Cloud Console หรือบรรทัดคำสั่ง
ไม่ว่าจะสร้างอินสแตนซ์จาก Cloud Console หรือบรรทัดคำสั่ง คุณสามารถยืนยันได้ว่าอินสแตนซ์พร้อมใช้งานและพร้อมใช้งานด้วยคำสั่งนี้: gcloud redis instances list --region REGION
นี่คือคำสั่งสำหรับตรวจสอบอินสแตนซ์ในภูมิภาค us-central1
พร้อมกับเอาต์พุตที่คาดไว้ซึ่งแสดงอินสแตนซ์ที่เราเพิ่งสร้างขึ้น
$ gcloud redis instances list --region us-central1 INSTANCE_NAME VERSION REGION TIER SIZE_GB HOST PORT NETWORK RESERVED_IP STATUS CREATE_TIME demo-ms REDIS_5_0 us-central1 BASIC 1 10.aa.bb.cc 6379 default 10.aa.bb.dd/29 READY 2022-01-28T09:24:45
เมื่อระบบขอข้อมูลอินสแตนซ์หรือกำหนดค่าแอป โปรดใช้ HOST
และ PORT
(ไม่ใช่ RESERVED_IP
) ตอนนี้แดชบอร์ด Cloud Memorystore ใน Cloud Console ควรแสดงอินสแตนซ์ต่อไปนี้
จากเครื่องเสมือน Compute Engine
หากมีเครื่องเสมือน (VM) ของ Compute Engine คุณจะส่งคำสั่งโดยตรงของอินสแตนซ์ Memorystore จาก VM เพื่อยืนยันว่าใช้งานได้ โปรดทราบว่าการใช้ VM อาจมีค่าใช้จ่ายที่เกี่ยวข้องซึ่งไม่เกี่ยวข้องกับทรัพยากรที่คุณใช้อยู่แล้ว
สร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless
คุณสร้างเครื่องมือเชื่อมต่อ Cloud VPC แบบ Serverless ใน Cloud Console หรือในบรรทัดคำสั่งได้เช่นเดียวกับ Cloud Memorystore ในทำนองเดียวกัน Cloud VPC ไม่มีรุ่นฟรี เราจึงแนะนำให้จัดสรรทรัพยากรจำนวนน้อยที่สุดเพื่อดำเนินการ Codelab ให้เสร็จสมบูรณ์เพื่อคงต้นทุนให้น้อยที่สุด ซึ่งทำได้โดยใช้การตั้งค่าต่อไปนี้
- เลือกจำนวนอินสแตนซ์สูงสุดต่ำสุด: 3 (คอนโซลและค่าเริ่มต้น
gcloud
: 10) - เลือกประเภทเครื่องที่ต้นทุนต่ำสุด:
f1-micro
(ค่าเริ่มต้นของคอนโซล:e2-micro
ไม่มีค่าเริ่มต้นgcloud
)
ส่วนถัดไปจะแนะนำการสร้างเครื่องมือเชื่อมต่อจาก Cloud Console โดยใช้การตั้งค่า Cloud VPC ข้างต้น หากต้องการดำเนินการจากบรรทัดคำสั่ง ให้ข้ามไปยังส่วนถัดไป
จาก Cloud Console
ไปที่เครือข่ายระบบคลาวด์ "การเข้าถึง VPC แบบ Serverless" ใน Cloud Console (ระบบอาจแจ้งให้คุณป้อนข้อมูลสำหรับการเรียกเก็บเงิน) หากยังไม่ได้เปิดใช้ API ระบบจะแจ้งให้คุณเปิดใช้ ดังนี้
เมื่อเปิดใช้ API (และอาจรวมถึงการเรียกเก็บเงิน) คุณจะเข้าสู่หน้าแดชบอร์ดที่แสดงเครื่องมือเชื่อมต่อ VPC ทั้งหมดที่สร้างขึ้น โปรเจ็กต์ที่ใช้ในภาพหน้าจอด้านล่างไม่มีโปรเจ็กต์ จึงมีข้อความว่า "ไม่มีแถวที่จะแสดง" ในคอนโซล ให้คลิกสร้างเครื่องมือเชื่อมต่อที่ด้านบน
กรอกแบบฟอร์มโดยใช้การตั้งค่าที่ต้องการต่อไปนี้
เลือกการตั้งค่าที่เหมาะสมสำหรับแอปพลิเคชันของคุณเอง สำหรับบทแนะนำนี้และแอปตัวอย่างที่มีความต้องการน้อยที่สุด การลดค่าใช้จ่ายจึงเป็นเรื่องสมเหตุสมผล ดังนั้นให้ทำตามคำแนะนำที่ระบุไว้ก่อนหน้านี้ เมื่อเลือกแล้ว ให้คลิกสร้าง การกำหนดเครื่องมือเชื่อมต่อ VPC จะใช้เวลา 2-3 นาทีจึงจะเสร็จสมบูรณ์
จากบรรทัดคำสั่ง
ก่อนสร้างเครื่องมือเชื่อมต่อ VPC ให้เปิดใช้ API การเข้าถึง VPC แบบ Serverless ก่อน คุณควรเห็นผลลัพธ์ที่คล้ายกันหลังจากออกคำสั่งต่อไปนี้
$ gcloud services enable vpcaccess.googleapis.com Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
เมื่อเปิดใช้ API แล้ว ระบบจะสร้างเครื่องมือเชื่อมต่อ VPC ด้วยคำสั่งที่มีลักษณะดังนี้
gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --range 10.8.0.0/28 --region REGION --project PROJECT_ID
เลือกชื่อให้กับเครื่องมือเชื่อมต่อ รวมถึงที่อยู่ IP เริ่มต้นของบล็อก /28
CIDR ที่ไม่ได้ใช้ บทแนะนำนี้มีสมมติฐานดังต่อไปนี้
- รหัสโปรเจ็กต์:
my-project
- ชื่อเครื่องมือเชื่อมต่อ VPC:
demo-vpc
- จำนวนอินสแตนซ์ขั้นต่ำ: 2 (ค่าเริ่มต้น) และจำนวนอินสแตนซ์สูงสุด: 3
- ประเภทอินสแตนซ์:
f1-micro
- ภูมิภาค:
us-central1
- บล็อก CIDR ของ IPv4:
10.8.0.0/28
(ตามที่แนะนำในคอนโซลระบบคลาวด์)
คาดหวังว่าเอาต์พุตจะคล้ายกับที่คุณเห็นด้านล่าง หากคุณเรียกใช้คำสั่งต่อไปนี้โดยคำนึงถึงสมมติฐานข้างต้น:
$ gcloud compute networks vpc-access connectors create demo-vpc \ --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \ --region us-central1 --project my-project Create request issued for: [demo-vpc] Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done. Created connector [demo-vpc].
คำสั่งด้านบนจะละเว้นการกำหนดค่าเริ่มต้น เช่น อินสแตนซ์ขั้นต่ำของ 2 และเครือข่ายชื่อ default
การสร้างเครื่องมือเชื่อมต่อ VPC ใช้เวลาหลายนาทีจึงจะเสร็จสมบูรณ์
ยืนยันการสร้างเครื่องมือเชื่อมต่อ
เมื่อกระบวนการเสร็จสมบูรณ์แล้ว ให้ออกคำสั่ง gcloud
ต่อไปนี้ โดยสมมติว่าเป็นภูมิภาค us-central1
เพื่อยืนยันว่าสร้างแล้วและพร้อมใช้งาน
$ gcloud compute networks vpc-access connectors list --region us-central1 CONNECTOR_ID REGION NETWORK IP_CIDR_RANGE SUBNET SUBNET_PROJECT MIN_THROUGHPUT MAX_THROUGHPUT STATE demo-vpc us-central1 default 10.8.0.0/28 200 300 READY
ในทำนองเดียวกัน หน้าแดชบอร์ดควรแสดงเครื่องมือเชื่อมต่อที่คุณเพิ่งสร้างขึ้น ดังนี้
จดบันทึกรหัสโปรเจ็กต์ที่อยู่ในระบบคลาวด์ ชื่อเครื่องมือเชื่อมต่อ VPC และภูมิภาค
เมื่อคุณสร้างทรัพยากร Cloud เพิ่มเติมที่จำเป็นแล้ว ไม่ว่าจะด้วยบรรทัดคำสั่งหรือในคอนโซล ก็ถึงเวลาอัปเดตการกำหนดค่าแอปพลิเคชันเพื่อรองรับการใช้งาน
5. อัปเดตไฟล์การกำหนดค่า
ขั้นตอนแรกคือทำการอัปเดตไฟล์การกำหนดค่าที่จำเป็นทั้งหมด เป้าหมายหลักของ Codelab คือการช่วยผู้ใช้ Python 2 ในการช่วยย้ายข้อมูล อย่างไรก็ตาม โดยปกติแล้วเนื้อหาจะตามด้วยข้อมูลเกี่ยวกับการพอร์ตไปยัง Python 3 เพิ่มเติมในแต่ละส่วนด้านล่าง
requirements.txt
ในส่วนนี้ เราจะเพิ่มแพ็กเกจเพื่อรองรับ Cloud Memorystore และ Cloud NDB สำหรับ Cloud Memorystore สำหรับ Redis ก็สามารถใช้ไคลเอ็นต์ Redis มาตรฐานสำหรับ Python (redis
) ได้ เนื่องจากไม่มีไลบรารีของไคลเอ็นต์ Cloud Memorystore ตามแต่ละกรณี เพิ่ม redis
และ google-cloud-ndb
ต่อท้าย requirements.txt
โดยเข้าร่วม flask
จากโมดูล 12:
flask
redis
google-cloud-ndb
ไฟล์ requirements.txt
นี้ไม่มีหมายเลขเวอร์ชันใดๆ ซึ่งหมายความว่าระบบจะเลือกเวอร์ชันล่าสุดไว้ หากเกิดความไม่สามารถทำงานร่วมกัน ให้ระบุหมายเลขเวอร์ชันเพื่อล็อกในเวอร์ชันที่ใช้งานได้
app.yaml
หัวข้อใหม่ที่จะเพิ่ม
รันไทม์ของ Python 2 App Engine ต้องใช้แพ็กเกจของบุคคลที่สามที่เฉพาะเจาะจงเมื่อใช้ Cloud API เช่น Cloud NDB ซึ่งก็คือ grpcio
และ setuptools
ผู้ใช้ Python 2 ต้องแสดงไลบรารีในตัวในลักษณะนี้พร้อมกับเวอร์ชันที่พร้อมใช้งานใน app.yaml
หากยังไม่มีส่วน libraries
ให้สร้างส่วนดังกล่าวและเพิ่มไลบรารีทั้ง 2 รายการดังตัวอย่างต่อไปนี้
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
ขณะย้ายข้อมูลแอปของคุณ แอปอาจมีส่วน libraries
อยู่แล้ว หากมี grpcio
และ setuptools
ขาดหายไป เพียงเพิ่มรายการเหล่านี้ลงในส่วน libraries
ที่มีอยู่
ถัดไป แอปตัวอย่างของเราต้องใช้ข้อมูลอินสแตนซ์ Cloud Memorystore และเครื่องมือเชื่อมต่อ VPC ดังนั้นให้เพิ่มส่วนใหม่ 2 ส่วนต่อไปนี้ไปยัง app.yaml
โดยไม่คำนึงถึงรันไทม์ของ Python ที่ใช้
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
เท่ากับว่าการอัปเดตที่จำเป็นต้องทำเท่านี้ app.yaml
ที่อัปเดตแล้วควรมีลักษณะดังนี้
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
ด้านล่างนี้คือข้อมูล "ก่อนและหลัง" แสดงการปรับปรุงที่คุณควรใช้กับ app.yaml
:
*ความแตกต่างของ Python 3
ส่วนนี้เป็นแบบไม่บังคับและเฉพาะในกรณีที่คุณพอร์ตไปยัง Python 3 เท่านั้น ซึ่งคุณจะต้องทำการเปลี่ยนแปลงกับการกำหนดค่า Python 2 ดังต่อไปนี้ ข้ามส่วนนี้หากคุณไม่อัปเกรดในขณะนี้
ไม่ได้ใช้ threadsafe
และ api_version
สำหรับรันไทม์ของ Python 3 ดังนั้นให้ลบการตั้งค่าทั้ง 2 รายการนี้ รันไทม์ล่าสุดของ App Engine ไม่รองรับไลบรารีของบุคคลที่สามแบบบิวท์อินหรือการคัดลอกไลบรารีที่ไม่มีในตัว ข้อกำหนดเพียงอย่างเดียวสำหรับแพ็กเกจของบุคคลที่สามคือการแสดงแพ็กเกจเหล่านั้นใน requirements.txt
ด้วยเหตุนี้คุณลบส่วน libraries
ทั้งหมดของ app.yaml
ได้
ขั้นตอนถัดไป รันไทม์ของ Python 3 ต้องใช้เว็บเฟรมเวิร์กที่กำหนดเส้นทางของตัวเอง ดังนั้นเราจึงแสดงให้นักพัฒนาแอปเห็นถึงวิธีย้ายข้อมูลจาก Webp2 ไปยัง Flask ในโมดูล 1 ด้วยเหตุนี้ ตัวแฮนเดิลสคริปต์ทั้งหมดจึงต้องเปลี่ยนเป็น auto
เนื่องจากแอปนี้ไม่แสดงไฟล์แบบคงที่ จึงเป็นแบบ "ไม่มีจุด" ให้แสดงเครื่องจัดการ (เนื่องจากเป็น auto
ทั้งหมด) คุณจึงนำส่วน handlers
ทั้งส่วนออกได้ ดังนั้น app.yaml
แบบย่อที่ปรับแต่งไว้สำหรับ Python 3 จึงควรถูกตัดให้สั้นลง ดังนี้
runtime: python39
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
สรุปความแตกต่างของ app.yaml
เมื่อพอร์ตไปยัง Python 3:
- ลบการตั้งค่า
threadsafe
และapi_version
- ลบส่วน
libraries
- ลบส่วน
handlers
(หรือเพียงscript
ตัวแฮนเดิลหากแอปส่งไฟล์แบบคงที่)
แทนที่ค่า
ค่าในส่วนใหม่สำหรับ Memorystore และเครื่องมือเชื่อมต่อ VPC เป็นเพียงตัวยึดตำแหน่ง แทนที่ค่าที่เป็นตัวพิมพ์ใหญ่ (YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME
) เหล่านั้นด้วยค่าที่บันทึกจากเมื่อสร้างทรัพยากรเหล่านั้นก่อนหน้านี้ สำหรับอินสแตนซ์ Memorystore โปรดใช้ HOST
(ไม่ใช่ RESERVED_IP
) และ PORT
ต่อไปนี้คือวิธีบรรทัดคำสั่งด่วนในการรับ HOST
และ PORT
โดยสมมติว่าชื่ออินสแตนซ์เป็น demo-ms
และ REGION
คือ us-central1
$ gcloud redis instances describe demo-ms --region us-central1 \ --format "value(host,port)" 10.251.161.51 6379
หากตัวอย่างที่อยู่ IP ของอินสแตนซ์ Redis คือ 10.10.10.10
โดยใช้พอร์ต 6379
ในโปรเจ็กต์ my-project
ซึ่งอยู่ในภูมิภาค us-central1
ที่มีชื่อเครื่องมือเชื่อมต่อ VPC เป็น demo-vpc
ส่วนเหล่านี้ใน app.yaml
จะมีลักษณะดังนี้
env_variables:
REDIS_HOST: '10.10.10.10'
REDIS_PORT: '6379'
vpc_access_connector:
name: projects/my-project/locations/us-central1/connectors/demo-vpc
สร้างหรืออัปเดต appengine_config.py
เพิ่มการรองรับไลบรารีของบุคคลที่สามในตัว
ให้เพิ่มการใช้งานไลบรารี grpcio
และ setuptools
เช่นเดียวกับที่เราทำกับ app.yaml
ก่อนหน้านี้ แก้ไข appengine_config.py
เพื่อรองรับไลบรารีของบุคคลที่สามในตัว หากคุ้นชิน นั่นเป็นเพราะต้องกลับไปดูโมดูล 2 ด้วยเมื่อย้ายข้อมูลจาก App Engine ndb
ไปยัง Cloud NDB การเปลี่ยนแปลงที่จำเป็นคือการเพิ่มโฟลเดอร์ lib
ลงในชุดการทำงาน setuptools.pkg_resources
ดังนี้
*ความแตกต่างของ Python 3
ส่วนนี้เป็นแบบไม่บังคับและเฉพาะในกรณีที่คุณพอร์ตไปยัง Python 3 เท่านั้น หนึ่งในการเปลี่ยนแปลงต้อนรับของ App Engine รุ่นที่ 2 คือไม่จำเป็นต้องคัดลอกแพ็กเกจของบุคคลที่สาม (บางครั้งเรียกว่า "ผู้ให้บริการ") และอ้างอิงแพ็กเกจของบุคคลที่สามที่มีมาในตัว app.yaml
อีกต่อไป ซึ่งหมายความว่าคุณสามารถลบไฟล์ appengine_config.py
ทั้งไฟล์ได้
6. อัปเดตไฟล์แอปพลิเคชัน
มีไฟล์แอปพลิเคชันเพียงไฟล์เดียว ซึ่งก็คือ main.py
ดังนั้นการเปลี่ยนแปลงทั้งหมดในส่วนนี้จึงมีผลกับไฟล์นั้นเท่านั้น เราได้จัดเตรียมภาพของการเปลี่ยนแปลงที่เราจะจะทำในการย้ายข้อมูลแอปพลิเคชันนี้ไปยัง Cloud Memorystore ไว้แล้ว ข้อมูลนี้มีไว้เพื่อการอธิบายเท่านั้น และไม่ได้มีไว้เพื่อให้คุณวิเคราะห์อย่างละเอียด งานทั้งหมดก็คือการเปลี่ยนแปลงโค้ดที่เราทำ
มาเริ่มกันทีละส่วนโดยเริ่มต้นจากด้านบน
อัปเดตการนำเข้า
ส่วนการนำเข้าใน main.py
สำหรับโมดูล 12 ใช้ Cloud NDB และ Cloud Tasks การนำเข้ามีดังนี้
ก่อนหน้า:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
การเปลี่ยนไปใช้ Memorystore ต้องใช้ตัวแปรสภาพแวดล้อมในการอ่าน ซึ่งหมายความว่าเราต้องใช้โมดูล os
ของ Python รวมถึง redis
ซึ่งเป็นไคลเอ็นต์ Python Redis เนื่องจาก Redis แคชออบเจ็กต์ Python ไม่ได้ ให้กำหนดรายการการเข้าชมล่าสุดโดยใช้ pickle
ดังนั้นโปรดนำเข้าด้วย ประโยชน์อย่างหนึ่งของ Memcache คือการจัดเรียงออบเจ็กต์แบบอนุกรมจะเกิดขึ้นโดยอัตโนมัติ ในขณะที่ Memorystore มีความ "DIY" มากกว่า สุดท้าย ให้อัปเกรดจาก App Engine ndb
เป็น Cloud NDB โดยแทนที่ google.appengine.ext.ndb
ด้วย google.cloud.ndb
หลังการเปลี่ยนแปลงเหล่านี้ การนำเข้าควรมีลักษณะดังนี้
หลัง:
import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis
อัปเดตการเริ่มต้น
การเริ่มต้นโมดูล 12 ประกอบด้วยการสร้างอินสแตนซ์ของออบเจ็กต์แอปพลิเคชัน Flask app
และการตั้งค่าคงที่สำหรับการแคชเป็นเวลา 1 ชั่วโมง
ก่อน
app = Flask(__name__)
HOUR = 3600
การใช้ Cloud API จำเป็นต้องมีไคลเอ็นต์ ดังนั้นให้สร้างอินสแตนซ์ไคลเอ็นต์ Cloud NDB หลังจาก Flask ทันที จากนั้นให้รับที่อยู่ IP และหมายเลขพอร์ตสำหรับอินสแตนซ์ Memorystore จากตัวแปรสภาพแวดล้อมที่คุณตั้งค่าไว้ใน app.yaml
เตรียมข้อมูลให้พร้อม แล้วเริ่มสร้างไคลเอ็นต์ Redis นี่คือลักษณะของโค้ดหลังจากการอัปเดต
หลัง:
app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
*การย้ายข้อมูล Python 3
ส่วนนี้ไม่บังคับและในกรณีที่คุณเริ่มต้นจากแอปโมดูล 12 เวอร์ชัน Python 3 หากใช่ จะมีการเปลี่ยนแปลงที่จำเป็นหลายรายการเกี่ยวกับการนำเข้าและการเริ่มต้น
ข้อแรก เนื่องจาก Memcache เป็นบริการพ่วงแอปของ App Engine การใช้งานในแอป Python 3 จึงต้องใช้ App Engine SDK โดยเฉพาะอย่างยิ่งการรวมแอปพลิเคชัน WSGI (รวมถึงการกำหนดค่าที่จำเป็นอื่นๆ) ดังนี้
ก่อนหน้า:
from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600
เนื่องจากเรากำลังย้ายข้อมูลไปยัง Cloud Memorystore (ไม่ใช่บริการที่รวมอยู่ในแพ็กเกจของ App Engine เช่น Memcache) จึงต้องนำการใช้ SDK ออก ซึ่งขั้นตอนนี้ทำได้ง่ายๆ เนื่องจากคุณจะลบทั้งบรรทัดที่นำเข้าทั้ง memcache
และ wrap_wsgi_app
เท่านั้น ลบสายที่โทรหา wrap_wsgi_app()
ด้วย การอัปเดตเหล่านี้ออกจากส่วนนี้ของแอป (ที่จริงแล้วคือทั้งแอป) เหมือนกับเวอร์ชัน Python 2
หลัง:
import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis
app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
สุดท้าย ให้นำการใช้ SDK ออกจาก app.yaml
(ลบบรรทัด: app_engine_apis: true
) และ requirements.txt
(ลบบรรทัด: appengine-python-standard
)
ย้ายข้อมูลไปยัง Cloud Memorystore (และ Cloud NDB)
โมเดลข้อมูลของ Cloud NDB มีวัตถุประสงค์เพื่อให้เข้ากันได้กับของ App Engine ndb
ซึ่งหมายความว่าคำจำกัดความของออบเจ็กต์ Visit
ยังคงเหมือนเดิม เมื่อเลียนแบบการย้ายข้อมูลโมดูล 2 ไปยัง Cloud NDB การเรียก Datastore ทั้งหมดใน store_visit()
และ fetch_visits()
จะได้รับการเสริมและฝังในบล็อก with
ใหม่ (เนื่องจากต้องมีการใช้เครื่องมือจัดการบริบท Cloud NDB) ต่อไปนี้คือการโทรก่อนการเปลี่ยนแปลง
ก่อนหน้า:
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
return Visit.query().order(-Visit.timestamp).fetch(limit)
เพิ่มบล็อก with ds_client.context()
ให้กับทั้ง 2 ฟังก์ชัน และใส่การเรียก Datastore ไว้ด้านใน (และเยื้อง) ในกรณีนี้ ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ กับการโทร ดังนี้
หลัง:
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
with ds_client.context():
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
with ds_client.context():
return Visit.query().order(-Visit.timestamp).fetch(limit)
ต่อไป เราจะมาดูการเปลี่ยนแปลงการแคชกัน นี่คือฟังก์ชัน main()
จากโมดูล 12
ก่อนหน้า:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
visits = memcache.get('visits')
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0].visitor != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
memcache.set('visits', visits, HOUR) # set() not add()
return render_template('index.html', visits=visits)
Redis มี "get" และ "ตั้งค่า" เช่นเดียวกับ Memcache ที่เราทำคือสลับไลบรารีของไคลเอ็นต์ที่เกี่ยวข้อง ถูกต้องไหม เกือบถูกแล้ว ดังที่กล่าวไว้ก่อนหน้านี้ เราไม่สามารถแคชรายการ Python ที่มี Redis ได้ (เพราะต้องมีการเรียงลำดับก่อน จะมีบางอย่าง Memcache ดูแลโดยอัตโนมัติ) ดังนั้นในการเรียกใช้ set()
ให้ "pickle" การเข้าชมลงในสตริงที่มี pickle.dumps()
ในทำนองเดียวกัน เมื่อดึงข้อมูลการเข้าชมจากแคช คุณจะต้องยกเลิกการเลือกด้วย pickle.loads()
หลัง get()
ทันที นี่คือเครื่องจัดการหลักหลังจากทำการเปลี่ยนแปลงเหล่านั้น
หลัง:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
rsp = REDIS.get('visits')
visits = pickle.loads(rsp) if rsp else None
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0].visitor != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
REDIS.set('visits', pickle.dumps(visits), ex=HOUR)
return render_template('index.html', visits=visits)
การดําเนินการนี้จะสรุปการเปลี่ยนแปลงที่จําเป็นใน main.py
การแปลงการใช้ Memcache ตัวอย่างของแอปเป็น Cloud Memorystore แล้วเทมเพลต HTML และการพอร์ตไปยัง Python 3 ล่ะ
อัปเดตไฟล์เทมเพลต HTML และพอร์ตเป็น Python 3 ไหม
เซอร์ไพรส์! คุณไม่จำเป็นต้องดำเนินการใดๆ เนื่องจากแอปพลิเคชันได้รับการออกแบบมาให้ทำงานในทั้ง Python 2 และ 3 โดยไม่มีการเปลี่ยนแปลงโค้ดหรือไลบรารีความเข้ากันได้ คุณจะพบ main.py
เหมือนกันใน "FINISH" ของ mod13a
(2.x) และ mod13b
(3.x) โฟลเดอร์ เช่นเดียวกับ requirements.txt
นอกเหนือจากความแตกต่างของหมายเลขเวอร์ชัน (หากใช้) เนื่องจากอินเทอร์เฟซผู้ใช้ไม่มีการเปลี่ยนแปลง จึงไม่มีการอัปเดตใน templates/index.html
เช่นกัน
ทุกอย่างที่จำเป็นต่อการเรียกใช้แอปนี้ใน Python 3 App Engine ดำเนินการเสร็จสมบูรณ์แล้วก่อนหน้านี้ในการกำหนดค่า ระบบนำคำสั่งที่ไม่จำเป็นออกจาก app.yaml
แล้ว รวมถึงลบทั้ง appengine_config.py
และโฟลเดอร์ lib
เนื่องจากไม่มีการใช้งานใน Python 3
7. สรุป/ล้างข้อมูล
ส่วนนี้จะสรุป Codelab นี้โดยการทำให้แอปใช้งานได้ ซึ่งจะช่วยยืนยันว่าแอปทำงานได้ตามที่ต้องการและอยู่ในเอาต์พุตที่แสดงขึ้น หลังจากตรวจสอบแอปแล้ว ให้ล้างข้อมูลและพิจารณาขั้นตอนถัดไป
ติดตั้งใช้งานและยืนยันแอปพลิเคชัน
การตรวจสอบครั้งล่าสุดคือการทำให้แอปตัวอย่างใช้งานได้เสมอ นักพัฒนาซอฟต์แวร์ Python 2: ลบและติดตั้ง lib
อีกครั้งด้วยคำสั่งด้านล่าง (หากมีทั้ง Python 2 และ 3 ติดตั้งไว้ในระบบ คุณอาจต้องเรียกใช้ pip2
อย่างชัดแจ้งแทน)
rm -rf ./lib pip install -t lib -r requirements.txt
ตอนนี้ทั้งนักพัฒนาซอฟต์แวร์ Python 2 และ 3 ควรทำให้แอปของตนใช้งานได้ด้วยสิ่งต่อไปนี้
gcloud app deploy
เนื่องจากคุณเพียงเดินสายใหม่เบื้องหลังสำหรับบริการแคชที่แตกต่างออกไปโดยสิ้นเชิง ตัวแอปเองจึงควรทำงานเหมือนกับแอปโมดูล 12 ทุกประการ
ขั้นตอนนี้จะทำให้ Codelab เสร็จสมบูรณ์ ขอเชิญให้คุณเปรียบเทียบแอปตัวอย่างที่อัปเดตแล้วกับโฟลเดอร์โมดูล 13 ซึ่งก็คือ mod13a
(Python 2) หรือ mod13b
(Python 3)
ล้างข้อมูล
ทั่วไป
หากดำเนินการเสร็จแล้ว เราขอแนะนำให้คุณปิดใช้แอป App Engine เพื่อหลีกเลี่ยงการเรียกเก็บเงิน อย่างไรก็ตาม หากคุณต้องการทดสอบหรือทดลองเพิ่มเติม แพลตฟอร์ม App Engine จะมีโควต้าฟรี และตราบใดที่คุณใช้งานไม่เกินระดับการใช้งานดังกล่าว เราก็จะไม่เรียกเก็บเงิน ค่าดังกล่าวมีไว้สําหรับการประมวลผล แต่ก็อาจมีการเรียกเก็บเงินค่าบริการ App Engine ที่เกี่ยวข้องด้วย ดังนั้นโปรดดูข้อมูลเพิ่มเติมในหน้าราคา หากการย้ายข้อมูลนี้เกี่ยวข้องกับบริการระบบคลาวด์อื่นๆ ระบบจะเรียกเก็บเงินแยกต่างหาก ในทั้ง 2 กรณี หากมี โปรดดูส่วน "เฉพาะสำหรับ Codelab นี้" ด้านล่าง
เพื่อการเปิดเผยข้อมูลทั้งหมด การทำให้ใช้งานได้กับแพลตฟอร์มการประมวลผลแบบ Serverless ของ Google Cloud อย่าง App Engine จะมีค่าใช้จ่ายในการสร้างและพื้นที่เก็บข้อมูลเล็กน้อย Cloud Build มีโควต้าฟรีของตนเอง เช่นเดียวกับ Cloud Storage พื้นที่เก็บข้อมูลของรูปภาพจะใช้โควต้านั้นหมด อย่างไรก็ตาม คุณอาจอาศัยอยู่ในภูมิภาคที่ไม่มีรุ่นฟรีดังกล่าว โปรดระวังการใช้พื้นที่เก็บข้อมูลของคุณเพื่อลดค่าใช้จ่ายที่อาจเกิดขึ้น "โฟลเดอร์" เฉพาะของ Cloud Storage ที่คุณควรตรวจสอบมีดังนี้
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- ลิงก์พื้นที่เก็บข้อมูลด้านบนขึ้นอยู่กับ
PROJECT_ID
และ *LOC
*ของคุณ เช่น "us
" หากแอปของคุณโฮสต์ในสหรัฐอเมริกา
ในทางกลับกัน หากคุณไม่ต้องการดำเนินการกับแอปพลิเคชันนี้หรือ Codelab การย้ายข้อมูลอื่นๆ ที่เกี่ยวข้องต่อไป และต้องการลบทุกอย่างออกทั้งหมด ให้ปิดโปรเจ็กต์
เฉพาะสำหรับ Codelab นี้
บริการในรายการด้านล่างเป็นบริการเฉพาะสำหรับ Codelab นี้ โปรดดูข้อมูลเพิ่มเติมในเอกสารประกอบของผลิตภัณฑ์แต่ละรายการ
- Cloud Memorystore ต้องมีอินสแตนซ์และไม่มีรุ่นฟรี ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าใช้จ่ายในการใช้งานได้ที่หน้าราคา
- เครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Cloud Serverless ต้องใช้อินสแตนซ์และไม่มีรุ่นฟรี ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าใช้จ่ายการใช้งานได้ที่ส่วนในหน้าราคา Cloud VPC
- Cloud Datastore (Cloud Firestore ในโหมด Datastore) มีรุ่นฟรี ดูข้อมูลเพิ่มเติมได้ที่หน้าราคา
บทแนะนำนี้เกี่ยวข้องกับการใช้ผลิตภัณฑ์ Cloud 4 รายการดังนี้
- App Engine
- Cloud Datastore
- Cloud Memorystore
- Cloud VPC
ด้านล่างนี้คือคำแนะนำในการปล่อยทรัพยากรเหล่านี้ และเพื่อหลีกเลี่ยง/ลดการเรียกเก็บเงิน
ปิดอินสแตนซ์ Memorystore และเครื่องมือเชื่อมต่อ VPC
ผลิตภัณฑ์เหล่านี้เป็นผลิตภัณฑ์ที่ไม่มีรุ่นฟรี คุณจึงต้องเรียกเก็บเงินทันที หากไม่ปิดโปรเจ็กต์ Cloud (ดูส่วนถัดไป) คุณต้องลบทั้งอินสแตนซ์ Memorystore และเครื่องมือเชื่อมต่อ VPC เพื่อหยุดการเรียกเก็บเงิน นอกจากนี้ คุณยังปล่อยทรัพยากรจาก Cloud Console หรือบรรทัดคำสั่งได้ เช่นเดียวกับตอนที่สร้างทรัพยากรเหล่านี้
จาก Cloud Console
หากต้องการลบอินสแตนซ์ Memorystore ให้กลับไปที่แดชบอร์ด Memorystore แล้วคลิกรหัสอินสแตนซ์ ดังนี้
เมื่ออยู่ในหน้ารายละเอียดของอินสแตนซ์ดังกล่าวแล้ว ให้คลิก "ลบ" และยืนยัน:
หากต้องการลบเครื่องมือเชื่อมต่อ VPC ให้ไปที่แดชบอร์ดของเครื่องมือเชื่อมต่อ และเลือกช่องทำเครื่องหมายข้างเครื่องมือเชื่อมต่อที่คุณต้องการลบ แล้วคลิก "ลบ" และยืนยัน:
จากบรรทัดคำสั่ง
คำสั่ง gcloud
คู่ต่อไปนี้จะลบทั้งอินสแตนซ์ Memorystore และเครื่องมือเชื่อมต่อ VPC ตามลำดับ
gcloud redis instances delete INSTANCE --region REGION
gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION
หากยังไม่ได้ตั้งค่ารหัสโปรเจ็กต์ด้วย gcloud config set project
คุณอาจต้องระบุ --project PROJECT_ID
หากอินสแตนซ์ Memorystore มีชื่อว่า demo-ms
และเครื่องมือเชื่อมต่อ VPC ชื่อ demo-vpc
และทั้ง 2 อินสแตนซ์อยู่ในภูมิภาค us-central1
ให้ออกคำสั่งคู่ต่อไปนี้และยืนยัน
$ gcloud redis instances delete demo-ms --region us-central1 You are about to delete instance [demo-ms] in [us-central1]. Any associated data will be lost. Do you want to continue (Y/n)? Delete request issued for: [demo-ms] Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done. Deleted instance [demo-ms]. $ $ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1 You are about to delete connector [demo-vpc] in [us-central1]. Any associated data will be lost. Do you want to continue (Y/n)? Delete request issued for: [demo-vpc] Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done. Deleted connector [demo-vpc].
คำขอแต่ละรายการจะใช้เวลาในการเรียกใช้ 2-3 นาที ขั้นตอนเหล่านี้เป็นขั้นตอนที่ไม่บังคับหากคุณเลือกปิดโปรเจ็กต์ Cloud ทั้งหมดตามที่อธิบายไว้ก่อนหน้านี้ แต่จะยังคงมีค่าใช้จ่ายจนกว่ากระบวนการปิดตัวลงจะเสร็จสิ้น
ขั้นตอนถัดไป
นอกเหนือจากบทแนะนำนี้ โมดูลการย้ายข้อมูลอื่นๆ ที่มุ่งเน้นการย้ายจากบริการพร้อมแพ็กเกจแบบเดิมที่จะพิจารณามีดังนี้
- โมดูล 2: ย้ายข้อมูลจาก App Engine
ndb
ไปยัง Cloud NDB - โมดูล 7-9: ย้ายข้อมูลจากงานพุชคิวงานของ App Engine ไปยัง Cloud Tasks
- โมดูล 12-13: ย้ายข้อมูลจาก App Engine Memcache ไปยัง Cloud Memorystore
- โมดูล 15-16: ย้ายข้อมูลจาก App Engine Blobstore ไปยัง Cloud Storage
- โมดูล 18-19: ย้ายข้อมูลจากคิวงานของ App Engine (พุลงาน) ไปยัง Cloud Pub/Sub
App Engine ไม่ใช่แพลตฟอร์มแบบ Serverless เพียงแพลตฟอร์มเดียวใน Google Cloud อีกต่อไป หากคุณมีแอป App Engine ขนาดเล็กหรือแอปที่มีฟังก์ชันการทำงานที่จำกัดและต้องการเปลี่ยนเป็น Microservice แบบสแตนด์อโลน หรือต้องการแตกแอปโมโนลิธให้เป็นคอมโพเนนต์ที่ใช้ซ้ำได้หลายรายการ เหตุผลที่ดีเหล่านี้ควรพิจารณาเปลี่ยนไปใช้ Cloud Functions หากการขนส่งด้วยคอนเทนเนอร์เป็นส่วนหนึ่งของเวิร์กโฟลว์การพัฒนาแอปพลิเคชัน โดยเฉพาะอย่างยิ่งหากประกอบด้วยไปป์ไลน์ CI/CD (การรวมอย่างต่อเนื่อง/การส่งมอบหรือการติดตั้งใช้งานอย่างต่อเนื่อง) ให้ลองย้ายข้อมูลไปยัง Cloud Run สถานการณ์เหล่านี้ครอบคลุมในโมดูลต่อไปนี้
- ย้ายข้อมูลจาก App Engine ไปยัง Cloud Functions: ดูโมดูล 11
- ย้ายข้อมูลจาก App Engine ไปยัง Cloud Run: ดูโมดูล 4 เพื่อสร้างคอนเทนเนอร์แอปด้วย Docker หรือโมดูล 5 เพื่อดำเนินการดังกล่าวโดยไม่ต้องมีคอนเทนเนอร์ ไม่มีความรู้เกี่ยวกับ Docker หรือ
Dockerfile
คุณจะเปลี่ยนไปใช้แพลตฟอร์มแบบ Serverless อื่นหรือไม่ก็ได้ และเราขอแนะนำให้พิจารณาตัวเลือกที่ดีที่สุดสำหรับแอปและ Use Case ของคุณก่อนทำการเปลี่ยนแปลงใดๆ
ไม่ว่าคุณจะพิจารณาโมดูลการย้ายข้อมูลใดในครั้งถัดไป คุณสามารถเข้าถึงเนื้อหาของสถานีย้ายข้อมูลแบบ Serverless (โค้ดแล็บ วิดีโอ ซอร์สโค้ด [เมื่อพร้อมให้บริการ]) ทั้งหมดได้ที่ที่เก็บโอเพนซอร์ส README
ของที่เก็บยังให้คำแนะนำเกี่ยวกับการย้ายข้อมูลที่ควรพิจารณาและ "คำสั่ง" ที่เกี่ยวข้อง โมดูลการย้ายข้อมูล
8. แหล่งข้อมูลเพิ่มเติม
รายการด้านล่างนี้เป็นแหล่งข้อมูลเพิ่มเติมสำหรับนักพัฒนาซอฟต์แวร์ที่ศึกษาเพิ่มเติมเกี่ยวกับโมดูลการย้ายข้อมูลนี้หรือที่เกี่ยวข้อง รวมถึงผลิตภัณฑ์ที่เกี่ยวข้อง ซึ่งรวมถึงพื้นที่สำหรับแสดงความคิดเห็นเกี่ยวกับเนื้อหานี้ ลิงก์ไปยังโค้ด และเอกสารประกอบต่างๆ ที่อาจเป็นประโยชน์กับคุณ
ปัญหา/ความคิดเห็นของ Codelab
หากมีปัญหาใดๆ เกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนยื่น ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่
ทรัพยากรการย้ายข้อมูล
ดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูล 12 (START) และโมดูล 13 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล Codelab ทั้งหมดของ App Engine ซึ่งจะโคลนหรือดาวน์โหลดไฟล์ ZIP ได้
Codelab | Python 2 | Python 3 |
โมดูล 13 (Codelab นี้) |
ข้อมูลอ้างอิงออนไลน์
ด้านล่างนี้คือแหล่งข้อมูลออนไลน์ที่อาจเกี่ยวข้องกับบทแนะนำนี้
App Engine
- เอกสารประกอบของ App Engine
- รันไทม์ของ Python 2 App Engine (สภาพแวดล้อมมาตรฐาน)
- การใช้ไลบรารีในตัวของ App Engine บน Python 2 App Engine
- รันไทม์ของ Python 3 App Engine (สภาพแวดล้อมมาตรฐาน)
- ความแตกต่างระหว่าง Python 2 กับ รันไทม์ของ App Engine (สภาพแวดล้อมมาตรฐาน) 3 รายการ
- คำแนะนำในการย้ายข้อมูล Python 2 ถึง 3 App Engine (สภาพแวดล้อมมาตรฐาน)
- ข้อมูลราคาและโควต้าของ App Engine
App Engine NDB และ Cloud NDB
- ภาพรวม App Engine NDB
- การใช้งานพื้นที่เก็บข้อมูล NDB ของ App Engine
- เอกสาร Google Cloud NDB
- ที่เก็บ NDB ของ Google Cloud
- ข้อมูลราคาของ Cloud Datastore
App Engine Memcache และ Cloud Memorystore
- ภาพรวม Memcache ของ App Engine
- ข้อมูลอ้างอิง
memcache
สำหรับ Python 2 App Engine - การอ้างอิง
memcache
ของ Python 3 App Engine - คำแนะนำในการย้ายข้อมูล App Engine
memcache
ไปยัง Cloud Memorystore - เอกสารประกอบเกี่ยวกับ Cloud Memorystore
- เอกสารประกอบเกี่ยวกับ Cloud Memorystore สำหรับ Redis
- ข้อมูลราคา Cloud Memorystore สำหรับ Redis
- เวอร์ชัน Redis ที่รองรับ Cloud Memorystore
- หน้าแรกของ Cloud Memorystore
- สร้างอินสแตนซ์ Memorystore ใหม่ใน Cloud Console
- หน้าแรกของไคลเอ็นต์ Python Redis
- เอกสารประกอบเกี่ยวกับไลบรารีของไคลเอ็นต์ Python Redis
Cloud VPC
- เอกสาร Google Cloud VPC
- หน้าแรกของ Google Cloud VPC
- ข้อมูลราคาของ Cloud VPC
- สร้างเครื่องมือเชื่อมต่อการเข้าถึง VPC แบบ Serverless ใหม่ใน Cloud Console
ข้อมูลอื่นๆ เกี่ยวกับระบบคลาวด์
- Python บน Google Cloud Platform
- ไลบรารีของไคลเอ็นต์ Google Cloud Python
- Google Cloud "ฟรีไม่จำกัดเวลา" ระดับ
- Google Cloud SDK (เครื่องมือบรรทัดคำสั่ง
gcloud
) - เอกสารประกอบทั้งหมดของ Google Cloud
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0