App Engine Memcache'den Cloud Memorystore'a taşıma (Modül 13)

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ı, Python 2 App Engine geliştiricilerine App Engine Memcache'den Cloud Memorystore'a (Redis için) geçişin nasıl yapılacağını göstermektir. Ayrıca App Engine ndb'den Cloud NDB'ye dolaylı geçiş de mevcuttur ancak bu süreç temel olarak Modül 2 codelab'de ele alınmıştır; daha fazla adım adım bilgi için bakabilirsiniz.

Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • Cloud Memorystore örneği oluşturma (Cloud Console veya gcloud aracından)
  • Cloud Sunucusuz VPC Erişimi bağlayıcısı oluşturun (Cloud Console veya gcloud aracından)
  • App Engine Memcache'den Cloud Memorystore'a taşıma
  • Örnek uygulamada Cloud Memorystore ile önbelleğe alma uygulama
  • App Engine'den ndb Cloud NDB'ye taşıma

Gerekenler

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca baştan sona oku Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

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

Acemi Orta Yeterli

2. Arka plan

Bu codelab'de, örnek bir uygulamanın App Engine Memcache'den (ve NDB) Cloud Memorystore'a (ve Cloud NDB) nasıl taşınacağı gösterilmektedir. Bu işlem, App Engine paket hizmetlerindeki bağımlılıkları değiştirmeyi ve uygulamalarınızı daha taşınabilir hale getirmeyi içeriyor. App Engine'de kalmayı seçebilir veya daha önce açıklanan alternatiflerden herhangi birine geçmeyi düşünebilirsiniz.

Bu taşıma işlemi, bu serideki diğerlerine göre daha fazla çaba gerektirir. App Engine Memcache'in yerine, tümüyle yönetilen ve bulut tabanlı bir önbelleğe alma hizmeti olan Cloud Memorystore'un kullanılması önerilir. Memorystore, Redis ve Memcached adlı açık kaynaklı bir çift popüler önbelleğe alma motorunu destekler. Bu taşıma modülünde Redis için Cloud Memorystore kullanılmaktadır. Daha fazla bilgiyi Memorystore ve Redis'e genel bakış bölümünde bulabilirsiniz.

Memorystore, çalışan bir sunucu gerektirdiğinden Cloud VPC'ye de ihtiyaç vardır. Özellikle, App Engine uygulamasının Memorystore örneğine özel IP adresi aracılığıyla bağlanabilmesi için Sunucusuz VPC Erişimi bağlayıcısı oluşturulmalıdır. Bu alıştırmayı tamamladığınızda uygulamanızı güncelleyeceksiniz. Bu uygulama daha önce olduğu gibi çalışıyor olsa da Cloud Memorystore, App Engine'in Memcache hizmetinin yerine geçerek önbelleğe alma hizmeti olacak.

Bu eğitim, Python 2'de Modül 12 örnek uygulaması ile başlar ve ardından Python 3'e ek, isteğe bağlı, küçük bir yükseltme uygulanır. Python 3 App Engine SDK'sı aracılığıyla App Engine paketlenmiş hizmetlerine Python 3'ten erişme konusunda zaten bilgi sahibiyseniz bunun yerine Modül 12 örnek uygulamasının Python 3 sürümünü kullanabilirsiniz. Memorystore, App Engine paket hizmeti olmadığından bu işlem SDK kullanımının kaldırılmasını gerektirir. Python 3 App Engine SDK'sının nasıl kullanılacağını öğrenmek bu eğitimin kapsamı dışındadır.

Bu eğitim aşağıdaki temel adımları içerir:

  1. Kurulum/ön çalışma
  2. Önbelleğe alma hizmetlerini ayarlama
  3. Yapılandırma dosyalarını güncelleme
  4. Ana uygulamayı güncelle

3. Kurulum/ön çalışma

Cloud projesini hazırlama

Modül 12 codelab'ini tamamlamak için kullandığınız projeyi yeniden kullanmanızı öneririz. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Bu serideki her codelab'in bir "START" öğesi vardır (başlanacak referans kod) ve bir "FINISH" (taşınan uygulama). Sorun olması durumunda kendi çözümlerinizi bizim çözümümüzle karşılaştırabilmeniz için FINISH kodu sağlanır. Bir şeyler ters giderse istediğiniz zaman BAŞLANGIÇ bölümüne geri dönebilirsiniz. Bu kontrol noktaları, taşıma işlemlerini nasıl yapacağınızı öğrenmenize yardımcı olmak için tasarlanmıştır.

Hangi Cloud projesini kullanırsanız kullanın, projede etkin bir faturalandırma hesabı bulunduğundan emin olun. Ayrıca App Engine'in etkinleştirildiğinden emin olun. Bu eğiticileri oluşturmanın maliyetle ilgili genel etkilerini inceleyin ve anladığınızdan emin olun. Ancak bu serideki diğerlerinin aksine bu codelab'de, ücretsiz katmanı olmayan Cloud kaynakları kullanılır. Bu nedenle, alıştırmayı tamamlamak için bazı ücretler ödenmesi gerekir. Daha ayrıntılı maliyet bilgilerinin yanı sıra kullanımın azaltılmasına yönelik öneriler sağlanacaktır. Bu önerilerin en sonda, faturalandırma ücretlerini en aza indirmek için kaynakları serbest bırakmayla ilgili talimatlar yer alacaktır.

