11. Modül: Google App Engine'den Cloud Functions'a Geçiş

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.

"Uygulamanızın tamamı"na sahip olmadığınız durumlar söz konusu olabilir App Engine veya Cloud Run kaynaklarını gerektirmelidir. Kodunuz yalnızca bir mikro hizmet veya basit bir işlevden oluşuyorsa Cloud Functions muhtemelen sizin için daha uygun olacaktır. Bu codelab'de, basit App Engine uygulamalarını taşımayı (veya büyük uygulamaları birden fazla mikro hizmete ayırmanızı) ve bu uygulamaları bunun gibi kullanım alanları için özel olarak oluşturulmuş bir sunucusuz platform olan Cloud Functions'a dağıtmayı öğretebilirsiniz.

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

  • Cloud Shell'i kullanma
  • Google Cloud Translation API'yi etkinleştirme
  • API isteklerinin kimliğini doğrulama
  • Küçük bir App Engine uygulamasını Cloud Functions üzerinde çalışacak şekilde dönüştürme
  • Kodunuzu Cloud Functions'a dağıtma

Gerekenler

Anket

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

Yalnızca okuma 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

Google App Engine ve Cloud Functions gibi PaaS sistemleri kullanıcılara birçok kolaylık sağlar. Bu sunucusuz platformlar, teknik ekibinizin ihtiyaç duyulan donanım miktarını belirlemek ve kullanmak için platformları araştırmakla zaman kaybetmek yerine iş çözümleri oluşturmaya odaklanmasını sağlar. Uygulamalar gerektiğinde otomatik olarak ölçeklendirilebilir, maliyetleri kontrol etmek için kullan başına ödeme faturalandırmasıyla sıfıra kadar ölçeklendirme yapabilir ve günümüzün yaygın geliştirme dillerine olanak tanır.

Bununla birlikte, full-stack web uygulaması geliştirme veya mobil uygulamalar için karmaşık arka uçlar, App Engine'e uygun olsa da genellikle geliştiriciler haber feed'ini güncelleme veya ev sahibi takımın play-off maçının son skorunu alma gibi bazı işlevleri internet ortamına taşımaya çalışırlar. Her iki senaryo için de kodlama mantığı mevcut olsa da, ikisi de tam donanımlı "uygulamalar" değildir. App Engine'in gücünü gerektirir. Cloud Functions burada devreye girer.

Cloud Functions, kodun aşağıdaki küçük kısmını dağıtmak için kullanılır:

  • Bir uygulamanın tamamının parçası değil
  • Geliştirme yığınının tamamında gerekli değildir
  • Tek bir şeye odaklanan bir uygulamada veya tek bir mobil uygulama arka ucundadır

Ayrıca Cloud Functions'ı kullanarak büyük bir monolitik uygulamayı birden fazla mikro hizmete bölebilirsiniz. Her bir mikro hizmette, her biri Cloud Firestore veya Cloud SQL gibi ortak kullanılan bir veritabanı kullanılır. İşlevinizin veya mikro hizmetinizin container mimarisine alınıp Cloud Run'da sunucusuz olarak yürütülmesini istiyorsanız bunu da yapabilirsiniz.

Taşıma eğiticilerinin neredeyse tamamında yer alan örnek App Engine uygulamamız, temel işlevleri Cloud Functions'da da çalışan kısa bir uygulamadır. Bu eğiticide, uygulamayı Cloud Functions üzerinde çalışacak şekilde nasıl değiştireceğinizi öğreneceksiniz. App Engine açısından bakıldığında, işlevler uygulamanın tamamından daha basit olduğundan, başlangıç deneyiminiz daha kolay (ve daha hızlı) olmalı ve daha az "ek yük" gerektirmelidir emin olabilirsiniz. Bu taşıma işleminde aşağıdaki adımlar yer alır:

  • Kurulum/Ön Çalışma
  • Yapılandırma dosyalarını kaldırma
  • Uygulama dosyalarını değiştirme

3. Kurulum/Ön Çalışma

Cloud Functions, Python 2'yi desteklemediğinden bu codelab, Modül 2 Cloud NDB App Engine örnek uygulamasının Python 3 sürümüyle başlar. İlk olarak projemizi oluşturup kodu alalım. Sonra, çalışan kodla başladığımızı onaylamak için temel uygulamayı dağıtalım.

1. Proje oluşturun

