Python 2 App Engine Cloud NDB'yi taşıyın ve Cloud Tasks uygulamasından Python 3 ve Cloud Datastore'a (Modül 9)

1. Genel Bakış

Serverless Migration Station serisi codelab'ler (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitimler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerin öncelikle eski hizmetlerden uzaklaşarak bir veya daha fazla taşıma işlemi yapmalarına rehberlik ederek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu sayede uygulamalarınız daha taşınabilir hale gelir, daha fazla seçenek ve esneklik elde edersiniz. Böylece daha geniş bir Cloud ürün yelpazesiyle entegrasyon yapabilir, bu ürünlere erişebilir ve yeni dil sürümlerine daha kolay yükseltebilirsiniz. Başlangıçta öncelikle App Engine (standart ortam) geliştiricileri olmak üzere en eski Cloud kullanıcılarına odaklanılsa da bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda başka platformları da kapsayacak kadar geniştir.

Bu codelab'in amacı, 8. modül örnek uygulamasını Python 3'e taşımak, Datastore (Datastore modunda Cloud Firestore) erişimini Cloud NDB'den yerel Cloud Datastore istemci kitaplığına geçirmek ve Cloud Tasks istemci kitaplığını en son sürüme yükseltmektir.

7. modülde push görevleri için görev sırası kullanımını ekledik, ardından 8. modülde bu kullanımı Cloud Tasks'a taşıdık. 9. modülde Python 3 ve Cloud Datastore'a geçiyoruz. Çekme görevleri için görev sıralarını kullananlar Cloud Pub/Sub'a geçecek ve bunun yerine 18-19. modüllere başvurmalıdır.

Bu demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • 8. Modül örnek uygulamasını Python 3'e taşıma
  • Datastore erişimini Cloud NDB'den Cloud Datastore istemci kitaplıklarına geçirme
  • En son Cloud Tasks istemci kitaplığı sürümüne yükseltme

İhtiyacınız olanlar

Anket

Bu eğitimi nasıl kullanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Yeni başlayan Orta düzey Uzman

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Arka plan

7. modülde, Python 2 Flask App Engine uygulamalarında App Engine görev sırası push görevlerinin nasıl kullanılacağı gösterilmektedir. 8. modülde bu uygulamayı görev sırasından Cloud Tasks'e taşıyacaksınız. 9. Modül'de bu yolculuğa devam edip uygulamayı Python 3'e taşıyacak ve Datastore erişimini Cloud NDB yerine yerel Cloud Datastore istemci kitaplığını kullanacak şekilde değiştireceksiniz.

Cloud NDB hem Python 2 hem de 3 için çalıştığından, uygulamalarını Python 2'den 3'e taşıyan App Engine kullanıcıları için yeterlidir. İstemci kitaplıklarının Cloud Datastore'a ek bir şekilde taşınması tamamen isteğe bağlıdır ve bu işlemi yapmayı düşünmek için yalnızca bir neden vardır: Cloud Datastore istemci kitaplığını kullanan App Engine dışı uygulamalarınız (ve/veya Python 3 App Engine uygulamalarınız) vardır ve kod tabanınızı yalnızca bir istemci kitaplığıyla Datastore'a erişecek şekilde birleştirmek istiyorsunuzdur. Cloud NDB, Python 3'e geçiş aracı olarak özellikle Python 2 App Engine geliştiricileri için oluşturulmuştur. Bu nedenle, Cloud Datastore istemci kitaplığını kullanan bir kodunuz yoksa bu geçişi dikkate almanız gerekmez.

Son olarak, Cloud Tasks istemci kitaplığının geliştirilmesi yalnızca Python 3'te devam ediyor. Bu nedenle, son Python 2 sürümlerinden birinden Python 3'ün güncel sürümüne "geçiş" yapıyoruz. Neyse ki Python 2'den Python 3'e geçişte uyumluluk sorunlarına yol açan değişiklikler yok. Bu nedenle, burada yapmanız gereken başka bir işlem yok.

Bu eğitimde aşağıdaki adımlar yer almaktadır:

  1. Kurulum/Ön Hazırlık
  2. Yapılandırmayı güncelleyin
  3. Uygulama kodunu değiştirme

3. Kurulum/Ön Hazırlık

Bu bölümde aşağıdakilerin nasıl yapılacağı açıklanmaktadır:

  1. Cloud projenizi ayarlama
  2. Temel örnek uygulamayı edinme
  3. Temel uygulamayı (yeniden) dağıtma ve doğrulama