Temel örnek uygulamayı al

Bu codelab'de, BAŞLAYAN temel Modül 12 kodundan taşıma işlemi adım adım açıklanmıştır. İşlem tamamlandığında, FINISH klasörlerinden birindeki koda çok benzeyen, çalışır durumdaki bir Modül 13 uygulamasına ulaşırsınız. Bu kaynaklar şunlardır:

START klasörü aşağıdaki dosyaları içermelidir:

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

Python 2 sürümünü kullanıyorsanız Modül 12 codelab'ini tamamladıysanız bir appengine_config.py dosyası ve muhtemelen bir lib klasörü bulunur.

(Yeniden) Modül 12 uygulamasını dağıtın

Kalan ön iş adımlarınız:

  1. gcloud komut satırı aracına aşinalık kazanın (gerekirse)
  2. (gerekirse) Modül 12 kodunu App Engine'e dağıtın (yeniden)

Python 2 kullanıcıları, aşağıdaki komutları kullanarak lib klasörünü silip yeniden yüklemelidir:

rm -rf ./lib; pip install -t lib -r requirements.txt                

Şimdi herkes (Python 2 ve 3 kullanıcıları) şu komutla kodu App Engine'e yüklemelidir:

gcloud app deploy                

Başarılı bir şekilde dağıtıldıktan sonra uygulamanın, Modül 12'deki uygulama gibi göründüğünü ve çalıştığını onaylayın. Modül 12, ziyaretleri izleyen ve aynı kullanıcı için bir saat boyunca önbelleğe alan bir web uygulamasıdır:

dfe56a02ae59ddd8.png

En son ziyaretler önbelleğe alındığından, sayfa yenilemeleri oldukça hızlı bir şekilde yüklenmelidir.

4. Önbelleğe alma hizmetlerini ayarlama

Cloud Memorystore, sunucusuz değildir. Örnek gerekli; bu örnekte Redis'i çalıştırıyor. Memcache'in aksine, Memorystore bağımsız bir Cloud ürünüdür ve ücretsiz katmanına sahip değildir. Bu nedenle, devam etmeden önce Memorystore için Redis fiyatlandırma bilgilerini kontrol etmeyi unutmayın. Bu alıştırmanın maliyetlerini en aza indirmek için, çalıştırılacak en az kaynak miktarını belirlemenizi öneririz: Temel hizmet katmanı ve 1 GB kapasite.

Memorystore örneği, App Engine uygulamanızdan (örnekler) farklı bir ağdadır. Bu nedenle, App Engine'in Memorystore kaynaklarınıza erişebilmesi için Sunucusuz VPC Erişimi bağlayıcısı oluşturulmalıdır. VPC maliyetlerini en aza indirmek için örnek türünü (f1-micro) ve istenecek en az örnek sayısını seçin (minimum 2, en fazla 3). Ayrıca VPC fiyatlandırma bilgileri sayfasına da göz atın.

Gerekli her kaynağı oluşturma sürecinde size yol gösterirken maliyetleri azaltmak için bu önerileri tekrarlıyoruz. Ayrıca Cloud Console'da Memorystore ve VPC kaynakları oluşturduğunuzda sağ üst köşede her ürün için fiyat hesaplayıcıyı görürsünüz. Bu hesaplama size aylık maliyet tahmini sunar (aşağıdaki resme bakın). Seçeneklerinizi değiştirirseniz bu değerler otomatik olarak ayarlanır. Bu kampanyaları genel hatlarıyla aşağıda görebilirsiniz:

7eb35ebf7248c010.png

Her iki kaynak da gereklidir ve önce hangisini oluşturduğunuz önemli değildir. Önce Memorystore örneğini oluşturursanız App Engine uygulamanız VPC bağlayıcısı olmadan bu örneğe erişemez. Benzer şekilde, önce VPC bağlayıcısını oluşturursanız App Engine uygulamanızın o VPC ağında konuşacağı hiçbir şey olmaz. Bu eğiticide, önce Memorystore örneğini ve ardından VPC bağlayıcısını oluşturmanız gerekir.

Her iki kaynak da internete bağlandıktan sonra, uygulamanızın önbelleğe erişebilmesi için ilgili bilgileri app.yaml hizmetine eklemeniz gerekir. Resmi belgelerdeki Python 2 veya Python 3 kılavuzlarına da başvurabilirsiniz. Cloud NDB taşıma sayfasındaki veri önbelleğe alma rehberini ( Python 2 veya Python 3) de incelemek faydalı olabilir.

Cloud Memorystore örneği oluşturma

