โมดูล 3: ย้ายข้อมูลจาก Google Cloud NDB ไปยัง Cloud Datastore

1. ภาพรวม

Codelab ชุดนี้ (บทแนะนำแบบลงมือทำด้วยตนเอง) มีเป้าหมายเพื่อช่วยนักพัฒนา Google App Engine (สภาพแวดล้อมมาตรฐาน) ปรับแอปให้ทันสมัยโดยแนะนำการย้ายข้อมูลชุดต่างๆ ขั้นตอนที่สำคัญที่สุดคือการเลิกใช้งานบริการแพ็กเกจรันไทม์ต้นฉบับ เนื่องจากรันไทม์รุ่นถัดไปมีความยืดหยุ่นมากกว่า ทำให้ผู้ใช้มีตัวเลือกบริการที่หลากหลายมากขึ้น การเปลี่ยนไปใช้รันไทม์รุ่นใหม่ช่วยให้คุณผสานรวมกับผลิตภัณฑ์ Google Cloud ได้ง่ายขึ้น ใช้บริการที่รองรับได้หลากหลายมากขึ้น และรองรับเวอร์ชันภาษาปัจจุบัน

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

คุณจะได้เรียนรู้วิธีการ

  • ใช้ Cloud NDB (หากไม่คุ้นเคยกับการใช้งาน)
  • ย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore
  • ย้ายข้อมูลแอปไปยัง Python 3 เพิ่มเติม

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

  • โปรเจ็กต์ Google Cloud Platform ที่มีบัญชีสำหรับการเรียกเก็บเงิน GCP ที่ใช้งานอยู่
  • ทักษะพื้นฐานเรื่อง Python
  • ความรู้เกี่ยวกับคำสั่งพื้นฐานของ Linux
  • ความรู้พื้นฐานเกี่ยวกับการพัฒนาและทำให้แอป App Engine ใช้งานได้
  • โมดูล 2 App Engine ที่ใช้งานได้ แอป 2.x หรือ 3.x

แบบสำรวจ

คุณจะใช้ Codelab นี้อย่างไร

โปรดอ่านเท่านั้น อ่านและทำแบบฝึกหัด

2. ข้อมูลเบื้องต้น

แม้ว่า Cloud NDB จะเป็นโซลูชัน Datastore ที่ยอดเยี่ยมสำหรับนักพัฒนาซอฟต์แวร์ App Engine มาอย่างยาวนานและช่วยเปลี่ยนไปใช้ Python 3 แต่ก็ไม่ใช่วิธีเดียวที่นักพัฒนา App Engine จะเข้าถึงพื้นที่เก็บข้อมูลได้ เมื่อ Datastore ของ App Engine เปลี่ยนเป็นผลิตภัณฑ์ของตัวเองในปี 2013 ทาง Google Cloud Datastore จะมีการสร้างไลบรารีของไคลเอ็นต์ใหม่ขึ้นเพื่อให้ผู้ใช้ทั้งหมดใช้ Datastore ได้

Python 3 App Engine และนักพัฒนาที่ไม่ใช่ App Engine ได้รับคำสั่งให้ใช้ Cloud Datastore (ไม่ใช่ Cloud NDB) เราขอแนะนำให้นักพัฒนา Python 2 App Engine ย้ายข้อมูลจาก ndb ไปยัง Cloud NDB และพอร์ตไปยัง Python 3 จากที่นั่น แต่ยังสามารถเลือกย้ายข้อมูลไปยัง Cloud Datastore เพิ่มเติมได้ด้วย นี่เป็นการตัดสินใจที่สมเหตุสมผล โดยเฉพาะอย่างยิ่งนักพัฒนาซอฟต์แวร์ที่มีโค้ดที่ใช้ Cloud Datastore อยู่แล้ว เช่น โค้ดที่เพิ่งกล่าวไป และต้องการสร้างไลบรารีที่ใช้ร่วมกันในแอปพลิเคชันทั้งหมดของตน การใช้โค้ดซ้ำเป็นแนวทางปฏิบัติแนะนำเช่นเดียวกับความสอดคล้องของโค้ด ทั้งยังช่วยลดค่าใช้จ่ายในการบำรุงรักษาโดยรวม ดังที่สรุปไว้ที่นี่