Modül 2 codelab'ini tamamladıysanız (ve Python 3'e taşıdıysanız) aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projede, App Engine hizmetinin etkinleştirildiği etkin bir faturalandırma hesabı bulunduğundan emin olun.

2. Temel örnek uygulamayı al

Bu codelab'in ön koşullarından biri, çalışan bir Modül 2 örnek uygulamasına sahip olmaktır. Henüz yoksa buraya geçmeden önce yukarıda bağlantısı verilen eğitimlerden birini tamamlayın. Aksi takdirde, modülün içeriğine aşinaysanız aşağıdaki Modül 2 kodunu alarak başlayabilirsiniz.

İster sizin ister bizimkininkini kullanın, Modül 2 Python 3 kodunu kullanmaya başlayın. Bu Modül 11 codelab'inde, her adımda size yol gösterilir ve Modül 11 depo klasöründeki (FINISH) koda benzeyen bir kod gösterilir.

Python 3 Modül 2 BAŞLANGIÇ dosyalarının dizini (sizin ya da bizimki) şöyle görünmelidir:

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

3. Temel uygulamayı (yeniden) dağıtma

Hemen yürütmek için kalan ön çalışma adımlarınız:

  1. gcloud komut satırı aracını yeniden tanıma
  2. Örnek uygulamayı gcloud app deploy ile yeniden dağıtın
  3. Uygulamanın App Engine'de sorunsuz çalıştığını onaylayın

Bu adımları başarıyla gerçekleştirdikten sonra, bunları bir Cloud Functions işlevine dönüştürmeye hazır olursunuz.

4. Yapılandırma dosyalarını kaldırma

app.yaml dosyası, Cloud Functions ile kullanılmayan bir App Engine yapısı olduğundan dosyayı hemen silin. Bunu yapmayı unutursanız veya unutursanız Cloud Functions tarafından kullanılmaz. requirements.txt, Modül 2'dekiyle aynı kaldığı için yapılan tek yapılandırma değişikliği budur.

Bir Python 2 App Engine uygulamasını Python 3'e de taşıyorsanız appengine_config.py ve varsa lib klasörünü silin. Bunlar, Python 3 çalışma zamanında kullanılmayan App Engine yapılarıdır.

5. Uygulama dosyalarını değiştirme

main.py adlı tek bir uygulama dosyası olduğu için Cloud Functions'a geçiş için gerekli tüm değişiklikler bu dosyada yapılır.

İçe aktarılanlar

Yalnızca işlevlerle çalıştığımız için web uygulaması çerçevesine gerek yok. Bununla birlikte, kolaylık sağlamak amacıyla Python tabanlı Cloud Functions çağrıldığında, kodunuzun gerektiğinde kullanması için bunlara otomatik olarak bir istek nesnesi iletilir. (Cloud Functions ekibi, bu nesneyi işlevinize iletilen bir Flask İsteği nesnesi olarak seçti.)

Web çerçeveleri Cloud Functions ortamının bir parçası olmadığı için, uygulamanızda diğer Flask özellikleri kullanılmadığı sürece Flask'tan içe aktarma yapılmaz. Bizim örneğimiz, bir işleve dönüştürme sonrasında şablon oluşturma işlemi devam ettiğinden, flask.render_template() çağrısının yapılması hâlâ gereklidir, dolayısıyla öğesi de Flask'tan içe aktarılmaktadır. Web çerçevesi olmadığı için Flask uygulaması örneklendirmenize gerek yoktur. Bu nedenle app = Flask(__name__) öğesini silin. Değişiklikler uygulanmadan önce ve uygulandıktan sonra kodunuz aşağıdaki gibi görünür:

ÖNCE:

from flask import Flask, render_template, request
from google.cloud import ndb

app = Flask(__name__)
ds_client = ndb.Client()

SONRA:

from flask import render_template
from google.cloud import ndb

ds_client = ndb.Client()

Uygulama nesnesine (app) veya başka bir web çerçevesi altyapısına bağımlıysanız tüm bu bağımlılıkları çözmeniz, uygun çözümler bulmanız, bunların kullanımını tamamen kaldırmanız ya da proxy bulmanız gerekir. Kodunuzu ancak bu şekilde bir Cloud Functions işlevine dönüştürebilirsiniz. Aksi takdirde App Engine'de kalmanız veya uygulamanızı Cloud Run için container mimarisine almanız daha iyi olur