Cloud Memorystore'un ücretsiz katmanı olmadığından, codelab'i tamamlamak için en az miktarda kaynak ayırmanızı öneririz. Aşağıdaki ayarları kullanarak maliyetleri minimum düzeyde tutabilirsiniz:

  • En düşük hizmet katmanını seçin: Temel (konsol varsayılanı: "Standart", gcloud varsayılan: "Temel").
  • En düşük depolama alanını seçin: 1 GB (konsol varsayılanı: 16 GB, gcloud varsayılan: 1 GB).
  • Genellikle herhangi bir yazılımın en yeni sürümleri en fazla miktarda kaynak gerektirir, ancak en eski sürümün seçilmesi de büyük olasılıkla önerilmez. Şu anda ikinci en son sürüm Redis sürümü 5.0 (konsol varsayılanı: 6.x) şeklindedir.

Bu ayarları göz önünde bulundurarak bir sonraki bölüm, Cloud Console'dan örnek oluşturma konusunda size yol gösterecektir. Bu işlemi komut satırından yapmayı tercih ederseniz ileri atlayın.

Cloud Console'dan

Cloud Console'daki Cloud Memorystore sayfasına gidin (fatura bilgileri istenebilir). Memorystore'u henüz etkinleştirmediyseniz şu işlemi yapmanız istenir:

68318997e3105db6.png

Bu aracı etkinleştirdikten sonra (muhtemelen faturalandırma işlemiyle birlikte) Memorystore kontrol paneline ulaşırsınız. Projenizde oluşturulan tüm örnekleri burada görebilirsiniz. Aşağıda gösterilen projede hiç satır yok; bu nedenle "Görüntülenecek satır yok" mesajını görüyorsunuz. Memorystore örneği oluşturmak için en üstteki Create instance'ı (Örnek oluştur) tıklayın:

63547aa575838a36.png

Bu sayfada, Memorystore örneğini oluşturmak için istediğiniz ayarlarla dolduracağınız bir form bulunmaktadır:

b77d927287fdf4c7.png

Bu eğitimin ve örnek uygulamasının maliyetlerini düşük tutmak için daha önce bahsedilen önerileri uygulayın. Seçimlerinizi yaptıktan sonra Oluştur'u tıklayın. Oluşturma işlemi birkaç dakika sürer. İşlem tamamlandığında, app.yaml hizmetine eklemek üzere örneğin IP adresini ve bağlantı noktası numarasını kopyalayın.

Komut satırından

Cloud Console'dan Memorystore örnekleri oluşturmak görsel olarak bilgilendirici olsa da bazıları komut satırını tercih eder. Devam etmeden önce gcloud uygulamasının yüklü ve başlatılmış olduğundan emin olun.

Cloud Console'da olduğu gibi, Redis için Cloud Memorystore'un da etkinleştirilmesi gerekir. gcloud services enable redis.googleapis.com komutunu verin ve aşağıdaki örnekte gösterildiği gibi işlemin tamamlanmasını bekleyin:

$ gcloud services enable redis.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Hizmet zaten etkinleştirilmişse komutu (tekrar) çalıştırmanın hiçbir (olumsuz) yan etkisi yoktur. Hizmet etkinleştirildiğinde Memorystore örneği oluşturalım. Komut şu şekilde görünür:

gcloud redis instances create NAME --redis-version VERSION \
    --region REGION --project PROJECT_ID

Memorystore örneğiniz için bir ad seçin; Bu laboratuvar "demo-ms" kullanır "my-project" proje kimliğiyle birlikte ad olarak biçimlendirin. Bu örnek uygulamanın bölgesi us-central1 (us-central ile aynı) ancak gecikme endişesi yaşarsanız size daha yakın bir bölge kullanabilirsiniz. App Engine uygulamanızla aynı bölgeyi seçmeniz gerekir. Tercih ettiğiniz herhangi bir Redis sürümünü seçebilirsiniz ancak daha önce önerildiği gibi sürüm 5'i kullanıyoruz. Bu ayarları göz önünde bulundurarak, vereceğiniz komut şu şekildedir (ilişkili çıkışla birlikte):

$ gcloud redis instances create demo-ms --region us-central1 \
    --redis-version redis_5_0 --project my-project

Create request issued for: [demo-ms]
Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done.
Created instance [demo-ms].

Cloud Console varsayılanlarından farklı olarak gcloud, varsayılan olarak minimum düzeyde kaynak kullanır. Sonuç olarak bu komutta ne hizmet katmanı ne de depolama alanı miktarı gerekliydi. Memorystore örneği oluşturma işlemi birkaç dakika sürer. İşlem tamamlandığında örneğin IP adresini ve bağlantı noktası numarasını not edin. Bu bilgiler yakında app.yaml hizmetine eklenecektir.

Örneğin oluşturulduğunu onaylayın

Cloud Console'dan veya komut satırından

Örneğinizi ister Cloud Console'dan ister komut satırından oluşturun, şu komutla örneğinizin kullanılabilir ve kullanıma hazır olduğunu onaylayabilirsiniz: gcloud redis instances list --region REGION