การย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore

  • อนุญาตให้นักพัฒนาซอฟต์แวร์มุ่งเน้นที่โค้ดเบสเดียวสำหรับการเข้าถึง Datastore
  • หลีกเลี่ยงการดูแลรักษาโค้ดบางอย่างโดยใช้ Cloud NDB และโค้ดอื่นๆ โดยใช้ Cloud Datastore
  • ให้ความสอดคล้องกันมากขึ้นใน Codebase และนำโค้ดมาใช้ซ้ำได้ดีขึ้น
  • เปิดใช้ไลบรารีที่ใช้ร่วมกัน/ใช้ไลบรารีที่ใช้ร่วมกันซึ่งช่วยลดค่าใช้จ่ายในการบำรุงรักษาโดยรวม

การย้ายข้อมูลนี้มีขั้นตอนหลักดังต่อไปนี้

  1. การตั้งค่า/งานล่วงหน้า
  2. แทนที่ Cloud NDB ด้วยไลบรารีของไคลเอ็นต์ Cloud Datastore
  3. อัปเดตแอปพลิเคชัน

3. การตั้งค่า/งานล่วงหน้า

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

1. สร้างโปรเจ็กต์

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

2. รับแอปตัวอย่างพื้นฐาน

ข้อกำหนดเบื้องต้นอย่างหนึ่งคือต้องมีแอปตัวอย่างโมดูล 2 ที่ใช้งานได้ ให้ใช้วิธีแก้ปัญหาหากคุณศึกษาบทแนะนำนั้นจบแล้ว คุณสามารถดำเนินการได้เลย (ลิงก์ด้านบน) หรือหากคุณต้องการข้ามไปก่อน ให้คัดลอกที่เก็บโมดูล 2 (ลิงก์ด้านล่าง)

ไม่ว่าคุณจะใช้ของคุณเองหรือของเรา โค้ดโมดูล 2 คือส่วนที่เราจะเริ่มดำเนินการ Codelab ของโมดูล 3 นี้จะแนะนำคุณเกี่ยวกับแต่ละขั้นตอน และเมื่อดำเนินการเสร็จแล้ว โค้ดจะมีลักษณะคล้ายกับโค้ดที่จุด FINISH บทแนะนำนี้มีเวอร์ชัน Python 2 และ 3 ให้เก็บโค้ดที่ถูกต้องด้านล่าง

งูหลาม 2

ไดเรกทอรีของไฟล์เริ่มต้น Python 2 โมดูล 2 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

หากดูบทแนะนำเกี่ยวกับโมดูล 2 จบแล้ว คุณจะมีโฟลเดอร์ lib ที่มี Flask และทรัพยากร Dependency ด้วย หากไม่มีโฟลเดอร์ lib ให้สร้างโฟลเดอร์ด้วยคำสั่ง pip install -t lib -r requirements.txt เพื่อให้เราทำให้แอปพื้นฐานนี้ใช้งานได้ในขั้นตอนถัดไป หากคุณมีทั้ง Python 2 และ 3 ติดตั้งไว้อยู่แล้ว เราขอแนะนําให้ใช้ pip2 แทน pip เพื่อไม่ให้สับสนกับ Python 3

งูหลาม 3

ไดเรกทอรีของไฟล์เริ่มต้น Python 3 โมดูล 2 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

ไม่ได้ใช้ lib และ appengine_config.py สำหรับ Python 3

3. ทำให้แอปโมดูล 2 ใช้งานได้ (ใหม่)

