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

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.

App Engine veya Cloud Run kaynaklarını gerektirecek "tam bir uygulamanızın" olmadığı durumlar olabilir. Kodunuz yalnızca bir mikro hizmetten veya basit bir işlevden oluşuyorsa Cloud Functions sizin için daha uygun olabilir. Bu codelab'de, basit App Engine uygulamalarını nasıl taşıyacağınız (veya daha büyük uygulamaları birden fazla mikro hizmete nasıl ayıracağınız) ve bunları Cloud Functions'a (özellikle bu gibi kullanım alanları için oluşturulmuş başka bir sunucusuz platform) nasıl dağıtacağınız açıklanmaktadır.

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

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

İhtiyacınız olanlar

Anket

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

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

Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Yeni başlayan Orta düzey Uzman

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

Başlangıç Orta İleri

2. Arka plan

Google App Engine ve Cloud Functions gibi PaaS sistemleri, kullanıcılar için birçok kolaylık sağlar. Bu sunucusuz platformlar, teknik ekibinizin kullanılacak platformları araştırmak ve gereken donanım miktarını belirlemekle zaman harcamak yerine işletme çözümleri oluşturmaya odaklanmasını sağlar. Uygulamalar gerektiğinde otomatik olarak ölçeklenebilir, maliyetleri kontrol etmek için kullandıkça öde faturalandırmasıyla sıfıra kadar ölçeği azaltılabilir ve günümüzün yaygın geliştirme dillerinin çeşitliğini destekler.

Ancak App Engine, tam yığın web uygulaması geliştirme veya mobil uygulamalar için karmaşık arka uçlar konusunda çok uygun olsa da geliştiriciler genellikle bazı işlevleri internete taşımaya çalışır. Örneğin, haber feed'ini güncelleme veya ev sahibi takımın playoff maçındaki son skorunu getirme gibi. Her iki senaryo için de kodlama mantığı mevcut olsa da ikisi de App Engine'in gücünü gerektiren tam teşekküllü "uygulamalar" gibi görünmüyor. Bu noktada Cloud Functions devreye girer.

Cloud Functions, aşağıdaki işlemleri yapan küçük kod parçalarını dağıtmak için kullanılır:

  • Tam bir uygulamanın parçası değildir.
  • Geliştirme yığınının tamamında gerekli değildir.
  • Tek bir şeye odaklanan bir uygulamada veya tek bir mobil uygulama arka ucunda olmalıdır.

Ayrıca, büyük ve tek bir uygulamayı, her biri Cloud Firestore veya Cloud SQL gibi ortak bir veritabanı kullanan birden fazla mikro hizmete ayırmak için Cloud Functions'ı da kullanabilirsiniz. Ayrıca, işlevinizin veya mikro hizmetinizin container mimarisine alınmasını ve Cloud Run'da sunucusuz olarak yürütülmesini istiyorsanız bunu da yapabilirsiniz.

Neredeyse tüm taşıma eğitimlerinde yer alan örnek App Engine uygulamamız, Cloud Functions'ta da aynı şekilde çalışan temel işlevlere sahip kısa bir uygulamadır. Bu eğitimde, söz konusu uygulamayı Cloud Functions'ta çalışacak şekilde nasıl değiştireceğinizi öğreneceksiniz. App Engine açısından, işlevler uygulamalardan daha basit olduğundan, başlangıç deneyiminiz daha kolay (ve daha hızlı) olmalı ve genel olarak daha az "ek yük" içermelidir. Bu taşıma işlemi aşağıdaki adımlardan oluşur:

  • Kurulum/Ön Hazırlık
  • Yapılandırma dosyalarını kaldırma
  • Uygulama dosyalarını değiştirme

3. Kurulum/Ön Hazırlık

Cloud Functions, Python 2'yi desteklemediği için bu codelab, 2. Modül Cloud NDB App Engine örnek uygulamasının Python 3 sürümüyle başlar. Öncelikle projemizi oluşturalım, kodu alalım ve ardından temel uygulamayı dağıtarak çalışan bir kodla başladığımızı doğrulayalım.