Aşağıda, az önce oluşturduğumuz örneği gösteren beklenen çıkışla birlikte us-central1 bölgesindeki örnekleri kontrol etme komutu verilmiştir:

$ gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER   SIZE_GB  HOST         PORT  NETWORK  RESERVED_IP     STATUS  CREATE_TIME
demo-ms        REDIS_5_0  us-central1  BASIC  1        10.aa.bb.cc  6379  default  10.aa.bb.dd/29  READY   2022-01-28T09:24:45

Örnek bilgileri veya uygulamanızı yapılandırmanız istendiğinde HOST ve PORT kullandığınızdan emin olun (RESERVED_IP değil). Cloud Console'daki Cloud Memorystore kontrol panelinde bu örnek gösterilecektir:

c5a6948ec1c056ed.png

Compute Engine sanal makinesinden

Compute Engine sanal makineniz varsa çalıştığını onaylamak için bir sanal makineden Memorystore örneğinizin doğrudan komutlarını da gönderebilirsiniz. Sanal makine kullanımıyla, halihazırda kullandığınız kaynaklardan bağımsız olarak ilişkili maliyetler olabileceğini unutmayın.

Sunucusuz VPC Erişimi bağlayıcısı oluşturma

Cloud Memorystore'da olduğu gibi, sunucusuz Cloud VPC bağlayıcısını Cloud Console'da veya komut satırında oluşturabilirsiniz. Benzer şekilde, Cloud VPC'nin ücretsiz katmanı yoktur. Bu nedenle, maliyetleri minimumda tutmak ve aşağıdaki ayarlarla, codelab'i tamamlamak için en az miktarda kaynak ayırmanızı öneririz:

  • Maksimum en düşük örnek sayısını seçin: 3 (konsol ve gcloud varsayılanı: 10)
  • En düşük maliyetli makine türünü seçin: f1-micro (konsol varsayılanı: e2-micro, gcloud varsayılanı yok)

Bir sonraki bölüm, yukarıdaki Cloud VPC ayarlarını kullanarak Cloud Console'dan bağlayıcı oluşturma konusunda size yol gösterecektir. Bunu komut satırından yapmayı tercih ederseniz sonraki bölüme geçin.

Cloud Console'dan

Cloud Networking "Sunucusuz VPC erişimi"ne gidin sayfasında bakın (fatura bilgileri istenebilir). API'yi henüz etkinleştirmediyseniz bunu yapmanız istenir:

e3b9c0651de25e97.png

API'yi etkinleştirdikten sonra (muhtemelen faturalandırma işlemiyle birlikte) oluşturulan tüm VPC bağlayıcılarının gösterildiği kontrol paneline ulaşırsınız. Aşağıdaki ekran görüntüsünde kullanılan projede hiç satır yok. İşte bu yüzden "Görüntülenecek satır yok" yazıyor. Konsolunuzda en üstteki Create Connector (Bağlayıcı Oluştur) seçeneğini tıklayın:

b74b49b9d73b7dcf.png

Formu istediğiniz ayarlarla doldurun:

6b26b2aafa719f73.png

Kendi uygulamalarınız için uygun ayarları seçin. Bu eğitim ve minimum ihtiyaç duyan örnek uygulaması için maliyetleri en aza indirmek mantıklıdır. Bu nedenle, daha önce bahsedilen önerileri uygulayın. Seçimlerinizi yaptıktan sonra Oluştur'u tıklayın. VPC bağlayıcısı isteme işleminin tamamlanması birkaç dakika sürer.

Komut satırından

VPC bağlayıcısı oluşturmadan önce Sunucusuz VPC Erişimi API'sini etkinleştirin. Aşağıdaki komutu verdikten sonra benzer bir çıkış görürsünüz:

$ gcloud services enable vpcaccess.googleapis.com
Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

API etkinleştirildiğinde, aşağıdakine benzer bir komutla bir VPC bağlayıcısı oluşturulur:

gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --range 10.8.0.0/28 --region REGION --project PROJECT_ID