Bu adımlar, çalışan bir kodla başlamanızı ve kodun Cloud hizmetlerine taşınmaya hazır olmasını sağlar.

1. Proje oluşturma

8. modülün codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanın. Alternatif olarak, yepyeni bir proje oluşturun veya mevcut başka bir projeyi yeniden kullanın. Projenin etkin bir faturalandırma hesabına ve etkin bir App Engine uygulamasına sahip olduğundan emin olun. Bu codelab sırasında ihtiyacınız olacağı için proje kimliğinizi bulun. PROJECT_ID değişkeniyle karşılaştığınızda proje kimliğinizi kullanın.

2. Temel örnek uygulamayı edinme

Ön koşullardan biri, çalışan bir 8. Modül App Engine uygulamasıdır: 8. Modül codelab'ini tamamlayın (önerilir) veya 8. Modül uygulamasını depodan kopyalayın. Sizinkini veya bizimkini kullanıyor olmanız fark etmez. 8. Modül koduna ("BAŞLANGIÇ") bakarak başlayacağız. Bu codelab, 9. modülün depo klasöründeki ("FINISH") koda benzeyen bir kodla sonuçlanan taşıma işleminde size yol gösterir.

Hangi 7. Modül uygulamasını kullanırsanız kullanın, klasör aşağıdaki gibi görünmelidir. Klasörde lib klasörü de olabilir:

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

3. Temel uygulamayı (yeniden) dağıtma ve doğrulama

8. Modül uygulamasını dağıtmak için aşağıdaki adımları uygulayın:

  1. Varsa lib klasörünü silin ve lib öğesini yeniden doldurmak için pip install -t lib -r requirements.txt komutunu çalıştırın. Geliştirme makinenizde hem Python 2 hem de 3 yüklüyse pip2 kullanmanız gerekebilir.
  2. gcloud komut satırı aracını yüklediğinizden ve başlattığınızdan emin olun ve kullanımını inceleyin.
  3. (İsteğe bağlı) Her gcloud komutunu verdiğinizde PROJECT_ID değerini girmek istemiyorsanız Cloud projenizi gcloud config set project PROJECT_ID ile ayarlayın.
  4. Örnek uygulamayı gcloud app deploy ile dağıtma
  5. Uygulamanın sorunsuz ve beklendiği gibi çalıştığını doğrulayın. 8. modülün codelab'ini tamamladıysanız uygulamada en son ziyaretlerle birlikte en çok ziyaret eden kullanıcılar gösterilir (aşağıda gösterilmiştir). En altta, silinecek eski görevler gösterilir.

4aa8a2cb5f527079.png

4. Yapılandırmayı güncelleyin

requirements.txt

Yeni requirements.txt, 8. Modül'dekiyle neredeyse aynıdır. Tek büyük değişiklik, google-cloud-ndb yerine google-cloud-datastore kullanılmasıdır. Bu değişikliği yaparak requirements.txt dosyanızın şu şekilde görünmesini sağlayın:

flask
google-cloud-datastore
google-cloud-tasks

Bu requirements.txt dosyasında sürüm numaraları yer almaz. Bu nedenle, en son sürümler seçilir. Uyumsuzluklar ortaya çıkarsa bir uygulamanın çalışan sürümlerini kilitlemek için sürüm numaralarını kullanmak standart bir uygulamadır.

app.yaml

İkinci nesil App Engine çalışma zamanı, 2.x'teki gibi yerleşik üçüncü taraf kitaplıkları ve yerleşik olmayan kitaplıkların kopyalanmasını desteklemez. Üçüncü taraf paketleri için tek şart, bunların requirements.txt içinde listelenmesidir. Bu nedenle, app.yaml'nin libraries bölümünün tamamı silinebilir.

Bir diğer güncelleme ise Python 3 çalışma zamanının, kendi yönlendirmesini yapan web çerçevelerinin kullanılmasını gerektirmesidir. Bu nedenle, tüm komut dosyası işleyicileri auto olarak değiştirilmelidir. Ancak tüm rotalar auto olarak değiştirilmesi gerektiğinden ve bu örnek uygulamadan sunulan statik dosya olmadığından herhangi bir işleyicinin olması gereksizdir. Bu nedenle, handlers bölümünün tamamını da kaldırın.

app.yaml içinde yapılması gereken tek şey, çalışma zamanını Python 3'ün desteklenen bir sürümüne (ör. 3.10) ayarlamaktır. Bu değişikliği yaparak yeni, kısaltılmış app.yaml şu tek satır olacak şekilde değiştirin:

runtime: python310

appengine_config.py ve lib dosyalarını silin.

Yeni nesil App Engine çalışma zamanları, üçüncü taraf paket kullanımını yeniliyor:

  • Yerleşik kitaplıklar, Google tarafından incelenen ve App Engine sunucularında kullanıma sunulan kitaplıklardır. Bunun nedeni, geliştiricilerin buluta dağıtmasına izin verilmeyen C/C++ kodu içermeleridir. Bu kitaplıklar artık 2. nesil çalışma zamanlarında kullanılamaz.
  • Yerleşik olmayan kitaplıkların (bazen "vendoring" veya "self-bundling" olarak da adlandırılır) kopyalanması artık 2. nesil çalışma zamanlarında gerekli değildir. Bunun yerine, derleme sistemi tarafından dağıtım sırasında sizin adınıza otomatik olarak yüklendikleri requirements.txt içinde listelenmelidirler.

Üçüncü taraf paket yönetimiyle ilgili bu değişiklikler sonucunda appengine_config.py dosyası ve lib klasörü gerekmediğinden bunları silin. 2. nesil çalışma zamanlarında App Engine, requirements.txt içinde listelenen üçüncü taraf paketlerini otomatik olarak yükler. Özetleme:

  1. Paketlenmiş veya kopyalanmış üçüncü taraf kitaplıkları yoksa bunları requirements.txt içinde listeleyin.
  2. pip install, lib klasörüne taşınmaz. Yani lib klasörü yoktur.
  3. app.yaml içinde listelenen yerleşik üçüncü taraf kitaplıkları yok (bu nedenle libraries bölümü yok); bunları requirements.txt içinde listeleyin.
  4. Uygulamanızda referans verilecek üçüncü taraf kitaplıkları yoksa appengine_config.py dosyası da yoktur.

requirements.txt içinde istenen tüm üçüncü taraf kitaplıklarını listelemek, geliştiricinin tek gereksinimidir.

5. Uygulama dosyalarını güncelleme

Yalnızca bir uygulama dosyası (main.py) olduğundan bu bölümdeki tüm değişiklikler yalnızca bu dosyayı etkiler. Aşağıda, mevcut kodun yeni uygulamaya yeniden düzenlenmesi için yapılması gereken genel değişikliklerle ilgili bir "farklar" görseli yer almaktadır. Bu görselin amacı, yeniden düzenleme işleminde neyin gerekli olduğuna dair resimli bir genel bakış sunmak olduğundan okuyucuların kodu satır satır okuması beklenmez (ancak isterseniz yeni sekmede açabilir veya indirip yakınlaştırabilirsiniz).

5d043768ba7be742.png

İçe aktarma işlemlerini ve başlatmayı güncelleme

Modül 8 için main.py'deki içe aktarma bölümünde Cloud NDB ve Cloud Tasks kullanılır. Bu bölüm aşağıdaki gibi görünmelidir:

ÖNCESİ:

from datetime import datetime
import json
import logging
import time
from flask import Flask, render_template, request
import google.auth
from google.cloud import ndb, tasks

app = Flask(__name__)
ds_client = ndb.Client()
ts_client = tasks.CloudTasksClient()

Python 3 gibi ikinci nesil çalışma zamanlarında günlük kaydı basitleştirilmiş ve geliştirilmiştir:

  • Kapsamlı bir günlük kaydı deneyimi için Cloud Logging'i kullanın.
  • Basit günlük kaydı için stdout (veya stderr) adresine print() üzerinden göndermeniz yeterlidir.
  • Python logging modülünü kullanmanıza gerek yok (bu nedenle kaldırın).

Bu nedenle, logging dosyasının içe aktarılmasını silin ve google.cloud.ndb ile google.cloud.datastore yer değiştirin. Benzer şekilde, ds_client öğesini NDB istemcisi yerine bir Datastore istemcisine işaret edecek şekilde değiştirin. Bu değişiklikler yapıldıktan sonra yeni uygulamanızın üst kısmı artık şu şekilde görünüyor:

SONRASI:

from datetime import datetime
import json
import time
from flask import Flask, render_template, request
import google.auth
from google.cloud import datastore, tasks

app = Flask(__name__)
ds_client = datastore.Client()
ts_client = tasks.CloudTasksClient()

Cloud Datastore'a geçiş