Ana işleyici işlevi imzasını güncelle

İşlev imzasında yapılması gereken değişiklikler şunlardır:

  1. Flask, uygulama Cloud Functions işlevine dönüştürüldükten sonra artık kullanılmamaktadır. Bu nedenle rota tasarımcılarını kaldırın.
  2. Cloud Functions, Flask Request nesnesini otomatik olarak parametre olarak aktarır. Bu nedenle, bu nesne için bir değişken oluşturun. Örnek uygulamamızda bunu request olarak adlandıracağız.
  3. Dağıtılan Cloud Functions işlevleri adlandırılmalıdır. Ana işleyicimiz, ne olduğunu (kök uygulama işleyici) açıklamak için App Engine'de uygun şekilde root() olarak adlandırıldı. Bir Cloud Functions işlevi olarak bu adı kullanmak pek mantıklı değildir. Bunun yerine, Cloud Functions işlevini visitme adıyla dağıtacağız. Bu nedenle, Python işlevinin adı olarak bu işlevi de kullanın. Benzer şekilde Modül 4 ve 5'te Cloud Run hizmetini de visitme olarak adlandırdık.

Bu güncellemelerin öncesinde ve sonrasında yapılan değişiklikler şöyle:

ÖNCE:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

SONRA:

def visitme(request):
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

Böylece gerekli güncellemelerin hepsi tamamlanmış oldu. Yapılan değişikliklerin yalnızca uygulamanın "altyapısını" etkilediğini unutmayın girin. Temel uygulama kodunda herhangi bir değişiklik yapılmasına gerek yoktur ve uygulamanın işlevlerinde değişiklik yapılmamıştır. Bu noktayı göstermek için yapılan değişikliklerin resimli gösterimi şunlardır:

668f30e3865b27a9.png

Yerel geliştirme ve test

App Engine'de dev_appserver.py yerel geliştirme sunucusu bulunurken Cloud Functions'da kendi İşlevler Çerçevesi bulunur. Bu çerçeveyle yerel olarak uygulama geliştirip test edebilirsiniz. Kodunuz Cloud Functions'a dağıtılabilir ancak Compute Engine ve Cloud Run gibi diğer bilgi işlem platformlarına, hatta Knative'i destekleyen şirket içi ya da karma bulut sistemlerine de dağıtılabilir. Functions Çerçevesi'nin ek bağlantıları için aşağıya bakın.

6. Derleme ve dağıtma

Cloud Functions'a dağıtım, App Engine'den biraz farklıdır. requirements.txt dışında yapılandırma dosyası kullanılmadığından, komut satırında kodla ilgili daha fazla bilgi belirtilmelidir. Python 3.10 altında çalışan, HTTP tetiklenmiş yeni Cloud Functions işlevinizi şu komutla dağıtın:

$ gcloud functions deploy visitme --runtime python310 --trigger-http --allow-unauthenticated

Aşağıdakine benzer bir çıkış alırsınız:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/f5f6fc81-1bb3-4cdb-8bfe?project=PROJECT_ID
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: f5f6fc81-1bb3-4cdb-8bfe
buildName: projects/PROJECT_ID/locations/REGION/builds/f5f6fc81-1bb3-4cdb-8bfe
dockerRegistry: CONTAINER_REGISTRY
entryPoint: visitme
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/visitme
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/visitme
runtime: python310
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/uploads-853031211983.REGION.cloudfunctions.appspot.com/8c923758-cee8-47ce-8e97-5720a5301c34.zip
status: ACTIVE
timeout: 60s
updateTime: '2022-05-16T18:28:06.153Z'
versionId: '8'

İşleviniz dağıtıldıktan sonra dağıtım çıkışındaki URL'yi kullanarak uygulamanızı ziyaret edin. URL şu biçimdedir: REGION-PROJECT_ID.cloudfunctions.net/visitme. Çıkış, App Engine'e daha önce dağıttığınız zamankiyle aynı olmalıdır:

2732ae9218f011a2.png

Serideki diğer birçok codelab'de ve videoda olduğu gibi temel uygulama işlevselliği de değişmemiştir. Amaç, bir modernizasyon tekniği uygulayarak uygulamanın aynı şekilde önceki gibi çalışmasını ve daha yeni bir altyapıyı desteklemesini sağlamaktır. Örneğin, eski bir App Engine hizmetinden eski bir App Engine hizmetinden yeni Cloud bağımsız ürününe geçiş yapabilir veya bu eğiticide olduğu gibi bir uygulamayı başka bir Google Cloud sunucusuz platformuna taşıyabilirsiniz.