Bağlayıcınız için bir ad ve kullanılmayan bir /28 CIDR bloğu başlangıç IP adresi seçin. Bu eğitim aşağıdaki varsayımlarda bulunur:

  • Proje Kimliği: my-project
  • VPC bağlayıcı adı: demo-vpc
  • Min. örnek sayısı: 2 (varsayılan) ve maks. örnek sayısı: 3
  • Örnek türü: f1-micro
  • Bölge: us-central1
  • IPv4 CIDR bloğu: 10.8.0.0/28 (Cloud Console'da önerildiği gibi)

Aşağıdaki varsayımları göz önünde bulundurarak aşağıdaki komutu çalıştırırsanız aşağıdakine benzer bir çıkış alırsınız:

$ gcloud compute networks vpc-access connectors create demo-vpc \
    --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \
    --region us-central1  --project my-project

Create request issued for: [demo-vpc]
Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done.
Created connector [demo-vpc].

Yukarıdaki komutta, minimum 2 örnekleri ve default adlı bir ağ gibi varsayılan değerler atlanır. VPC bağlayıcısı oluşturma işlemi birkaç dakika sürer.

Bağlayıcının oluşturulduğunu onaylayın

İşlem tamamlandıktan sonra, us-central1 bölgesinde olduğunu varsayarak aşağıdaki gcloud komutunu vererek komutun oluşturulduğunu ve kullanıma hazır olduğunu onaylayın:

$ gcloud compute networks vpc-access connectors list --region us-central1
CONNECTOR_ID  REGION       NETWORK  IP_CIDR_RANGE  SUBNET  SUBNET_PROJECT  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
demo-vpc      us-central1  default  10.8.0.0/28                            200             300             READY

Benzer şekilde, gösterge tablosunda az önce oluşturduğunuz bağlayıcı da gösterilir:

e03db2c8140ed014.png

Cloud projesi kimliğini, VPC bağlayıcısının adını ve bölgeyi not edin.

Gerekli ek Cloud kaynaklarını komut satırında veya konsolda oluşturduğunuza göre artık uygulama yapılandırmasını bu kaynakların kullanımını destekleyecek şekilde güncelleyebilirsiniz.

5. Yapılandırma dosyalarını güncelleme

İlk adım, yapılandırma dosyalarında gerekli tüm güncellemeleri yapmaktır. Bu codelab'in ana hedefi Python 2 kullanıcılarının geçişine yardımcı olmaktır ancak aşağıdaki her bölümde genellikle içeriğin devamında Python 3'e daha fazla geçiş yapmayla ilgili bilgiler verilir.

requirements.txt

Bu bölümde hem Cloud Memorystore'u hem de Cloud NDB'yi destekleyen paketler ekliyoruz. Redis için Cloud Memorystore'da, tek başına Cloud Memorystore istemci kitaplığı olmadığından Python (redis) için standart Redis istemcisini kullanmanız yeterlidir. 12. Modül'deki flask ürününe katılarak hem redis hem de google-cloud-ndb öğelerini requirements.txt alanına ekleyin:

flask
redis
google-cloud-ndb

Bu requirements.txt dosyasında sürüm numarası bulunmadığından en son sürümler seçildi. Herhangi bir uyumsuzluk oluşursa çalışan sürümlerde kilitlenecek sürüm numaralarını belirtin.

app.yaml

Eklenecek yeni bölümler

Python 2 App Engine çalışma zamanı, Cloud NDB gibi Cloud API'lerini (grpcio ve setuptools) kullanırken belirli üçüncü taraf paketleri gerektirir. Python 2 kullanıcıları, bunun gibi yerleşik kitaplıkları ve app.yaml içinde kullanılabilir bir sürümü listelemelidir. Henüz libraries bölümünüz yoksa bir tane oluşturun ve her iki kitaplığı da aşağıdaki gibi ekleyin:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

Uygulamanız taşınırken zaten bir libraries bölümü olabilir. Varsa ve grpcio ile setuptools eksikse bunları mevcut libraries bölümünüze eklemeniz yeterlidir.

Ardından, örnek uygulamamızın Cloud Memorystore örneği ve VPC bağlayıcı bilgilerine ihtiyacı vardır. Bu nedenle, kullandığınız Python çalışma zamanını dikkate almadan aşağıdaki iki yeni bölümü app.yaml bölümüne ekleyin:

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Gerekli güncellemeler bu kadar. Güncellenen app.yaml aşağıdaki gibi görünecektir:

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

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Aşağıda "öncesi ve sonrası"nı görebilirsiniz. app.yaml için uygulamanız gereken güncellemeler gösteriliyor:

ec2bb027a67debb6.png

*Python 3 farklılıkları

Bu bölüm isteğe bağlıdır ve yalnızca Python 3'e bağlantı yapıyorsanız isteğe bağlıdır. Bunun için Python 2 yapılandırmanızda birkaç değişiklik yapmanız gerekir. Şu anda yükseltme yapmıyorsanız bu bölümü atlayın.

Python 3 çalışma zamanı için threadsafe veya api_version kullanılmadığından bu ayarların her ikisini de silin. En son App Engine çalışma zamanı, 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.

Ardından, Python 3 çalışma zamanı için kendi yönlendirmesini yapan web çerçevelerinin kullanılmasını gerektirir. Bu nedenle, geliştiricilere Modül 1'de webp2'den Flask'a nasıl geçiş yapacaklarını gösterdik. Sonuç olarak, tüm komut dosyası işleyicileri auto olarak değiştirilmelidir. Bu uygulama statik dosya sunmadığı için "bir şey ifade etmez" işleyicilerin listelenmesi gerekir (tümü auto olduğu için). Bu nedenle handlers bölümünün tamamı kaldırılabilir. Sonuç olarak, Python 3 için ayarlanmış yeni ve kısaltılmış app.yaml ayarınız, şu şekilde görünecek şekilde kısaltılmalıdır:

runtime: python39

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Python 3'e taşıma işlemi sırasında app.yaml farklılıkları:

  • threadsafe ve api_version ayarlarını sil
  • libraries bölümünü sil
  • handlers bölümünü (veya uygulamanız statik dosyalar sunuyorsa yalnızca script işleyicilerini) silin

Değerleri değiştirin

Memorystore ve VPC bağlayıcısı için yeni bölümlerde yer alan değerler yalnızca yer tutucudur. Büyük harfle yazılan değerleri (YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME), söz konusu kaynakları daha önce oluşturduğunuz zamandan itibaren kaydedilen değerlerle değiştirin. Memorystore örneğinizle ilgili olarak HOST (RESERVED_IP değil) ve PORT kullandığınızdan emin olun. Örnek adının demo-ms ve REGION öğesinin us-central1 olduğu varsayılarak HOST ve PORT verilerini almanın hızlı bir komut satırı yolunu aşağıda bulabilirsiniz:

$ gcloud redis instances describe demo-ms --region us-central1 \
    --format "value(host,port)"
10.251.161.51   6379

Örnek Redis örneğimizin IP adresi, VPC bağlayıcısı adı demo-vpc olan us-central1 bölgesinde yer alan my-project projemizdeki 6379 bağlantı noktasını kullanan 10.10.10.10 ise app.yaml içindeki bu bölümler şöyle görünür:

env_variables:
    REDIS_HOST: '10.10.10.10'
    REDIS_PORT: '6379'

vpc_access_connector:
    name: projects/my-project/locations/us-central1/connectors/demo-vpc

appengine_config.py oluştur veya güncelle

Yerleşik üçüncü taraf kitaplıklar için destek ekleyin

Daha önce app.yaml özelliğinde olduğu gibi grpcio ve setuptools kitaplıklarının kullanımını ekleyin. Yerleşik üçüncü taraf kitaplıklarını desteklemek için appengine_config.py dosyasını değiştirin. Bu durum size tanıdık geliyorsa App Engine'den ndb Cloud NDB'ye geçiş yaparken Modül 2'de de bu zorunluluktan kaynaklanıyordur. Yapmanız gereken tam değişiklik, lib klasörünü setuptools.pkg_resources çalışma grubuna eklemektir:

4140b3800694f77e.png

*Python 3 farklılıkları

Bu bölüm isteğe bağlıdır ve yalnızca Python 3'e bağlantı yapıyorsanız isteğe bağlıdır. App Engine'in ikinci nesil değişikliklerden biri, yerleşik olmayan üçüncü taraf paketlerinin kopyalanması (bazen "tedarikçi firma" olarak da adlandırılır) ve app.yaml ürününde yerleşik 3. taraf paketlere referans verilmesi artık gerekli olmadığı için appengine_config.py dosyasının tamamını silebilirsiniz.

6. 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. Bu uygulamayı Cloud Memorystore'a taşımak için yapacağımız değişikliklerin resimli bir temsilini paylaştık. Yalnızca açıklama amaçlıdır ve yakından analiz etmeniz amaçlanmamıştır. İşin tamamı, kodda yaptığımız değişikliklerde yapılır.

5d043768ba7be742.png

En baştan başlayarak bunları tek tek ele alalım.

İçe aktarmaları güncelleme

Modül 12'nin main.py içindeki içe aktarma bölümünde Cloud NDB ve Cloud Tasks kullanılır; içe aktarımları şunlardır:

ÖNCE:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

Memorystore'a geçiş için okuma ortamı değişkenleri gerekir. Bu nedenle, Python os modülüne ve Python Redis istemcisi olan redis'a ihtiyacımız vardır. Redis, Python nesnelerini önbelleğe alamadığından, pickle kullanarak en son ziyaret listesini düzenleyin. Dolayısıyla, bunu da içe aktarın. Memcache'in avantajlarından biri nesne serileştirmenin otomatik olarak gerçekleşmesidir. Memorystore ise daha fazla "kendin yap" işlemidir. Son olarak, google.appengine.ext.ndb yerine google.cloud.ndb koyarak App Engine'den ndb sürümünü Cloud NDB'ye yükseltin. Bu değişikliklerin ardından, içe aktarma işlemleriniz artık aşağıdaki gibi görünmelidir:

SONRA:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

Başlatma güncelleme

Modül 12'nin başlatılması, Flask uygulama nesnesi app örneklendirmeyi ve bir saatlik önbelleğe alma değeri için bir sabit değer ayarlamayı içerir:

ÖNCE:

app = Flask(__name__)
HOUR = 3600

Cloud API'lerini kullanmak için bir istemci gerekir. Bu nedenle, Flask'tan hemen sonra bir Cloud NDB istemcisi oluşturun. Ardından, app.yaml içinde ayarladığınız ortam değişkenlerinden Memorystore örneğinin IP adresini ve bağlantı noktası numarasını alın. Bu bilgilerden yararlanarak bir Redis istemcisi oluşturun. Bu güncellemelerden sonra kodunuz şu şekilde görünür:

SONRA:

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

*Python 3 taşıma

Module 12 uygulamasının Python 3 sürümünden başlıyorsanız bu bölüm isteğe bağlıdır. Bu durumda, içe aktarma ve başlatma ile ilgili gerekli bazı değişiklikler söz konusudur.

Öncelikle, Memcache bir App Engine paket hizmeti olduğundan Python 3 uygulamasında kullanımı için App Engine SDK'sı gerekir. Bu SDK, özellikle WSGI uygulamasını (ayrıca diğer gerekli yapılandırmaların) sarmalamasını gerektirir:

ÖNCE:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Cloud Memorystore'a (Membe gibi bir App Engine paket hizmeti değil) geçiş yaptığımız için SDK kullanımının kaldırılması gerekir. Hem memcache hem de wrap_wsgi_app verilerini içe aktaran tüm satırı silmeniz yeterli olacaktır. wrap_wsgi_app() hattını da sil. Bu güncellemeler, uygulamanın bu kısmını (aslında uygulamanın tamamı) Python 2 sürümüyle aynı bırakır.

SONRA:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

Son olarak, app.yaml (satır: app_engine_apis: true) ve requirements.txt (appengine-python-standard satırını silin) satırlarından SDK kullanımını kaldırın.

Cloud Memorystore'a (ve Cloud NDB) taşıma

Cloud NDB'nin veri modeli, App Engine ndb ile uyumlu olacak şekilde tasarlanmıştır. Diğer bir ifadeyle, Visit nesnelerin tanımı aynı kalır. Modül 2'nin Cloud NDB'ye taşınmasına benzer şekilde, store_visit() ve fetch_visits() içindeki tüm Datastore çağrıları artırılır ve yeni bir with blokuna yerleştirilir (Cloud NDB bağlam yöneticisinin kullanımı gerekir). Söz konusu değişiklikten önceki aramalar:

ÖNCE:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

Her iki işleve de with ds_client.context() bloğu ekleyin ve Datastore çağrılarını içine yerleştirin (ve girintili). Bu durumda, aramaların kendileri için herhangi bir değişiklik yapılması gerekmez:

SONRA:

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

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

Şimdi de önbelleğe alma değişikliklerine bakalım. Modül 12'deki main() işlevi şu şekildedir:

ÖNCE:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Redis'te "get" bulunur ve "set" çağrılarına benzerdir. Yalnızca ilgili istemci kitaplıklarını değiştiriyoruz, değil mi? Çok yaklaştınız. Daha önce de belirttiğimiz gibi, bir Python listesini Redis ile önbelleğe alamıyoruz (çünkü önce serileştirilmesi gerekir, bu nedenle Memcache otomatik olarak halleder). set() çağrısında "seç"i seçin. bunları pickle.dumps() değerini içeren bir dizeye dönüştürür. Benzer şekilde, önbellekten ziyaretler alırken get() öğesinden hemen sonra pickle.loads() ile işaretini kaldırmanız gerekir. Bu değişiklikleri uyguladıktan sonraki ana işleyiciyi burada görebilirsiniz:

SONRA:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    rsp = REDIS.get('visits')
    visits = pickle.loads(rsp) if rsp else None

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        REDIS.set('visits', pickle.dumps(visits), ex=HOUR)

    return render_template('index.html', visits=visits)

Bu işlem, örnek uygulamanın Memcache kullanımını Cloud Memorystore'a dönüştürmede main.py için gereken değişikliklerin tamamlanmasına yol açmıştır. HTML şablonu ve Python 3'e taşıma işlemi ne olacak?

HTML şablon dosyası ve bağlantı noktası Python 3 olarak güncellensin mi?

Sürpriz! Uygulama, herhangi bir kod değişikliği veya uyumluluk kitaplığı olmadan hem Python 2 hem de 3'te çalışacak şekilde tasarlandığından burada herhangi bir işlem yapmanız gerekmez. main.py uygulamasını bulacaksınız. mod13a (2.x) ve mod13b (3.x) "FINISH" genelinde aynıdır klasörlerini tıklayın. Sürüm numaralarındaki (kullanılıyorsa) farklar dışında , aynı durum requirements.txt için de geçerlidir. Kullanıcı arayüzü değişmediğinden templates/index.html için de güncelleme yapılmamıştır.

Bu uygulamayı Python 3 App Engine'de çalıştırmak için gereken her şey, yapılandırma sırasında daha önce tamamlandı: Gereksiz yönergeler app.yaml etiketinden kaldırıldı ve Python 3'te kullanılmadığı için hem appengine_config.py hem de lib klasörü silindi.

7. Özet/Temizlik

Bu bölümde, uygulamayı dağıtıp amaçlandığı şekilde ve yansıtılan herhangi bir çıkışta çalıştığını doğrulayarak bu codelab'i özetledik. Uygulama doğrulamasından sonra tüm temizlik işlemlerini yapın ve sonraki adımları değerlendirin.

Uygulamayı dağıtma ve doğrulama

Son kontrol her zaman örnek uygulamayı dağıtmaktır. Python 2 geliştiricileri: Aşağıdaki komutları kullanarak lib dosyasını silip yeniden yükleyin. (Sisteminizde hem Python 2 hem de 3 yüklüyse bunun yerine açıkça pip2 çalıştırmanız gerekebilir.)

rm -rf ./lib
pip install -t lib -r requirements.txt

Hem Python 2 hem de 3 geliştiricileri, uygulamalarını artık aşağıdakilerle dağıtmalıdır:

gcloud app deploy

Yalnızca arka planda tamamen farklı bir önbelleğe alma hizmeti için yeniden kablo oluşturduğunuzdan, uygulamanın kendisi Modül 12 uygulamanızla aynı şekilde çalışmalıdır:

Modül 7 ziyaret uygulaması

Bu adımda codelab tamamlanır. Güncellenen örnek uygulamanızı mod13a (Python 2) veya mod13b (Python 3) klasörlerinden biriyle karşılaştırmanızı öneririz.

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:

Bu eğitim, dört Cloud ürününün kullanımını kapsamaktadır:

  • App Engine
  • Cloud Datastore
  • Cloud Memorystore
  • Cloud VPC

Aşağıda, bu kaynakları serbest bırakma ve faturalandırma ücretlerini önlemek/en aza indirmek için talimatlar verilmiştir.

Memorystore örneğini ve VPC bağlayıcısını kapatın

Bunlar, ücretsiz katmanı olmayan ürünlerdir. Bu nedenle, şu anda faturalandırma ödemeniz gerekir. Cloud projenizi kapatmazsanız (sonraki bölüme bakın) faturalandırmayı durdurmak için hem Memorystore örneğinizi hem de VPC bağlayıcınızı silmeniz gerekir. Bu kaynakları oluşturduğunuz zamanki gibi Cloud Console'dan veya komut satırından da yayınlayabilirsiniz.

Cloud Console'dan

Memorystore örneğini silmek için Memorystore kontrol paneline dönün ve örnek kimliğini tıklayın:

2b09baf1aa2e0a25.png

Bu örneğin ayrıntılar sayfasında "Sil"i tıklayın ve onaylayın:

f9d9eb1c1d4c6107.png

VPC bağlayıcısını silmek için kendi kontrol paneline gidin ve silmek istediğiniz bağlayıcının yanındaki onay kutusunu işaretleyip "Sil"i tıklayın. ve onaylayın:

ca5fbd9f4c7c9b60.png

Komut satırından

Aşağıdaki gcloud komut çifti, sırasıyla hem Memorystore örneğini hem de VPC bağlayıcısını siler:

  • gcloud redis instances delete INSTANCE --region REGION
  • gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION

gcloud config set project ile proje kimliğinizi ayarlamadıysanız --project PROJECT_ID sağlamanız gerekebilir. Memorystore örneğinizin adı demo-ms, VPC bağlayıcısı ise demo-vpc ise ve her ikisi de us-central1 bölgesindeyse aşağıdaki komut çiftini verin ve onaylayın:

$ gcloud redis instances delete demo-ms --region us-central1
You are about to delete instance [demo-ms] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-ms]
Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done.
Deleted instance [demo-ms].
$
$ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1
You are about to delete connector [demo-vpc] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-vpc]
Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done.
Deleted connector [demo-vpc].