Artık NDB istemci kitaplığı kullanımını Datastore ile değiştirme zamanı. Hem App Engine NDB hem de Cloud NDB için bir veri modeli (sınıf) gerekir. Bu uygulama için veri modeli Visit'dır. store_visit() işlevi, diğer tüm taşıma modüllerinde aynı şekilde çalışır: Yeni bir Visit kaydı oluşturarak, ziyaret eden bir istemcinin IP adresini ve kullanıcı aracısını (tarayıcı türü) kaydederek bir ziyareti kaydeder.

ÖNCESİ:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

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()

Ancak Cloud Datastore bir veri modeli sınıfı kullanmadığından sınıfı silin. Ayrıca Cloud Datastore, kayıtlar oluşturulduğunda otomatik olarak zaman damgası oluşturmaz. Bu nedenle, zaman damgasını manuel olarak oluşturmanız gerekir. Bu işlem, datetime.now() çağrısıyla yapılır.

Veri sınıfı olmadan değiştirilen store_visit() şu şekilde görünmelidir:

SONRASI:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

Temel işlev fetch_visits()'dır. Bu işlev, en son Visit için orijinal sorguyu yürütmekle kalmaz, aynı zamanda gösterilen son Visit öğesinin zaman damgasını alır ve eski Visit öğelerini toplu olarak silmek için /trim'yi çağıran (dolayısıyla trim()) push görevini oluşturur. Cloud NDB ile kullanım örneği:

ÖNCESİ:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    with ds_client.context():
        data = Visit.query().order(-Visit.timestamp).fetch(limit)
    oldest = time.mktime(data[-1].timestamp.timetuple())
    oldest_str = time.ctime(oldest)
    logging.info('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return (v.to_dict() for v in data), oldest_str

Başlıca değişiklikler:

  1. Cloud NDB sorgusunu Cloud Datastore eşdeğeriyle değiştirin. Sorgu stilleri biraz farklıdır.
  2. Datastore, Cloud NDB'nin aksine bağlam yöneticisi kullanılmasını gerektirmez ve verilerinin (to_dict() ile) çıkarılmasını zorunlu kılmaz.
  3. Günlüğe kaydetme çağrılarını print() ile değiştirme

Bu değişikliklerden sonra fetch_visits() şu şekilde görünür:

SONRASI:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Normalde bu yeterli olur. Maalesef büyük bir sorun var.

(İsteğe bağlı) Yeni bir (push) sırası oluşturun.

7. modülde, mevcut 1. modül uygulamasına App Engine taskqueue kullanımını ekledik. Push görevlerini eski bir App Engine özelliği olarak kullanmanın temel avantajlarından biri, "varsayılan" bir kuyruğun otomatik olarak oluşturulmasıdır. Bu uygulama 8. modülde Cloud Tasks'e taşındığında varsayılan kuyruk zaten vardı. Bu nedenle o zaman da bu konuda endişelenmemize gerek yoktu. Bu durum, 9. modülde değişiyor.

Dikkate alınması gereken önemli bir nokta, yeni App Engine uygulamasının artık App Engine hizmetlerini kullanmamasıdır. Bu nedenle, App Engine'in farklı bir üründe (Cloud Tasks) otomatik olarak görev sırası oluşturduğunu varsayamazsınız. Yazıldığı gibi, fetch_visits()'da (var olmayan bir sıra için) görev oluşturma işlemi başarısız olur. ("default") kuyruğunun mevcut olup olmadığını kontrol etmek ve mevcut değilse oluşturmak için yeni bir işlev gerekir.

Bu işlevi _create_queue_if() olarak çağırın ve çağrıldığı yer olan fetch_visits()'nin hemen üstüne uygulamanıza ekleyin. Eklenecek işlevin gövdesi:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

Cloud Tasks create_queue() işlevi, sıra adı hariç sıranın tam yol adını gerektirir. Basitlik için, QUEUE_PATH eksi kuyruk adını (QUEUE_PATH.rsplit('/', 2)[0]) temsil eden başka bir değişken PATH_PREFIX oluşturun. Tanımını en üste yakın bir yere ekleyin. Böylece, tüm sabit atamaları içeren kod bloğu şu şekilde görünür:

_, PROJECT_ID = google.auth.default()
REGION_ID = 'REGION_ID'    # replace w/your own
QUEUE_NAME = 'default'     # replace w/your own
QUEUE_PATH = ts_client.queue_path(PROJECT_ID, REGION_ID, QUEUE_NAME)
PATH_PREFIX = QUEUE_PATH.rsplit('/', 2)[0]

Şimdi fetch_visits() içindeki son satırı _create_queue_if() kullanacak şekilde değiştirin. Gerekirse önce kuyruğu oluşturun, ardından görevi oluşturun:

    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Hem _create_queue_if() hem de fetch_visits() artık toplu olarak şu şekilde görünmelidir:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

Bu ek kodu eklemeniz dışında, Cloud Tasks kodunun geri kalanı 8. modüldekiyle neredeyse aynıdır. İncelenecek son kod parçası, görev işleyicidir.

Güncelleme (push) görev işleyicisi

Görev işleyicide (trim()), Cloud NDB kodu, gösterilen en eski ziyaretten daha eski ziyaretler için sorgu gönderir. İşlemleri hızlandırmak için yalnızca anahtarlardan oluşan bir sorgu kullanır. Yalnızca ziyaret kimliklerine ihtiyacınız varsa neden tüm verileri getirmeniz gerekir? Tüm ziyaretçi kimliklerini aldıktan sonra Cloud NDB'nin delete_multi() işleviyle hepsini toplu olarak silin.

ÖNCESİ:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    with ds_client.context():
        keys = Visit.query(
                Visit.timestamp < datetime.fromtimestamp(oldest)
        ).fetch(keys_only=True)
        nkeys = len(keys)
        if nkeys:
            logging.info('Deleting %d entities: %s' % (
                    nkeys, ', '.join(str(k.id()) for k in keys)))
            ndb.delete_multi(keys)
        else:
            logging.info(
                    'No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

fetch_visits() gibi, değişikliklerin büyük bir kısmı Cloud NDB kodunu Cloud Datastore ile değiştirmeyi, sorgu stillerini ayarlamayı, bağlam yöneticisinin kullanımını kaldırmayı ve günlük kaydı çağrılarını print() olarak değiştirmeyi içerir.

SONRASI:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    query = ds_client.query(kind='Visit')
    query.add_filter('timestamp', '<', datetime.fromtimestamp(oldest))
    query.keys_only()
    keys = list(visit.key for visit in query.fetch())
    nkeys = len(keys)
    if nkeys:
        print('Deleting %d entities: %s' % (
                nkeys, ', '.join(str(k.id) for k in keys)))
        ds_client.delete_multi(keys)
    else:
        print('No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

Ana uygulama işleyicisinde root() herhangi bir değişiklik yapılmamıştır.

Python 3'e taşıma

Bu örnek uygulama hem Python 2 hem de 3'te çalışacak şekilde tasarlanmıştır. Python 3'e özgü tüm değişiklikler, bu eğitimin ilgili bölümlerinde daha önce ele alınmıştır. Ek adım veya uyumluluk kitaplığı gerekmez.

Cloud Tasks güncellemesi

Python 2'yi destekleyen Cloud Tasks istemci kitaplığının son sürümü 1.5.0'dır. Bu yazı yazıldığı sırada, Python 3 için istemci kitaplığının en son sürümü bu sürümle tamamen uyumluydu. Bu nedenle, başka güncelleme yapılması gerekmiyordu.

HTML şablonu güncellemesi

HTML şablon dosyasında, templates/index.html, de herhangi bir değişiklik yapılması gerekmez. Böylece, 9. Modül uygulamasına ulaşmak için gerekli tüm değişiklikler tamamlanmış olur.

6. Özet/Temizleme

Uygulamayı dağıtma ve doğrulama

Kod güncellemelerini (özellikle Python 3'e taşıma) tamamladıktan sonra uygulamanızı gcloud app deploy ile dağıtın. Çıkış, veritabanı erişimini Cloud Datastore istemci kitaplığına taşımanız ve Python 3'e yükseltmeniz dışında 7. ve 8. modlardaki uygulamalarla aynı olmalıdır:

Module 7 visitme app

Bu adım, codelab'i tamamlar. Kodunuzu 9. Modül klasöründeki kodla karşılaştırmanızı öneririz. Tebrikler!

Temizleme

Genel

Şimdilik işiniz bittiyse faturalandırmayı önlemek için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Ancak biraz daha test veya deneme yapmak isterseniz App Engine platformunda ücretsiz kota bulunur. Bu nedenle, kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Bu, işlem için geçerlidir ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasını inceleyin. Bu taşıma işlemine başka Cloud hizmetleri de dahilse bunlar ayrı olarak faturalandırılır. Her iki durumda da varsa aşağıdaki "Bu codelab'e özel" bölümüne bakın.

Tam açıklama yapmak gerekirse App Engine gibi bir Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapıldığında küçük derleme ve depolama maliyetleri oluşur. Cloud Build ve Cloud Storage'ın kendi ücretsiz kotaları vardır. Bu görüntünün depolanması, kotanın bir kısmını kullanır. Ancak, böyle bir ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınıza dikkat edin. İncelemeniz gereken belirli Cloud Storage "klasörleri" şunlardır:

  • 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
  • Yukarıdaki depolama bağlantıları, PROJECT_ID ve *LOC*ınıza bağlıdır. Örneğin, uygulamanız ABD'de barındırılıyorsa "us" olur.

Öte yandan, bu uygulamaya veya ilgili diğer taşıma codelab'lerine devam etmeyecekseniz ve her şeyi tamamen silmek istiyorsanız projenizi kapatın.

Bu codelab'e özel

Aşağıda listelenen hizmetler bu codelab'e özeldir. Daha fazla bilgi için her ürünün belgelerine bakın:

Sonraki adımlar

App Engine görev sırası push görevlerinden Cloud Tasks'e geçişimiz tamamlandı. Cloud NDB'den Cloud Datastore'a isteğe bağlı geçiş de 3. Modül'de kendi başına (Task Queue veya Cloud Tasks olmadan) ele alınır. 3. modülün yanı sıra, App Engine eski paketlenmiş hizmetlerinden geçişe odaklanan başka taşıma modülleri de vardır:

  • 2. Modül: App Engine NDB'den Cloud NDB'ye taşıma
  • 3. Modül: Cloud NDB'den Cloud Datastore'a taşıma
  • 12-13. modüller: App Engine Memcache'ten Cloud Memorystore'a geçiş
  • 15-16. Modüller: App Engine Blobstore'dan Cloud Storage'a geçiş
  • 18-19. Modüller: App Engine görev sırasından (çekme görevleri) Cloud Pub/Sub'a geçiş

App Engine artık Google Cloud'daki tek sunucusuz platform değil. Küçük bir App Engine uygulamanız veya sınırlı işlevselliğe sahip bir uygulamanız varsa ve bunu bağımsız bir mikro hizmete dönüştürmek istiyorsanız ya da tek bir uygulamayı birden fazla yeniden kullanılabilir bileşene ayırmak istiyorsanız Cloud Functions'a geçmeyi düşünebilirsiniz. Container mimarisine alma, özellikle CI/CD (sürekli entegrasyon/sürekli teslim veya dağıtım) ardışık düzeninden oluşuyorsa uygulama geliştirme iş akışınızın bir parçası haline geldiyse Cloud Run'a geçmeyi düşünebilirsiniz. Bu senaryolar aşağıdaki modüllerde ele alınır:

  • App Engine'den Cloud Functions'a geçiş: 11. Modül'e bakın.
  • App Engine'den Cloud Run'a taşıma: Uygulamanızı Docker ile container mimarisine almak için 4. Modül'e, container'lar, Docker bilgisi veya Dockerfile olmadan yapmak için 5. Modül'e bakın.

Başka bir sunucusuz platforma geçmek isteğe bağlıdır. Herhangi bir değişiklik yapmadan önce uygulamalarınız ve kullanım alanlarınız için en iyi seçenekleri göz önünde bulundurmanızı öneririz.

Bir sonraki geçiş modülünüz hangisi olursa olsun, tüm Serverless Migration Station içeriklerine (codelab'ler, videolar, kaynak kodu [varsa]) açık kaynaklı depodan erişebilirsiniz. Depodaki README, hangi taşımaların dikkate alınması gerektiği ve ilgili "sıra" hakkında da rehberlik sağlar.

7. Ek kaynaklar

Codelab'lerle ilgili sorunlar/geri bildirimler

Bu codelab ile ilgili sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama yapma ve yeni sorunlar oluşturma bağlantıları:

Taşıma kaynakları

8. Modül (BAŞLANGIÇ) ve 9. Modül (BİTİŞ) ile ilgili depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bu dokümanlara, tüm App Engine codelab'lerinin taşındığı depodan da erişebilirsiniz. Bu depoyu klonlayabilir veya ZIP dosyası olarak indirebilirsiniz.

Codelab

Python 2

Python 3

Modül 8

code

(yok)

Modül 9

(yok)

code

Online kaynaklar

Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:

App Engine

Cloud NDB

Cloud Datastore

Cloud Tasks

Diğer Cloud bilgileri

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.