โมดูล 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 ใช้งานได้
  • แอป App Engine 2.x หรือ 3.x โมดูล 2 ที่ใช้งานได้

แบบสำรวจ

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

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ

2. ฉากหลัง

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

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

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

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

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

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

3. การตั้งค่า/การเตรียมการ

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

1. ตั้งค่าโปรเจ็กต์

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

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

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

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

Python 2

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

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

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

Python 3

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

$ 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

  • AFTER (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 import ด้วย import สำหรับ 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. การเข้าถึง Datastore

การย้ายข้อมูลไปยัง 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 ถัดไป คุณก็เปิดใช้ฟีเจอร์นี้อีกครั้งได้ ขณะที่แอปถูกปิดใช้ แอปจะไม่ได้รับการเข้าชมใดๆ ที่จะทำให้เกิดค่าใช้จ่าย แต่สิ่งอื่นที่คุณอาจถูกเรียกเก็บเงินคือการใช้งาน Datastore หากเกินโควต้าฟรี ดังนั้นให้ลบข้อมูลให้เพียงพอเพื่อให้อยู่ในขีดจำกัดนั้น

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

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

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

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

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

เราขอแนะนำให้คุณย้ายข้อมูลไปยัง Python 3 เพื่อเข้าถึงรันไทม์และฟีเจอร์ล่าสุดของ App Engine ในแอปตัวอย่างของเรา 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. ลดความซับซ้อนของ 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 Web Server ซึ่งพร้อมใช้งานสำหรับแอปพลิเคชันทั้งหมด หากคุณคุ้นเคยกับ gunicorn นี่คือคำสั่งที่จะดำเนินการเมื่อเริ่มต้นโดยค่าเริ่มต้นด้วย 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

Module 2

รหัส

รหัส

โมดูล 3

รหัส

รหัส

ทรัพยากร App Engine

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