Her isteğin çalışması birkaç dakika sürer. Daha önce açıklandığı gibi Cloud projenizin tamamını kapatmayı tercih ederseniz bu adımlar isteğe bağlıdır. Ancak kullanımdan kaldırma işlemi tamamlanana kadar faturalandırmanız devam eder.

Sonraki adımlar

Bu eğiticinin yanı sıra, eski paket servislerin kullanımdan kaldırılmasına odaklanan diğer taşıma modüllerini de göz önünde bulundurun:

  • Modül 2: App Engine ndb'den Cloud NDB'ye geçiş
  • Modüller 7-9: App Engine Görev Sırası push görevlerini Cloud Tasks'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: App Engine Görev Sırası'ndan (görev alma) 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 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.

8. Ek kaynaklar

Aşağıda, geliştiricilerin bu veya ilgili Taşıma Modülü'nü ve ilgili ürünleri daha ayrıntılı bir şekilde inceleyen ek kaynaklar verilmiştir. Bu bölümde, söz konusu içerikle ilgili geri bildirimde bulunabileceğiniz yerler, kod bağlantıları ve yararlı bulabileceğiniz çeşitli belgeler yer alır.

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 12 (START) ve Modül 13 (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

12. Modül

kod

kod

Modül 13 (bu codelab)

kod

kod

Online referanslar

Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:

App Engine

App Engine NDB ve Cloud NDB

App Engine Memcache ve Cloud Memorystore

Cloud VPC

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.