1. Proje oluşturma

2. Modül adlı codelab'i tamamladıysanız (ve Python 3'e taşıdıysanız) aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yepyeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin, App Engine hizmetinin etkin olduğu aktif bir faturalandırma hesabına sahip olduğundan emin olun.

2. Temel örnek uygulamayı edinme

Bu codelab'in ön koşullarından biri, çalışan bir 2. Modül örnek uygulamasına sahip olmaktır. Çalışan bir örnek uygulamanız yoksa yukarıda bağlantısı verilen eğitimlerden birini tamamlayıp bu codelab'e geçin. İçeriği biliyorsanız aşağıdaki 2. Modül kodunu alarak başlayabilirsiniz.

Sizin kodunuzu veya bizim kodumuzu kullanıyor olmanız fark etmez. 2. Modül Python 3 kodu, BAŞLAYACAĞIMIZ yerdir. Bu 11. Modül codelab'i, her adımda size yol gösterir ve 11. Modül depo klasöründeki (FINISH) koda benzer bir kodla sonuçlanır.

Python 3 Modülü 2 BAŞLANGIÇ dosyalarının (sizinki veya bizimkiler) dizini şu şekilde görünmelidir:

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

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

Şimdi yapmanız gereken kalan ön hazırlık adımları:

  1. gcloud komut satırı aracı hakkında bilgi edinin
  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 uyguladıktan sonra, işlevi Cloud Function'a dönüştürmeye hazırsınız demektir.

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

app.yaml dosyası, Cloud Functions ile kullanılmayan bir App Engine yapıtıdır. Bu nedenle hemen silin. Bunu yapmazsanız veya yapmayı unutursanız Cloud Functions bu özelliği kullanmadığı için herhangi bir sorun yaşamazsınız. requirements.txt, 2. modüldekiyle aynı kaldığı için yapılandırmada yapılan tek değişiklik budur.

Bir Python 2 App Engine uygulamasını Python 3'e 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

Yalnızca bir uygulama dosyası (main.py) vardır. Bu nedenle, 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 yoktur. Ancak kolaylık sağlamak için Python tabanlı Cloud Functions işlevleri çağrıldığında, kodunuzun gerektiğinde kullanması için otomatik olarak bir istek nesnesi iletilir. (Cloud Functions ekibi, işlevinize iletilecek Flask Request nesnesi olarak seçti.)

Web çerçeveleri Cloud Functions ortamının bir parçası olmadığından, uygulamanız diğer Flask özelliklerini kullanmıyorsa Flask'tan içe aktarma işlemi yapılmaz ancak uygulamanız diğer Flask özelliklerini kullanıyorsa içe aktarma işlemi yapılır. Bu, şablona dönüştürme işlemi işlevlere dönüştürüldükten sonra da devam ettiğinden flask.render_template() çağrısı yapılması gerektiği ve bu nedenle Flask'tan içe aktarılması gerektiği için bizim durumumuzda da geçerlidir. Web çerçevesi olmadığından Flask uygulamasını başlatmaya gerek yoktur. Bu nedenle app = Flask(__name__) öğesini silin. Kodunuz, değişiklikler uygulanmadan önce ve uygulandıktan sonra aşağıdaki gibi görünür:

ÖNCESİ:

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

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

SONRASI:

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ğlıysanız uygun geçici çözümler bularak tüm bu bağımlılıkları çözmeniz, bunların kullanımını tamamen kaldırmanız ya da proxy'ler bulmanız gerekir. Kodunuzu ancak bu durumda Cloud Functions işlevine dönüştürebilirsiniz. Aksi takdirde, App Engine'de kalmanız veya uygulamanızı Cloud Run için kapsüllemeniz daha iyi olur.