ขั้นตอนก่อนการทำงานที่เหลือของคุณที่ต้องดำเนินการตอนนี้มีดังนี้

  1. ทำความคุ้นเคยกับเครื่องมือบรรทัดคำสั่ง gcloud (หากจำเป็น)
  2. (อีกครั้ง) ทำให้โค้ดโมดูล 1 ใช้งานได้ใน App Engine (หากไม่ได้)

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

4. แทนที่ Cloud NDB ด้วยไลบรารีของไคลเอ็นต์ Cloud Datastore

การเปลี่ยนแปลงการกำหนดค่าเพียงอย่างเดียวคือการสลับแพ็กเกจเล็กน้อยในไฟล์ requirements.txt

1. อัปเดต requirements.txt

เมื่อจบโมดูล 2 ไฟล์ requirements.txt ของคุณจะมีลักษณะดังนี้

  • ก่อนแก้ไข (Python 2 และ 3):
Flask==1.1.2
google-cloud-ndb==1.7.1

อัปเดต requirements.txt โดยแทนที่ไลบรารี Cloud NDB (google-cloud-ndb) ด้วยไลบรารี Cloud Datastore เวอร์ชันล่าสุด (google-cloud-datastore) ทำให้รายการของ Flask ไม่เปลี่ยนแปลง ทั้งนี้โปรดทราบว่าเวอร์ชันล่าสุดของ Cloud Datastore ที่ใช้กับ Python 2 ได้คือ 1.15.3

  • หลัง (Python 2):
Flask==1.1.2
google-cloud-datastore==1.15.3
  • หลัง (Python 3):
Flask==1.1.2
google-cloud-datastore==2.1.0

โปรดทราบว่าที่เก็บจะได้รับการจัดการให้เป็นประจำกว่าบทแนะนำนี้ ดังนั้นไฟล์ requirements.txt จึงอาจใช้เวอร์ชันที่ใหม่กว่า เราขอแนะนำให้ใช้เวอร์ชันล่าสุดของแต่ละไลบรารี แต่หากใช้งานไม่ได้ คุณสามารถย้อนกลับไปใช้เวอร์ชันเก่าได้ หมายเลขเวอร์ชันข้างต้นเป็นเวอร์ชันล่าสุดเมื่อมีการอัปเดต Codelab ครั้งล่าสุด

2. ไฟล์การกำหนดค่าอื่นๆ

ไฟล์การกำหนดค่าอื่นๆ app.yaml และ appengine_config.py ไม่ควรเปลี่ยนแปลงจากขั้นตอนการย้ายข้อมูลก่อนหน้านี้:

  • app.yaml ควร (ยัง) อ้างอิงแพ็กเกจของบุคคลที่สาม grpcio และ setuptools
  • appengine_config.py ควร (ยัง) ชี้ pkg_resources และ google.appengine.ext.vendor ไปยังทรัพยากรของบุคคลที่สามใน lib

ตอนนี้เรามาดูที่ไฟล์ของแอปพลิเคชัน

5. อัปเดตไฟล์แอปพลิเคชัน

ไม่มีการเปลี่ยนแปลงกับ template/index.html แต่มีอัปเดตบางอย่างสำหรับ main.py

1. การนำเข้า

โค้ดเริ่มต้นสำหรับส่วนการนำเข้าควรมีลักษณะดังนี้

  • ก่อน:
from flask import Flask, render_template, request
from google.cloud import ndb

แทนที่การนำเข้า google.cloud.ndb ด้วย 1 รายการสำหรับ Cloud Datastore: google.cloud.datastore เนื่องจากไลบรารีของไคลเอ็นต์ Datastore ไม่รองรับการสร้างช่องการประทับเวลาในเอนทิตีโดยอัตโนมัติ คุณจึงควรนำเข้าโมดูลไลบรารีมาตรฐาน datetime เพื่อสร้างโมดูลด้วยตัวเอง ตามหลักแล้ว การนำเข้าไลบรารีมาตรฐานจะสูงกว่าการนำเข้าแพ็กเกจของบุคคลที่สาม เมื่อทำการเปลี่ยนแปลงเหล่านี้เสร็จแล้ว ควรมีลักษณะดังนี้

  • หลัง:
from datetime import datetime
from flask import Flask, render_template, request
from google.cloud import datastore

2. การเริ่มต้นและโมเดลข้อมูล

หลังจากเริ่มต้นใช้งาน Flask แอปโมดูล 2 ตัวอย่างที่สร้างคลาสโมเดลข้อมูล NDB และฟิลด์ก็จะเชื่อมต่อดังนี้

  • ก่อน:
app = Flask(__name__)
ds_client = ndb.Client()

class Visit(ndb.Model):
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

ไลบรารี Cloud Datastore ไม่มีคลาสดังกล่าว ดังนั้นโปรดลบการประกาศคลาส Visit คุณยังคงต้องมีไคลเอ็นต์ในการพูดคุยกับ Datastore โปรดเปลี่ยน ndb.Client() เป็น datastore.Client() ไลบรารีของ Datastore มีความ "ยืดหยุ่น" มากกว่า ซึ่งช่วยให้คุณสร้างเอนทิตีได้โดยไม่ต้อง "ประกาศล่วงหน้า" อย่าง NDB หลังการอัปเดตนี้ main.py ส่วนนี้ควรมีลักษณะดังนี้

  • หลัง:
app = Flask(__name__)
ds_client = datastore.Client()

3. สิทธิ์เข้าถึงพื้นที่เก็บข้อมูล

การย้ายข้อมูลไปยัง Cloud Datastore จำเป็นต้องเปลี่ยนวิธีสร้าง จัดเก็บ และค้นหารายการ Datastore (ในระดับผู้ใช้) สำหรับแอปพลิเคชันของคุณ ความยากในการย้ายข้อมูลนี้จะขึ้นอยู่กับความซับซ้อนของโค้ด Datastore ของคุณ ในแอปตัวอย่างของเรา เราพยายามทำให้การอัปเดตตรงไปตรงมาที่สุดเท่าที่จะทำได้ นี่คือโค้ดเริ่มต้นของเรา:

  • ก่อน:
def store_visit(remote_addr, user_agent):
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    with ds_client.context():
        return (v.to_dict() for v in Visit.query().order(
                -Visit.timestamp).fetch_page(limit)[0])

เมื่อใช้ Cloud Datastore ให้สร้างเอนทิตีทั่วไป โดยระบุออบเจ็กต์ที่จัดกลุ่มในเอนทิตีของคุณด้วย "คีย์" สร้างบันทึกข้อมูลด้วยออบเจ็กต์ JSON (Python dict) ของคู่คีย์-ค่า จากนั้นเขียนลงใน Datastore ด้วย put() ที่คาดไว้ การค้นหานั้นคล้ายคลึงกันแต่ตรงไปตรงมามากกว่าเมื่อใช้ Datastore ที่นี่คุณสามารถดูความแตกต่างระหว่างรหัส Datastore ที่เทียบเท่ากัน:

  • หลัง:
def store_visit(remote_addr, user_agent):
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

def fetch_visits(limit):
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    return query.fetch(limit=limit)

อัปเดตส่วนเนื้อหาของฟังก์ชันสำหรับ store_visit() และ fetch_visits() ตามด้านบน โดยคงลายเซ็นไว้เหมือนกับเวอร์ชันก่อนหน้า ไม่มีการเปลี่ยนแปลงใดๆ กับตัวแฮนเดิลหลัก root() หลังจากทำการเปลี่ยนแปลงเหล่านี้เสร็จแล้ว แอปของคุณก็พร้อมใช้ Cloud Datastore และพร้อมทดสอบแล้ว

6. สรุป/ล้างข้อมูล

ทำให้แอปพลิเคชันใช้งานได้

ทำให้แอปใช้งานได้อีกครั้งกับ gcloud app deploy และยืนยันว่าแอปใช้งานได้ ตอนนี้โค้ดของคุณควรตรงกับสิ่งที่อยู่ในโฟลเดอร์ที่เก็บโมดูล 3