7. Özet/Temizlik

Tebrikler, bu küçük App Engine uygulamasını bir Cloud Functions işlevine dönüştürdünüz. Bir diğer uygun kullanım alanı da büyük bir monolitik App Engine uygulamasını, her biri Cloud Functions işlevi olacak şekilde bir dizi mikro hizmete ayırmaktadır. Bu, daha fazla "tak-çalıştır" olanağı sağlayan daha modern bir geliştirme tekniğidir bileşen (a la " JAM yığını") stiline sahip olacaktır. Karıştırmaya ve eşleştirmeye ve kodların yeniden kullanılmasına olanak tanır. Bunlar iki hedeftir. Ancak bu mikro hizmetler zaman içinde hata ayıklamaya devam eder. Bu da tutarlı kodlar ve genel bakım maliyetlerini düşürür.

Temizleme

Bu codelab'i tamamladıktan sonra faturalandırmanın tekrarlanmasını önlemek için Modül 2 App Engine uygulamasını geçici veya kalıcı olarak devre dışı bırakabilirsiniz. App Engine platformunun ücretsiz bir kotası vardır. Bu nedenle, kullanım katmanı içinde kaldığınız sürece faturalandırılmazsınız. Aynı durum Datastore için de geçerlidir; daha fazla ayrıntı için Cloud Datastore fiyatlandırma sayfasına bakın.

App Engine ve Cloud Functions gibi platformlara dağıtım yapmak için küçük derleme ve depolama maliyetleri uygulanır. Bazı bölgelerde Cloud Build ve Cloud Storage kendi ücretsiz kotasına sahiptir. Derlemeler bu kotanın bir kısmını kullanır. Özellikle bölgenizde böyle bir ücretsiz katman yoksa olası maliyetleri en aza indirmek için depolama alanı kullanımınızı göz önünde bulundurun.

Maalesef Cloud Functions'da "devre dışı bırak" seçeneği yoktur. özelliğini kullanabilirsiniz. Kodunuzu yedekleyin ve işlevi silin. Daha sonra istediğiniz zaman aynı adla yeniden dağıtabilirsiniz. Ancak başka bir taşıma codelab'ine geçmeyecekseniz ve her şeyi tamamen silmek istiyorsanız Cloud projelerinizi kapatın.

Sonraki adımlar

Bu eğiticinin yanı sıra, incelenecek diğer taşıma modülleri arasında App Engine uygulamanızı Cloud Run için container mimarisine alma yer alır. Modül 4 ve Modül 5 codelab'lerinin bağlantılarına göz atın:

  • 4. Modül: Docker ile Cloud Run'a Geçiş
  • Docker ile Cloud Run'da çalışması için uygulamanızı container mimarisine alın
  • Bu taşıma işlemiyle Python 2'de kalabilirsiniz.
  • Modül 5: Cloud Buildpacks ile Cloud Run'a taşıma
  • Cloud Buildpacks ile uygulamanızı Cloud Run'da çalıştırmak için container mimarisine alın
  • Docker, container'lar veya Dockerfile hakkında herhangi bir şey bilmeniz gerekmez.
  • Uygulamanızın Python 3'e zaten taşınmış olmasını gerektirir (Derleme paketleri, Python 2'yi desteklemez)

Diğer modüllerin çoğunda, geliştiricilere App Engine paket halinde sunulan hizmetlerden Cloud'un bağımsız yedeklerine nasıl geçiş yapılacağını göstermeye odaklanılmıştır:

  • 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ş

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 Functions yerine Cloud Run'a geçiş yapmayı düşünün. Uygulamanızı Docker ile container mimarisine almak için Modül 4'e; container'lar, Docker bilgileri ya da Dockerfile olmadan bunu yapmak için Modül 5'e bakın. İster Cloud Functions ister Cloud Run'ı düşünü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 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

App Engine taşıma modülü codelab'leri ile ilgili sorunlar/geri bildirimler

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 3

2. Modül

kod

11. Modül

kod

Çevrimiçi kaynaklar

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

App Engine

Cloud Functions

Diğer Cloud bilgileri

Videolar

Lisans

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