Ana işleyici işlev imzasını güncelleme

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

  1. Uygulama Cloud Function'a dönüştürüldükten sonra Flask kullanılmaz. Bu nedenle, rota dekoratörlerini kaldırın.
  2. Cloud Functions, Flask Request nesnesini otomatik olarak parametre olarak iletir. Bu nedenle, nesne için bir değişken oluşturun. Örnek uygulamamızda buna request adını vereceğiz.
  3. Dağıtılan Cloud Functions işlevleri adlandırılmalıdır. Ana işleyicimiz, ne olduğunu (kök uygulama işleyicisi) açıklamak için App Engine'de uygun şekilde root() olarak adlandırıldı. Cloud Functions 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 da bu adı kullanın. Benzer şekilde, 4. ve 5. modüllerde Cloud Run hizmetine de visitme adını verdik.

Bu güncellemelerden önce ve sonraki görünümü aşağıda bulabilirsiniz:

ÖNCESİ:

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

SONRASI:

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)

Gerekli tüm güncellemeler tamamlandı. Yapılan değişikliklerin yalnızca uygulamanın "altyapı" kodunu etkilediğini unutmayın. Temel uygulama kodunda herhangi bir değişiklik yapılması gerekmez ve uygulamanın işlevselliğinde herhangi bir değişiklik yapılmaz. Bu noktayı açıklamak için yapılan değişikliklerin resimli gösterimini aşağıda bulabilirsiniz:

668f30e3865b27a9.png

Yerel geliştirme ve test

App Engine'de dev_appserver.py yerel geliştirme sunucusu bulunurken Cloud Functions'da Functions Framework bulunur. Bu çerçeveyle yerel olarak geliştirme ve test yapabilirsiniz. Kodunuz Cloud Functions'a dağıtılabileceği gibi Compute Engine, Cloud Run gibi diğer işlem platformlarına veya hatta Knative'i destekleyen şirket içi ya da karma bulut sistemlerine de dağıtılabilir. Functions Framework ile ilgili ek bağlantılar için aşağıya bakın.

6. Derleme ve dağıtma

Cloud Functions'a dağıtma işlemi App Engine'e dağıtma işleminden biraz farklıdır. requirements.txt dışında yapılandırma dosyası kullanılmadığından komut satırında kod hakkında daha fazla bilgi belirtilmelidir. Python 3.10 altında çalışan yeni HTTP tetiklemeli Cloud Functions işlevinizi şu komutla dağıtın:

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

Aşağıdakine benzer bir çıktı 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 çıktısındaki URL'yi kullanarak uygulamanızı ziyaret edin. URL şu biçimdedir: REGION-PROJECT_ID.cloudfunctions.net/visitme. Çıkış, daha önce App Engine'e dağıttığınız zamankiyle aynı olmalıdır:

2732ae9218f011a2.png

Serideki diğer birçok codelab ve videoda olduğu gibi, temel uygulama işlevselliği değişmez. Amaç, bir modernizasyon tekniği uygulamak ve uygulamanın tam olarak eskisi gibi çalışmasını sağlamaktır. Ancak bu kez uygulama, daha yeni bir altyapı tarafından desteklenir. Örneğin, eski bir App Engine eski hizmetinden yerine geçen Cloud bağımsız ürününe geçiş yapma veya bu eğitimde olduğu gibi bir uygulamayı başka bir Google Cloud sunucusuz platformuna taşıma.

7. Özet/Temizleme

Bu küçük App Engine uygulamasını Cloud Function'a dönüştürdüğünüz için tebrik ederiz. Bir başka uygun kullanım alanı da büyük bir monolitik App Engine uygulamasını, her biri bir Cloud Function olacak şekilde bir dizi mikro hizmete ayırmaktır. Bu, daha modern bir geliştirme tekniğidir ve daha "tak ve çalıştır" bileşen (ör. "JAM yığını") stiliyle sonuçlanır. Bu yaklaşım, iki hedef olan karıştırma ve eşleştirme ile kodun yeniden kullanılmasına olanak tanır. Ancak bir diğer avantajı da bu mikro hizmetlerin zaman içinde hata ayıklanmaya devam etmesidir. Bu da genel olarak kararlı kod ve daha düşük bakım maliyetleri anlamına gelir.