หากคุณเข้าสู่ชุดการเรียนรู้นี้โดยไม่ได้ทำ Codelab ก่อนหน้านี้ ตัวแอปเองจะไม่มีการเปลี่ยนแปลง หน้าแรกจะบันทึกการเข้าชมหน้าเว็บหลัก (/) ทั้งหมด และมีลักษณะเช่นนี้เมื่อคุณเข้าชมเว็บไซต์ไปหลายครั้งพอแล้ว:

แอปvisitme

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

ไม่บังคับ: ล้างข้อมูล

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

ไม่บังคับ: ปิดใช้แอป

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

ในทางกลับกัน หากไม่ต้องการย้ายข้อมูลต่อและต้องการลบทุกอย่างออกทั้งหมด คุณปิดโปรเจ็กต์ได้

ขั้นตอนถัดไป

จากตรงนี้ คุณสามารถสำรวจโมดูลการย้ายข้อมูลถัดไปเหล่านี้ได้

  • โบนัสโมดูล 3: ไปที่ส่วนโบนัสเพื่อดูวิธีพอร์ตไปยัง Python 3 และรันไทม์ของ App Engine รุ่นใหม่
  • โมดูล 7: คิวงานพุชของ App Engine (จำเป็นหากคุณใช้คิวงาน [push])
    • เพิ่มงานพุช taskqueue งานของ App Engine ลงในแอปโมดูล 1
    • เตรียมความพร้อมให้กับผู้ใช้สำหรับการย้ายข้อมูลไปยัง Cloud Tasks ในโมดูล 8
  • โมดูล 4: ย้ายข้อมูลไปยัง Cloud Run ด้วย Docker
    • สร้างคอนเทนเนอร์เพื่อให้แอปทำงานบน Cloud Run ด้วย Docker
    • อนุญาตให้คุณใช้ Python 2 ต่อไป
  • โมดูล 5: ย้ายข้อมูลไปยัง Cloud Run ด้วย Cloud Buildpack
    • สร้างคอนเทนเนอร์เพื่อให้แอปทำงานบน Cloud Run ด้วย Cloud Buildpack
    • คุณไม่จําเป็นต้องทราบข้อมูลใดๆ เกี่ยวกับ Docker, คอนเทนเนอร์ หรือ Dockerfile
    • คุณต้องย้ายข้อมูลแอปไปยัง Python 3 แล้ว
  • โมดูล 6: ย้ายข้อมูลไปยัง Cloud Firestore
    • ย้ายข้อมูลไปยัง Cloud Firestore เพื่อเข้าถึงฟีเจอร์ของ Firebase
    • แม้ว่า Cloud Firestore จะรองรับ Python 2 แต่ Codelab นี้มีให้บริการใน Python 3 เท่านั้น

7. โบนัส: ย้ายข้อมูลไปยัง Python 3

หากต้องการเข้าถึงรันไทม์และฟีเจอร์ล่าสุดของ App Engine เราขอแนะนำให้ย้ายข้อมูลไปยัง Python 3 ในแอปตัวอย่างของเรา Datastore เป็นบริการในตัวเพียงบริการเดียวที่เราใช้ และเนื่องจากเราได้ย้ายข้อมูลจาก ndb ไปยัง Cloud NDB ตอนนี้เราจึงสามารถพอร์ตไปยังรันไทม์ Python 3 ของ App Engine ได้แล้ว

ภาพรวม

