1. Genel Bakış
Sunucusuz Taşıma İstasyonu codelab'leri serisi (kendi kendine ilerleyen, uygulamalı eğiticiler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerinin uygulamalarını bir veya daha fazla taşıma işleminde yönlendirerek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu videolar genellikle eski hizmetlerden uzaklaştırılır. Bu sayede uygulamalarınızı daha taşınabilir hale getirir, daha fazla seçenek ve esneklik elde edebilir, daha geniş bir Cloud ürünü yelpazesiyle entegrasyon ve erişim elde edebilir, ayrıca yeni dil sürümlerine kolayca geçiş yapabilirsiniz. Başlangıçta özellikle App Engine (standart ortam) geliştiricileri olmak üzere ilk Cloud kullanıcılarına odaklanan bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda diğer sunucusuz platformları ya da diğer platformları kapsayacak kadar geniş kapsamlıdır.
Bu codelab'in amacı, Modül 8 örnek uygulamasını Python 3'e taşımak ve Datastore (Datastore modunda Cloud Firestore) erişimini Cloud NDB'den yerel Cloud Datastore istemci kitaplığına geçirmek ve Cloud Tasks istemci kitaplığının en son sürümüne yükseltmektir.
7. Modül'de push görevleri için Görev Sırası kullanımını ekledik ve ardından bu kullanımı Modül 8'de Cloud Görevleri'ne taşıdık. 9. Modül'de Python 3 ve Cloud Datastore'a devam ediyoruz. pull görevleri için Görev Sıraları'nı kullananlar, Cloud Pub/Sub'a taşınacaktır ve bunun yerine 18-19 arasındaki Modüllere başvurmaları gerekir.
Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:
- Modül 8 örnek uygulamasını Python 3'e taşıma
- Datastore erişimini Cloud NDB'den Cloud Datastore istemci kitaplıklarına geçirme
- Cloud Tasks istemci kitaplığının en son sürümüne geçin
Gerekenler
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Çalışan bir Modül 8 App Engine uygulaması: Modül 8 codelab'ini tamamlayın (önerilen) veya depodan Modül 8 uygulamasını kopyalayın
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
Modül 7, Python 2 Flask App Engine uygulamalarında App Engine Görev Sırası push görevlerinin nasıl kullanılacağını gösterir. Modül 8'de bu uygulamayı Görev Sırası'ndan Cloud Görevler'e taşıyacaksınız. 9. Modül'de bu yolculuğa devam edip uygulamayı Python 3'e taşımanın yanı sıra Datastore erişimini Cloud NDB'den yerel Cloud Datastore istemci kitaplığına geçirmeyi öğreneceksiniz.
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 olarak taşınması tamamen isteğe bağlıdır ve bunu göz önünde bulundurmanın tek bir nedeni vardır: Halihazırda Cloud Datastore istemci kitaplığını kullanan App Engine dışı uygulamalarınız (ve/veya Python 3 App Engine uygulamaları) var ve kod tabanınızı yalnızca bir istemci kitaplığıyla Datastore'a erişmek için birleştirmek istiyorsunuz. Cloud NDB, Python 3 taşıma aracı olarak Python 2 App Engine geliştiricileri için özel olarak oluşturulmuştur. Bu nedenle, Cloud Datastore istemci kitaplığını kullanan kodunuz yoksa bu taşıma işlemini gerçekleştirmenize gerek yoktur.
Son olarak, Cloud Tasks istemci kitaplığının geliştirilmesi yalnızca Python 3'te devam ettiği için "taşınıyor". son Python 2 sürümlerinden birini kullanarak Python 3 modern sürümünü kullanmayı tercih edin. Neyse ki Python 2'de zarar veren herhangi bir değişiklik yok. Diğer bir deyişle, burada yapmanız gereken başka bir şey yok.
Bu eğitim aşağıdaki adımları içerir:
- Kurulum/Ön Çalışma
- Yapılandırmayı güncelleyin
- Uygulama kodunu değiştir
3. Kurulum/Ön Çalışma
Bu bölümde aşağıdakilerin nasıl yapılacağı açıklanmaktadır:
- Cloud projenizi oluşturun
- Temel örnek uygulamayı al
- 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şturun
Modül 8 codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanın. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı ve etkin bir App Engine uygulamasının bulunduğundan emin olun. Bu codelab'de ihtiyacınız olduğunda proje kimliğinizi bulun ve PROJECT_ID
değişkeniyle her karşılaştığınızda kullanın.
2. Temel örnek uygulamayı al
Ön koşullardan biri, çalışan bir Modül 8 App Engine uygulamasıdır: Modül 8 codelab'ini tamamlayın (önerilir) veya depodan Modül 8 uygulamasını kopyalayın. İster sizin ister bizimkininkini kullanın, Modül 8 kodu ile başlayalım ("BAŞLAYIN"). Bu codelab'de, Module 9 depo klasöründekine ("FINISH") benzeyen bir kodla sonlandırılır ve taşıma işleminde size yol gösterilir.
- BAŞLANGIÇ: Modül 8 deposu
- FINISH: Modül 9 depo
- Deponun tamamı (ZIP dosyasını klonlayın veya indirin)
Hangi Modül 7 uygulamasını kullandığınıza bakılmaksızın, klasör aşağıdaki gibi görünmelidir: Büyük olasılıkla bir lib
klasörü de vardır:
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. Temel uygulamayı (yeniden) dağıtma ve doğrulama
Modül 8 uygulamasını dağıtmak için aşağıdaki adımları uygulayın:
- Varsa
lib
klasörünü silin velib
öğesini yeniden doldurmak içinpip install -t lib -r requirements.txt
komutunu çalıştırın. Geliştirme makinenizde hem Python 2 hem de 3 yüklüysepip2
kullanmanız gerekebilir. gcloud
komut satırı aracını yükleyip başlattığınızdan ve kullanımını incelediğinizden emin olun.- (İsteğe bağlı) Verdiğiniz her
gcloud
komutuyla birliktePROJECT_ID
girmek istemiyorsanız Cloud projenizigcloud config set project
PROJECT_ID
olarak ayarlayın. - Örnek uygulamayı
gcloud app deploy
ile dağıtın - Uygulamanın beklendiği gibi ve sorunsuz çalıştığını onaylayın. Modül 8 codelab'ini tamamladıysanız uygulama, en son ziyaretlerle birlikte en çok ziyaret edilen ziyaretçileri de gösterir (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
, Modül 8'dekiyle hemen hemen aynıdır, yalnızca tek bir önemli değişiklik vardır: google-cloud-ndb
yerine google-cloud-datastore
kullanılır. Bu değişikliği, requirements.txt
dosyanızın şu şekilde görünmesi için yapın:
flask
google-cloud-datastore
google-cloud-tasks
Bu requirements.txt
dosyasında sürüm numarası bulunmadığından en son sürümler seçildi. Herhangi bir uyumsuzluk oluşursa, bir uygulamanın çalışan sürümlerini kilitlemek için sürüm numaralarının kullanılması standart 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. Bunun sonucunda app.yaml
sayfasının libraries
bölümünün tamamı silinebilir.
Diğer bir güncelleme de, Python 3 çalışma zamanı için kendi yönlendirmesini yapan web çerçevelerinin kullanılmasını gerektirmesidir. Sonuç olarak, tüm komut dosyası işleyicileri auto
olarak değiştirilmelidir. Bununla birlikte, tüm rotaların auto
olarak değiştirilmesi gerektiğinden ve bu örnek uygulamadan sunulan statik dosya olmadığından herhangi bir işleyicinin olması önemli değildir. Bu nedenle, handlers
bölümünün tamamını da kaldırın.
app.yaml
için gereken tek şey, çalışma zamanını Python 3'ün desteklenen bir sürümüne (örneğin 3.10) ayarlamaktır. Bu değişikliği, kısaltılmış yeni app.yaml
yalnızca bu tek satır olacak şekilde yapın:
runtime: python310
appengine_config.py ve lib'yi sil
Yeni nesil App Engine çalışma zamanları, üçüncü taraf paket kullanımını yeniliyor:
- Yerleşik kitaplıklar, büyük olasılıkla geliştiricilerin buluta dağıtmasına izin verilmeyen C/C++ kodunu içermeleri nedeniyle Google tarafından incelenip App Engine sunucularında kullanıma sunulanlardır. Bu kitaplıklar artık 2. nesil çalışma zamanlarında kullanılamamaktadır.
- 2. nesil çalışma zamanlarında yerleşik olmayan kitaplıkların (bazen "tedarikçi firma" veya "kendi kendine paketleme" olarak da adlandırılır) kopyalanmasına artık gerek yoktur. Bunun yerine, derleme sistemi dağıtım sırasında bunları sizin adınıza otomatik olarak yüklediği
requirements.txt
konumunda listelenir.
Üçüncü taraf paket yönetiminde yapılan değişiklikler nedeniyle appengine_config.py
dosyasına veya lib
klasörüne ihtiyaç duyulmadığı için bunları silin. 2. nesil çalışma zamanlarında App Engine, requirements.txt
konumunda listelenen üçüncü taraf paketleri otomatik olarak yükler. Özetleniyor:
- Gruplandırılmış veya kopyalanmış üçüncü taraf kitaplıklar olmamalıdır;
requirements.txt
içinde listele lib
klasöründepip install
yok, yanilib
klasör dönemi yokapp.yaml
bölgesinde yerleşik üçüncü taraf kitaplıkları listelenmez (dolayısıylalibraries
bölümü yoktur);requirements.txt
içinde listele- Uygulamanızda referansta bulunulacak 3. taraf kitaplık olmadığında
appengine_config.py
dosyası olmaz
requirements.txt
ürününde istenen tüm üçüncü taraf kitaplıkların listelenmesi tek geliştirici gereksinimidir.
5. Uygulama dosyalarını güncelle
Yalnızca bir uygulama dosyası (main.py
) bulunduğundan bu bölümdeki tüm değişiklikler yalnızca o dosyayı etkiler. Aşağıda bir "fark" verilmiştir resmi. Amacı, bu yeni düzenlemede nelerin gerekli olduğuna dair resimli bir genel bakış elde etmek olduğundan, okuyucuların kodu satır satır okumaları beklenmez (ancak isterseniz yeni bir sekmede açıp indirebilir ve yakınlaştırabilirsiniz).
İçe aktarma işlemlerini ve başlatmayı güncelleme
Modül 8'in main.py
içindeki içe aktarma bölümünde Cloud NDB ve Cloud Tasks kullanılır; şu şekilde görünmelidir:
ÖNCE:
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()
Günlük kaydı, Python 3 gibi ikinci nesil çalışma zamanlarında basitleştirilmiş ve iyileştirilmiştir:
- Kapsamlı günlük kaydı deneyimi için Cloud Logging'i kullanın
- Basit bir günlük kaydı için
print()
üzerindenstdout
(veyastderr
) adresine göndermeniz yeterlidir - Python
logging
modülünün kullanılmasına gerek yoktur (bu nedenle modülü kaldırın)
Dolayısıyla, logging
içe aktarma işlemini silin ve google.cloud.ndb
değerini google.cloud.datastore
ile değiştirin. Benzer şekilde, ds_client
öğesini bir NDB istemcisi yerine bir Datastore istemcisini 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ür:
SONRA:
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 taşıma
Artık NDB istemci kitaplığı kullanımını Datastore ile değiştirme zamanı. Hem App Engine NDB hem de Cloud NDB için veri modeli (sınıf) gerekir; bu uygulama için saat Visit
. store_visit()
işlevi, diğer tüm taşıma modüllerinde aynı şekilde çalışır: Yeni bir Visit
kaydı oluşturup ziyaret eden istemcinin IP adresini ve kullanıcı aracısını (tarayıcı türü) kaydederek bir ziyaret kaydeder.
ÖNCE:
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, veri modeli sınıfı kullanmaz bu nedenle sınıfı silin. Ayrıca Cloud Datastore, kayıtlar oluşturulduğunda otomatik olarak zaman damgası oluşturmaz. Bu nedenle, bunu manuel olarak yapmanız gerekir. Bu işlem, datetime.now()
çağrısıyla yapılır.
Veri sınıfı olmadan, değiştirdiğiniz store_visit()
şöyle görünmelidir:
SONRA:
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()
. Orijinal sorguyu en son Visit
için gerçekleştirmekle kalmaz, aynı zamanda görüntülenen son Visit
öğesinin zaman damgasını alır ve eski Visit
öğelerini toplu olarak silmek için /trim
(dolayısıyla trim()
) çağrısı yapan aktarma görevini oluşturur. Burada Cloud NDB kullanılıyor:
ÖNCE:
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 stillerinde küçük farklılıklar olabilir.
- Datastore, içerik yöneticisinin kullanılmasını gerektirmez ve Cloud NDB'nin yaptığı gibi, verilerini çıkarmanızı (
to_dict()
ile) gerektirmez. - Günlüğe kaydedilen aramaları
print()
ile değiştir
Bu değişikliklerden sonra, fetch_visits()
aşağıdaki gibi görünür:
SONRA:
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 tek yapmanız gereken budur. Maalesef büyük bir sorun var.
(Muhtemelen) Yeni bir (push) sırası oluşturun
7. Modül'de, mevcut Modül 1 uygulamasına App Engine taskqueue
kullanımını ekledik. Eski bir App Engine özelliği olarak push görevlerine sahip olmanın önemli bir avantajı, otomatik olarak oluşturulur. Söz konusu uygulama Modül 8'de Cloud Tasks'a taşındığında bu varsayılan sıra zaten mevcuttu. Dolayısıyla o zaman yine bu konuda endişelenmemize gerek kalmadı. Bu değişiklik 9. Modül'de yapılmaktadır.
Yeni App Engine uygulamasının artık App Engine hizmetlerini kullanmaması, dikkate alınması gereken önemli noktalardan biridir. Bu nedenle, artık App Engine'in farklı bir üründe (Cloud Tasks) otomatik olarak bir görev sırası oluşturduğunu varsayamazsınız. Yazıldığı gibi, fetch_visits()
ürününde görev oluşturma (mevcut olmayan bir sıra için) başarısız olacak. ("Varsayılan") sıranın mevcut olup olmadığını kontrol etmek ve yoksa oluşturmak için yeni bir işlev gerekiyor.
Bu işlevi _create_queue_if()
çağırın ve fetch_visits()
adının hemen üzerinde yer alan uygulamanıza ekleyin çünkü burada çağrılıyor. Eklenecek fonksiyonun 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. Kolaylık sağlaması açısından, sıra adını (QUEUE_PATH.rsplit('/', 2)[0]
) QUEUE_PATH
çıkarıp temsil eden başka bir PATH_PREFIX
değişkeni oluşturun. Tanımını üst kısma yakın bir yere ekleyin. Böylece, tüm sabit atamalara sahip kod bloğu aşağıdaki gibi 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()
uygulamasındaki son satırı _create_queue_if()
kullanacak şekilde değiştirin. Gerekirse önce sırayı 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 aşağıdaki gibi görünecektir:
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
Cloud Tasks kodunun geri kalanı, bu ek kodla birlikte 8. Modül'den itibaren büyük oranda korunuyor. Bakılması gereken son kod parçası ise görev işleyicidir.
Görev işleyiciyi güncelleme (push)
Cloud NDB kodu, trim()
adlı görev işleyicide görüntülenen en eski ziyaretlerden daha eski olan ziyaretleri sorgular. İşleri hızlandırmak için yalnızca anahtarlardan oluşan bir sorgu kullanıyor. Sadece Ziyaret Kimliklerine ihtiyacınız varsa neden tüm veriler getirilsin? Tüm ziyaret kimliklerine sahip olduktan sonra, Cloud NDB'nin delete_multi()
işlevini kullanarak kimlikleri toplu olarak silin.
ÖNCE:
@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ı da Cloud NDB kodunun Cloud Datastore ile değiştirilmesini, sorgu stillerinde ince ayar yapılmasını, 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.
SONRA:
@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
root()
ana uygulama işleyicisinde değişiklik yok.
Python 3'e bağlantı noktası
Bu örnek uygulama hem Python 2 hem de 3'te çalışacak şekilde tasarlanmıştır. Python 3'e özgü değişiklikler, bu eğiticinin ilgili bölümlerinde daha önce ele alınmıştı. Ek bir adım veya uyumluluk kitaplıkları 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ının yazıldığı tarihte Python 3 için istemci kitaplığının en son sürümü bu sürümle tamamen uyumludur, bu nedenle başka güncelleme gerekmez.
HTML şablonu güncellemesi
templates/index.html
HTML şablon dosyasında da herhangi bir değişiklik yapmaya gerek olmadığından, Modül 9 uygulamasına ulaşmak için gereken tüm değişiklikler burada özetlenmiştir.
6. Özet/Temizlik
Uygulamayı dağıtma ve doğrulama
Temelde Python 3 bağlantı noktası olmak üzere kod güncellemelerini tamamladıktan sonra uygulamanızı gcloud app deploy
ile dağıtın. Veritabanı erişimini Cloud Datastore istemci kitaplığına taşıyıp Python 3'e yükseltmeniz dışında çıkış, Modül 7 ve 8 uygulamasındaki uygulamalarla aynı olmalıdır:
Bu adımda codelab tamamlanır. Kodunuzu Modül 9 klasöründeki kodla karşılaştırmaya davet ederiz. Tebrikler!
Temizleme
Genel
Şimdilik işiniz bittiyse faturalandırılma olmaması için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Bununla birlikte, daha fazla test veya deneme yapmak isterseniz App Engine platformunun ücretsiz bir kotası vardır ve bu kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Burası işlem içindir, ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasına göz atın. Bu taşıma işlemi başka Cloud hizmetlerini içeriyorsa bunlar ayrı olarak faturalandırılır. Her iki durumda da (geçerliyse) "Bu codelab'e özel" bölümünü inceleyin bölümüne bakın.
Ayrıntılı açıklama için, App Engine gibi Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak küçük derleme ve depolama maliyetleri gerektirir. Cloud Build'in ve Cloud Storage'ın kendi ücretsiz kotası vardır. Söz konusu resmin depolanması bu kotanın bir kısmını kullanır. Ancak, bu kadar ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınız konusunda dikkatli olun. Belirli Cloud Storage "klasörleri" şunları incelemeniz gerekir:
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 alanı bağlantıları
PROJECT_ID
ve *LOC
*ifadenize bağlıdır (örneğin, "us
") Uygulamanız ABD'de barındırılıyorsa.
Öte yandan, bu uygulamayı veya diğer ilgili taşıma codelab'lerini kullanmayacak 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'ın ücretsiz bir katmanı vardır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
- App Engine Datastore hizmeti, aynı zamanda ücretsiz bir katmana sahip olan Cloud Datastore (Data Store modunda Cloud Firestore) tarafından sağlanır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
Sonraki adımlar
Böylece, App Engine Görev Sırası'ndaki aktarma görevlerini Cloud Görevler'e taşıma işlemini tamamlamış olduk. Cloud NDB'den Cloud Datastore'a isteğe bağlı taşıma işlemi, Modül 3'te tek başına (Görev Sırası veya Cloud Görevleri olmadan) ele alınmıştır. 3. Modül'e ek olarak, App Engine'in eski paket hizmetlerinden uzaklaşmaya odaklanan başka taşıma modüllerini de göz önünde bulundurun:
- Modül 2: App Engine NDB'den Cloud NDB'ye taşıma
- Modül 3: Cloud NDB'den Cloud Datastore'a taşıma
- Modüller 12-13: App Engine Memcache'den Cloud Memorystore'a taşıma
- Modüller 15-16: App Engine Blobstore'dan Cloud Storage'a taşıma
- Modül 18-19: Cloud Pub/Sub'a App Engine Görev Sırası (görevleri çekme)
App Engine artık Google Cloud'daki tek sunucusuz platform değil. Küçük bir App Engine uygulamanız varsa veya sınırlı işlevselliğe sahip bir uygulamanız varsa ve bunu bağımsız bir mikro hizmete dönüştürmek ya da monolitik bir uygulamayı yeniden kullanılabilir birden fazla bileşene ayırmak istiyorsanız Cloud Functions'a geçmek için iyi nedenler olabilir. Container mimarisine alma işlemi, uygulama geliştirme iş akışınızın bir parçası haline geldiyse, özellikle de bir CI/CD (sürekli entegrasyon/sürekli teslim veya dağıtım) ardışık düzeninden oluşuyorsa Cloud Run'a geçiş yapmayı düşünün. Bu senaryolar aşağıdaki modüllerde ele alınmıştır:
- App Engine'den Cloud Functions'a geçiş: Modül 11'e bakın
- App Engine'den Cloud Run'a taşıma: Uygulamanızı Docker ile container mimarisine almak için Modül 4'e, bu işlemi container'lar, Docker bilgileri ya da
Dockerfile
olmadan yapmak için Modül 5'e bakın.
Başka bir sunucusuz platforma geçmek isteğe bağlıdır. Bu nedenle, herhangi bir değişiklik yapmadan önce uygulamalarınız ve kullanım alanlarınız için en iyi seçenekleri değerlendirmenizi öneririz.
Bir sonraki taşıma modülünden bağımsız olarak tüm Sunucusuz Taşıma İstasyonu içeriklerine (codelab'ler, videolar, kaynak kodu [kullanılabilir olduğunda]) açık kaynak deposundan erişebilirsiniz. Deponun README
özelliği, hangi taşıma işlemlerinin göz önünde bulundurulacağı ve ilgili "siparişler" hakkında da bilgi sağlar. göz atmanızı öneririm.
7. Ek kaynaklar
Codelab sorunları/geri bildirimi
Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:
Taşıma kaynakları
Modül 8 (START) ve Modül 9 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bunlara tüm App Engine codelab taşıma işlemleri için depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası indirebilirsiniz.
Codelab | Python 2 | Python 3 |
(Yok) | ||
Modül 9 | (Yok) |
Çevrimiçi kaynaklar
Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:
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 ile Python 2 arasındaki farklar 3 App Engine (standart ortam) çalışma zamanı
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırması 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 "Daima Ücretsiz" katman
- Google Cloud SDK'sı (
gcloud
komut 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.