Temizleme

Bu codelab'i tamamladıktan sonra faturalandırmayı önlemek için 2. Modül App Engine uygulamasını devre dışı bırakabilirsiniz (geçici veya kalıcı olarak). App Engine platformunda ücretsiz kota bulunur. Bu nedenle, kullanım katmanında kaldığınız sürece faturalandırılmazsınız. Aynı durum Datastore için de geçerlidir. Daha fazla bilgi için Cloud Datastore fiyatlandırma sayfasına bakın.

App Engine ve Cloud Functions gibi platformlara dağıtım yaparken küçük derleme ve depolama maliyetleri oluşur. Bazı bölgelerde Cloud Build ve Cloud Storage'ın kendi ücretsiz kotaları vardır. Derlemeler, bu kotanın bir kısmını kullanır. Özellikle bölgenizde ücretsiz katman yoksa olası maliyetleri en aza indirmek için depolama alanı kullanımınıza dikkat edin.

Cloud Functions'da maalesef "devre dışı bırakma" özelliği yoktur. Kodunuzu yedekleyin ve işlevi silin. Daha sonra aynı adla yeniden dağıtabilirsiniz. Ancak başka bir taşıma codelab'i ile devam etmeyecek ve her şeyi tamamen silmek istiyorsanız Cloud projelerinizi kapatın.

Sonraki adımlar

Bu eğitimin yanı sıra, Cloud Run için App Engine uygulamanızı kapsayıcıya dönüştürme gibi diğer taşıma modüllerine de göz atabilirsiniz. 4. ve 5. modül codelab'lerinin bağlantılarını inceleyin:

  • 4. Modül: Docker ile Cloud Run'a taşıma
  • Uygulamanızı Docker ile Cloud Run'da çalışacak şekilde container'a dönüştürme
  • Bu taşıma işlemi, Python 2'de kalmanıza olanak tanır.
  • 5. Modül: Cloud Buildpacks ile Cloud Run'a taşıma
  • Cloud Buildpacks ile Cloud Run'da çalışacak şekilde uygulamanızı container'a dönüştürme
  • Docker, container'lar veya Dockerfile'ler hakkında hiçbir şey bilmeniz gerekmez.
  • Uygulamanızın Python 3'e taşınmış olması gerekir (Buildpacks, Python 2'yi desteklemez).

Diğer modüllerin çoğu, geliştiricilere App Engine paketlenmiş hizmetlerinden Cloud'un bağımsız alternatiflerine nasıl geçileceğini göstermeye odaklanır:

  • 2. Modül: App Engine ndb'den Cloud NDB'ye taşıma
  • 7-9. modüller: App Engine görev sırası push görevlerinden Cloud Tasks'e geçiş
  • 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ş

Kapsülleme, özellikle CI/CD (sürekli entegrasyon/sürekli teslimat veya dağıtım) ardışık düzeninden oluşuyorsa uygulama geliştirme iş akışınızın bir parçası haline geldiyse Cloud Functions yerine Cloud Run'a geçmeyi düşünebilirsiniz. Uygulamanızı Docker ile kapsüllemek için 4. Modül'e, kapsülleme işlemini kapsayıcılar, Docker bilgisi veya Dockerfile olmadan yapmak için 5. Modül'e bakın. Cloud Functions veya Cloud Run'ı değerlendirirken başka bir sunucusuz platforma geçiş yapmak 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 değerlendirmenizi ö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.

8. Ek kaynaklar

App Engine taşıma modülüyle ilgili codelab sorunları/geri bildirimleri

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 3

2. Modül

code

Modül 11

code

Online kaynaklar

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

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.