แม้ว่าการพอร์ตไปยัง Python 3 จะไม่อยู่ในขอบเขตของบทแนะนำของ Google Cloud แต่ส่วนของ Codelab ในส่วนนี้จะช่วยให้นักพัฒนาซอฟต์แวร์เข้าใจความแตกต่างระหว่างรันไทม์ของ Python 3 App Engine ฟีเจอร์เด่นๆ ของรันไทม์รุ่นถัดไปคือการเข้าถึงแพ็กเกจของบุคคลที่สามที่ง่ายขึ้น กล่าวคือไม่จำเป็นต้องระบุแพ็กเกจในตัวใน app.yaml หรือไม่จำเป็นต้องคัดลอกหรืออัปโหลดไลบรารีที่ไม่มีในตัว แอปเหล่านี้ติดตั้งโดยปริยายจากการแสดงใน requirements.txt

เนื่องจากตัวอย่างของเราเป็นระบบพื้นฐานและ Cloud Datastore รองรับ Python 2-3 จึงไม่จำเป็นต้องย้ายโค้ดของแอปพลิเคชันไปที่ 3.x อย่างชัดเจน กล่าวคือแอปทำงานบน 2.x และ 3.x โดยไม่มีการแก้ไข ซึ่งหมายความว่าการเปลี่ยนแปลงที่จำเป็นมีเพียง 1 อย่างสำหรับการกำหนดค่าในกรณีนี้

  1. ลดความซับซ้อนของ app.yaml เพื่ออ้างอิง Python 3 และนำการอ้างอิงไปยังไลบรารีของบุคคลที่สามแบบกลุ่มออก
  2. ลบ appengine_config.py และโฟลเดอร์ lib เนื่องจากไม่จำเป็นต้องใช้แล้ว

ไฟล์แอปพลิเคชัน main.py และ templates/index.html ไม่มีการเปลี่ยนแปลง

อัปเดต requirements.txt

Cloud Datastore เวอร์ชันสุดท้ายที่รองรับ Python 2 คือ 1.15.3 อัปเดต requirements.txt โดยใช้เวอร์ชันล่าสุดสำหรับ Python 3 (ปัจจุบันอาจใหม่กว่า) ตอนที่เราเขียนบทแนะนำนี้ เวอร์ชันล่าสุดคือ 2.1.0 ดังนั้นให้แก้ไขบรรทัดนั้นให้มีลักษณะดังนี้ (หรือเวอร์ชันล่าสุดใดก็ตาม):

google-cloud-datastore==2.1.0

ทำให้ app.yaml ง่ายขึ้น

ก่อน:

การเปลี่ยนแปลงที่แท้จริงเพียงอย่างเดียวของแอปตัวอย่างนี้คือการทำให้ app.yaml สั้นลงอย่างมาก เราขอทบทวนข้อมูลที่ได้รับจาก app.yaml ในช่วงท้ายของโมดูล 3 ดังต่อไปนี้

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

หลัง:

ใน Python 3 จะเลิกใช้งานคำสั่ง threadsafe, api_version และ libraries ทั้งหมดแล้ว จะถือว่าแอปทั้งหมดเป็น Threadsafe และ api_version ไม่ได้ใช้ใน Python 3 ไม่มีแพ็กเกจของบุคคลที่สามในตัวที่ติดตั้งไว้ล่วงหน้าในบริการ App Engine แล้ว libraries จึงจะเลิกใช้งานด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงเหล่านี้ได้ในเอกสารประกอบเกี่ยวกับการเปลี่ยนแปลงของ app.yaml ด้วยเหตุนี้ คุณจึงควรลบทั้ง 3 รายการจาก app.yaml และอัปเดตเป็นเวอร์ชัน Python 3 ที่รองรับ (ดูด้านล่าง)

ไม่บังคับ: การใช้คำสั่ง handlers

นอกจากนี้ ได้มีการเลิกใช้งานคำสั่ง handlers ซึ่งกำหนดเส้นทางการรับส่งข้อมูลไปยังแอปพลิเคชัน App Engine แล้วด้วย เนื่องจากรันไทม์รุ่นถัดไปคาดหวังให้เว็บเฟรมเวิร์กสามารถจัดการการกำหนดเส้นทางแอปได้ ดังนั้น "สคริปต์สำหรับแฮนเดิล" ทั้งหมด ต้องเปลี่ยนเป็น "auto" เมื่อรวมการเปลี่ยนแปลงจากด้านบน คุณมาถึง app.yaml นี้:

runtime: python38

handlers:
- url: /.*
  script: auto

ดูข้อมูลเพิ่มเติมเกี่ยวกับ script: auto จากหน้าข้อมูลอ้างอิงของ app.yaml

กำลังนำคำสั่ง handlers ออก

เนื่องจาก handlers เลิกใช้งานแล้ว คุณสามารถนำทั้งหัวข้อออกได้ด้วย โดยเหลือบรรทัดเดียวคือ app.yaml:

runtime: python38

การดำเนินการนี้จะเปิดเว็บเซิร์ฟเวอร์ Gunicorn WSGI ซึ่งใช้ได้กับแอปพลิเคชันทั้งหมดโดยค่าเริ่มต้น หากคุณคุ้นเคยกับ gunicorn นี่คือคำสั่งที่ลงนามเมื่อเริ่มต้นใช้งานโดยค่าเริ่มต้นด้วย Barebones app.yaml:

gunicorn main:app --workers 2 -c /config/gunicorn.py

ไม่บังคับ: การใช้คำสั่ง entrypoint

อย่างไรก็ตาม หากแอปพลิเคชันต้องใช้คำสั่งเริ่มต้นที่เฉพาะเจาะจงซึ่งระบุด้วยคำสั่ง entrypoint ได้ ซึ่งจะทำให้ผลลัพธ์เป็น app.yaml ซึ่งมีลักษณะดังนี้

runtime: python38
entrypoint: python main.py

ตัวอย่างนี้ส่งคำขอให้ใช้เซิร์ฟเวอร์การพัฒนา Flask แทน gunicorn คุณต้องเพิ่มโค้ดที่เริ่มต้นเซิร์ฟเวอร์การพัฒนาในแอปเพื่อเปิดใช้อินเทอร์เฟซ 0.0.0.0 บนพอร์ต 8080 ด้วยการเพิ่มส่วนเล็กๆ นี้ที่ด้านล่างของ main.py

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

ดูข้อมูลเพิ่มเติมเกี่ยวกับ entrypoint จากหน้าข้อมูลอ้างอิงของ app.yaml ดูตัวอย่างและแนวทางปฏิบัติแนะนำเพิ่มเติมได้ในเอกสารการเริ่มต้นสภาพแวดล้อมมาตรฐานของ App Engine และเอกสารการเริ่มต้นสภาพแวดล้อมที่ยืดหยุ่นของ App Engine

ลบ appengine_config.py และ lib

ลบไฟล์ appengine_config.py และโฟลเดอร์ lib ในการย้ายข้อมูลไปยัง Python 3 App Engine จะซื้อและติดตั้งแพ็กเกจที่ระบุไว้ใน requirements.txt

ไฟล์การกำหนดค่า appengine_config.py ใช้เพื่อจดจำไลบรารี/แพ็กเกจของบุคคลที่สาม ไม่ว่าคุณจะคัดลอกด้วยตนเองหรือใช้ไฟล์ที่มีอยู่ในเซิร์ฟเวอร์ App Engine (ในตัว) ก็ตาม เมื่อเปลี่ยนไปใช้ Python 3 สรุปการเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. ไม่มีการรวมกลุ่มไลบรารีของบุคคลที่สามที่คัดลอกไว้ (แสดงใน requirements.txt)
  2. ไม่มี pip install ในโฟลเดอร์ lib ซึ่งหมายความว่าไม่มีเครื่องหมายจุด lib ของโฟลเดอร์
  3. ไม่มีข้อมูลไลบรารีของบุคคลที่สามในตัวใน app.yaml
  4. ไม่จำเป็นต้องอ้างอิงแอปไปยังไลบรารีของบุคคลที่สาม ดังนั้นจึงไม่มีไฟล์ appengine_config.py

