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
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutları hakkında çalışma bilgisi
- App Engine uygulamalarını geliştirme ve dağıtma hakkında temel bilgiler
- Çalışan bir 8. Modül App Engine uygulaması: 8. Modül codelab'ini tamamlayın (önerilir) veya 8. Modül uygulamasını depodan kopyalayın.
Anket
Bu eğitimi nasıl kullanacaksınız?
Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
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:
- Kurulum/Ön Hazırlık
- Yapılandırmayı güncelleyin
- 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:
- Cloud projenizi ayarlama
- Temel örnek uygulamayı edinme
- 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.
- BAŞLANGIÇ: 8. Modül deposu
- BİTİRME: Module 9 repo
- Tüm depo (klonlama veya ZIP olarak indirme)
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:
- Varsa
libklasörünü silin veliböğesini yeniden doldurmak içinpip install -t lib -r requirements.txtkomutunu çalıştırın. Geliştirme makinenizde hem Python 2 hem de 3 yüklüysepip2kullanmanız gerekebilir. gcloudkomut satırı aracını yüklediğinizden ve başlattığınızdan emin olun ve kullanımını inceleyin.- (İsteğe bağlı) Her
gcloudkomutunu verdiğinizdePROJECT_IDdeğerini girmek istemiyorsanız Cloud projenizigcloud config set projectPROJECT_IDile ayarlayın. - Örnek uygulamayı
gcloud app deployile dağıtma - 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.

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.txtiç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:
- Paketlenmiş veya kopyalanmış üçüncü taraf kitaplıkları yoksa bunları
requirements.txtiçinde listeleyin. pip install,libklasörüne taşınmaz. Yanilibklasörü yoktur.app.yamliçinde listelenen yerleşik üçüncü taraf kitaplıkları yok (bu nedenlelibrariesbölümü yok); bunlarırequirements.txtiçinde listeleyin.- Uygulamanızda referans verilecek üçüncü taraf kitaplıkları yoksa
appengine_config.pydosyası 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).

İç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(veyastderr) adresineprint()üzerinden göndermeniz yeterlidir. - Python
loggingmodü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:
- Cloud NDB sorgusunu Cloud Datastore eşdeğeriyle değiştirin. Sorgu stilleri biraz farklıdır.
- Datastore, Cloud NDB'nin aksine bağlam yöneticisi kullanılmasını gerektirmez ve verilerinin (
to_dict()ile) çıkarılmasını zorunlu kılmaz. - 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:

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/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Yukarıdaki depolama bağlantıları,
PROJECT_IDve *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:
- Cloud Tasks'in ücretsiz katmanı vardır. Daha fazla bilgi için fiyatlandırma sayfasına göz atın.
- App Engine Datastore hizmeti, ücretsiz katmanı da olan Cloud Datastore (Datastore modunda Cloud Firestore) tarafından sağlanır. Daha fazla bilgi için fiyatlandırma sayfasına 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
Dockerfileolmadan 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 |
(yok) | ||
Modül 9 | (yok) |
Online kaynaklar
Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:
App Engine
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 3 App Engine (standart ortam) çalışma zamanı
- Python 2 ve 3 App Engine (standart ortam) çalışma zamanları arasındaki farklar
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırma ve kota bilgileri
Cloud NDB
Cloud Datastore
- Google Cloud Datastore belgeleri
- Google Cloud Datastore deposu
- Cloud Datastore fiyatlandırma bilgileri
Cloud Tasks
Diğer Cloud bilgileri
- Google Cloud Platform'da Python
- Google Cloud Python istemci kitaplıkları
- Google Cloud "Her Zaman Ücretsiz" katmanı
- Google Cloud SDK (
gcloudkomut satırı aracı) - Tüm Google Cloud belgeleri
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.