จำเป็นต้องมีการแสดงไลบรารีของบุคคลที่สามทั้งหมดที่จำเป็นใน requirements.txt

ทำให้แอปพลิเคชันใช้งานได้

ทำให้แอปใช้งานได้อีกครั้งเพื่อให้แน่ใจว่าใช้งานได้ นอกจากนี้ คุณยังตรวจสอบได้ว่าโซลูชันของคุณใกล้เคียงกับโค้ด Python 3 ตัวอย่างโมดูล 3 มากน้อยแค่ไหน หากต้องการแสดงภาพความแตกต่างด้วย Python 2 ให้เปรียบเทียบโค้ดกับเวอร์ชัน Python 2

ขอแสดงความยินดีที่ผ่านขั้นตอนโบนัสในโมดูล 3 ไปที่เอกสารประกอบเกี่ยวกับการเตรียมไฟล์การกำหนดค่าสำหรับรันไทม์ของ Python 3 สุดท้าย ให้อ่านสรุปก่อนหน้านี้ข้างต้นเพื่อดูขั้นตอนถัดไปและการทำความสะอาด

กำลังเตรียมแอปพลิเคชันของคุณ

เมื่อถึงเวลาย้ายข้อมูลแอปพลิเคชันของคุณ คุณจะต้องย้าย main.py และไฟล์แอปพลิเคชันอื่นๆ เป็น 3.x ดังนั้นแนวทางปฏิบัติที่ดีที่สุดคือพยายามทำให้แอปพลิเคชัน 2.x ของคุณ "ใช้ร่วมกันได้" อย่างเต็มที่ ให้มากที่สุด

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

  1. ตรวจสอบว่าการพึ่งพาแอปพลิเคชันทั้งหมดเข้ากันได้กับ 3.x อย่างสมบูรณ์
  2. ตรวจสอบว่าแอปพลิเคชันของคุณทำงานบนเวอร์ชัน 2.6 เป็นอย่างน้อย (ควรเป็น 2.7)
  3. ตรวจสอบว่าแอปพลิเคชันผ่านชุดทดสอบทั้งชุด (และครอบคลุมอย่างน้อย 80%)
  4. ใช้ไลบรารีความเข้ากันได้ เช่น six, Future และ/หรือ Modernize
  5. เรียนรู้เกี่ยวกับความแตกต่าง 2.x หรือ 3.x ที่ใช้ร่วมกันไม่ได้กับคีย์ย้อนหลัง
  6. ทุก I/O มักจะนำไปสู่ความไม่เข้ากันระหว่าง Unicode กับไบต์ของสตริง

แอปตัวอย่างได้รับการออกแบบมาโดยคำนึงถึงประเด็นนี้เป็นหลัก จึงเป็นเหตุผลว่าทำไมแอปจึงทำงานในเวอร์ชัน 2.x และ 3.x ตั้งแต่แรก เพื่อที่เราจะได้โฟกัสที่การแสดงให้คุณเห็นว่าต้องเปลี่ยนแปลงอะไรบ้างจึงจะใช้แพลตฟอร์มรุ่นถัดไปได้

8. แหล่งข้อมูลเพิ่มเติม

ปัญหา/ข้อเสนอแนะเกี่ยวกับ Codelab ของโมดูลการย้ายข้อมูล App Engine

หากมีปัญหาใดๆ เกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนยื่น ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่

ทรัพยากรการย้ายข้อมูล

คุณสามารถดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูล 2 (START) และโมดูล 3 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ยังเข้าถึงได้จากที่เก็บข้อมูลสำหรับการย้ายข้อมูล App Engine ทั้งหมด ซึ่งคุณจะโคลนหรือดาวน์โหลดไฟล์ ZIP ได้

Codelab

Python 2

Python 3

โมดูล 2

รหัส

รหัส

โมดูล 3

รหัส

รหัส

ทรัพยากร App Engine

ด้านล่างนี้คือแหล่งข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลครั้งนี้